C 检查2D矢量是否遇到了障碍

C++ check if 2d vector hit an obstacle

本文关键字:遇到 是否 检查 2D      更新时间:2023-10-16

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

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

例如,我的播放器射击角度为45度,0坐标为45度,而敌人的敌人为200、200坐标,宽度为10宽,高15。我该如何计算子弹击中敌人?

更新:游戏是从顶部(例如Crimsonland)的2D Dhooter。弹丸的启动速度降低了。

您应该瞥一眼一个点的力量。它将使您知道线和点之间的最小距离。因此,如果距离低于目标宽度,则是命中!

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

基本上:

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)

(您可以使用COS(FI)和SIN(FI)而不是L1-L0组件)

如果您需要获得交叉点,请使用一些算法进行剪裁 - 例如,Liang -Barsky One。

它看起来并不那么容易。为了获得完整的解决方案,您需要沿着旅行路径挤出物体。然后,您会反对反对交叉测试。

这很困难,因为通过任意路径对任意形状的挤出很难。因此,作弊更容易。子弹没有区域,所以它们只是线段。确保步长足够低,以使线段相对较短。然后以相对较短的线条再次制作船只矩形。现在,这是线索交叉测试的短线。您可以使用Planes -Weep算法快速执行这些操作。关于飞机扫球的好处是,您还可以通过返回可能的交叉点而不是实际的交叉点来将其扩展到曲线或形状。

一旦您在子弹和船舶的碰撞矩形之间有一个相交后,您可能需要运行时间步长以检查命中实际上是发生的,而不是狭窄的错过。您还可以确定命中是在此时的前面,左,右还是背面。