C++ C++;检查2d矢量是否击中障碍物

C++ C++;检查2d矢量是否击中障碍物,c++,math,collision-detection,game-physics,C++,Math,Collision Detection,Game Physics,我正在为在线游戏构建服务器端(!),我需要检查子弹是否击中目标 客户发给我子弹发射的位置和角度,我知道所有敌人的坐标和大小。我如何计算子弹发射后是否击中敌人?敌人有不同的尺寸,子弹是1倍大小 例如,我的玩家射击角度为45度,从0,0坐标,和一个敌人在200,200坐标,10宽,15高。我怎么计算那颗子弹击中了敌人 更新:游戏是从顶部开始的2d游戏,就像《克里姆森兰》。射弹的起始速度会缓慢降低。你应该看一下。 它将允许您知道直线和点之间的最小距离。 因此,如果距离小于目标的宽度,则为命中 最简单的

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

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

例如,我的玩家射击角度为45度,从0,0坐标,和一个敌人在200,200坐标,10宽,15高。我怎么计算那颗子弹击中了敌人


更新:游戏是从顶部开始的2d游戏,就像《克里姆森兰》。射弹的起始速度会缓慢降低。

你应该看一下。 它将允许您知道直线和点之间的最小距离。
因此,如果距离小于目标的宽度,则为命中

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

基本上:

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。

这并不像看上去那么简单。要获得完整的解决方案,需要沿对象的移动路径拉伸对象。然后进行对象到对象的相交测试

这是困难的,因为通过任意路径挤出任意形状是困难的。所以更容易作弊。项目符号可以没有区域,所以它们只是线段。确保步长足够小,以使线段相对较短。然后把船做成长方形,同样用相对较短的线条。现在有很多短线对线的交叉测试。您可以使用planesweep算法快速执行这些操作。planesweep的好处在于,您还可以通过返回可能的交点而不是实际交点,将其扩展到曲线或形状


一旦子弹与船舶碰撞矩形相交,您可能需要运行一个时间步来检查是否确实发生了命中,而不是一次小的未命中。你也可以确定在这一点上击中的是正面、左边、右边还是背面。

我没有读过任何书,但我确信有关于这个问题的完整书籍简而言之:对于每个物体,你需要检查它会在什么位置击中子弹。首先击中子弹的物体就是真正击中它的物体。为了避免对每个对象进行计算,您可以使用允许快速检测非碰撞的边界框投射物是如何建模的?瞬间的有限速度?这是自上而下的吗?重力侧视图?现在你正徘徊在“不清楚你在问什么”和“太宽泛”之间。@genpfault question updated似乎是最好的解决方案,但如果我需要检查哪一方被子弹击中了呢?例如,如果子弹从后面击中,这是另一种类型的伤害,如果它从面部击中。如果外环的时间步长足够小,在敌人的四面中,靠近子弹的一侧是第一个是击中的一侧。还有一些其他的极限情况存在,但它实际上可以归结为在if中执行不同的操作,即
敌方.dead()
bullet.hit()