C++检查2d向量是否碰到障碍物

问题描述:

我正在构建在线游戏的服务器端(!),我需要检查子弹是否碰到目标。C++检查2d向量是否碰到障碍物

客户端发送给我的是子弹的位置和角度,我知道所有敌人的坐标和大小。子弹射击后如何计算子弹是否击中敌人?敌人有不同的大小,子弹是1px大小。

例如,我有0,0坐标45度的玩家拍摄角度,以及10个宽度,15高度的200,200坐标的敌人。我如何计算子弹击中敌人?

更新:该游戏是从顶部2d射手,像Crimsonland。射弹的起步速度缓慢下降。

+0

我没有读过任何东西,但我确信有关于该问题的完整书籍 – user463035818

+0

简而言之:对于每个物体,您需要检查它在什么位置会击中子弹。首先击中子弹的物体是真正击中它的物体。为了避免对每个对象进行计算,可以使用边界框来非常快速地检测非碰撞 – user463035818

+3

射弹是如何建模的?瞬间[hitscan](https://en.wikipedia.org/wiki/Hitscan)?有限速度?这是自上而下的吗?与重力的侧视图?现在你在“不清楚你问的问题”和“太宽泛”之间徘徊。 – genpfault

您应该看一下the power of a point。 它可以让你知道线和点之间的最小距离。 因此,如果距离低于目标的宽度,这是一个命中!

最简单的方法是检查子弹是否在敌人的矩形内。如果是,处置子弹和敌人。

基本上是:

while(game.is_on()){ 
    for(enemy = enemyCollection.begin(); enemy != enemyCollection.end(); ++enemy){ 
     if(enemy.contains(bullet)){ 
      enemy.dead(); 
      bullet.hit(); 
    } 
} 
+0

似乎是最好的解决方案,但如果我需要检查哪个敌人方被子弹击中?例如,如果子弹从后面击中,这是从面部撞击的另一种类型的伤害。 – MurDaD

+0

如果外环的时间步长足够小,那么在敌方的四边中,靠近子弹的那一个是第一个是命中方。存在一些其他的极限情况,但它真的归结为在if内执行'enemy.dead()'和'bullet.hit()'的不同事情。 – bracco23

如果您需要检查线路是否相交的矩形,然后基于跨产品应用方位的测试 - 如果跨产品的标志是所有矩形的顶点是相同的 - 线不交叉处, 。

线L0,L1,点P

Orientation = Cross(P - L0, L1 - L0) 

(而不是L1-L0组件可以使用的Cos(FI)和仙拍摄角度(FI))

如果你需要得到交叉点,使用line clipping的一些算法 - 例如Liang-Barsky one。

它看起来不那么容易。要获得完整的解决方案,您需要沿着旅行路线挤出物体。然后你反对对象相交测试。

这很难,因为任意路径的任意形状的挤压都很难。因此,稍微欺骗一下会更容易。子弹可以没有区域,所以它们只是线段。确保步长足够低,线段相对较短。然后用相对较短的线再次制作船的矩形。现在,它有很多短线路交会测试。您可以使用planesweep算法快速完成这些任务。 planeweep的好处在于,您还可以将其扩展为曲线或形状,方法是返回可能的交点而不是实际的交点。

一旦你有一个子弹和船的碰撞矩形的交集,你可能需要运行一个时间步来检查实际发生的命中,而不是一个狭窄的未命中。您也可以确定该点击是在前面,左边,右边还是后面。