C++检查2d向量是否碰到障碍物
我正在构建在线游戏的服务器端(!),我需要检查子弹是否碰到目标。C++检查2d向量是否碰到障碍物
客户端发送给我的是子弹的位置和角度,我知道所有敌人的坐标和大小。子弹射击后如何计算子弹是否击中敌人?敌人有不同的大小,子弹是1px大小。
例如,我有0,0坐标45度的玩家拍摄角度,以及10个宽度,15高度的200,200坐标的敌人。我如何计算子弹击中敌人?
更新:该游戏是从顶部2d射手,像Crimsonland。射弹的起步速度缓慢下降。
最简单的方法是检查子弹是否在敌人的矩形内。如果是,处置子弹和敌人。
基本上是:
while(game.is_on()){
for(enemy = enemyCollection.begin(); enemy != enemyCollection.end(); ++enemy){
if(enemy.contains(bullet)){
enemy.dead();
bullet.hit();
}
}
如果您需要检查线路是否相交的矩形,然后基于跨产品应用方位的测试 - 如果跨产品的标志是所有矩形的顶点是相同的 - 线不交叉处, 。
线L0,L1,点P
Orientation = Cross(P - L0, L1 - L0)
(而不是L1-L0组件可以使用的Cos(FI)和仙拍摄角度(FI))
如果你需要得到交叉点,使用line clipping的一些算法 - 例如Liang-Barsky one。
它看起来不那么容易。要获得完整的解决方案,您需要沿着旅行路线挤出物体。然后你反对对象相交测试。
这很难,因为任意路径的任意形状的挤压都很难。因此,稍微欺骗一下会更容易。子弹可以没有区域,所以它们只是线段。确保步长足够低,线段相对较短。然后用相对较短的线再次制作船的矩形。现在,它有很多短线路交会测试。您可以使用planesweep算法快速完成这些任务。 planeweep的好处在于,您还可以将其扩展为曲线或形状,方法是返回可能的交点而不是实际的交点。
一旦你有一个子弹和船的碰撞矩形的交集,你可能需要运行一个时间步来检查实际发生的命中,而不是一个狭窄的未命中。您也可以确定该点击是在前面,左边,右边还是后面。
我没有读过任何东西,但我确信有关于该问题的完整书籍 – user463035818
简而言之:对于每个物体,您需要检查它在什么位置会击中子弹。首先击中子弹的物体是真正击中它的物体。为了避免对每个对象进行计算,可以使用边界框来非常快速地检测非碰撞 – user463035818
射弹是如何建模的?瞬间[hitscan](https://en.wikipedia.org/wiki/Hitscan)?有限速度?这是自上而下的吗?与重力的侧视图?现在你在“不清楚你问的问题”和“太宽泛”之间徘徊。 – genpfault