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

时间:2017-09-26 14:16:18

标签: c++ math collision-detection game-physics

我正在为在线游戏构建服务器端(!),我需要检查子弹是否击中目标。

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

例如,我的玩家从0,0坐标开始拍摄45度角,在200,200坐标上有10个宽度,15个高度的敌人。我怎么计算那颗子弹击中了敌人?

更新:游戏从顶部开始是2d dhooter,就像Crimsonland一样。弹丸的起始速度会缓慢下降。

4 个答案:

答案 0 :(得分:1)

你应该看一眼the power of a point。 它将让您知道线和点之间的最小距离。 因此,如果距离低于目标的宽度,它就会受到影响!

答案 1 :(得分:1)

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

基本上是:

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

答案 2 :(得分:1)

如果需要检查线是否与矩形相交,则应用基于叉积的方向测试 - 如果所有矩形顶点的叉积符号相同 - 则线不与它相交。

线L0-L1,点P

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

(而不是L1-L0组件,你可以使用射击角度的Cos(Fi)和Sin(Fi))

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

答案 3 :(得分:1)

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

这很困难,因为通过任意路径挤出任意形状很难。所以更容易欺骗一点。子弹可以没有区域,因此它们只是线段。确保步长足够小,以使线段相对较短。然后用相对较短的线条制作船只矩形。现在有很多简短的线对线交叉测试。您可以使用planesweep算法快速完成这些操作。 planeweep的优点在于,您还可以通过返回可能的交叉点而不是实际的交叉点将其扩展为曲线或形状。

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