射击敌人,如何计算射弹的下一个位置

时间:2011-11-05 19:56:00

标签: c# xna

我拥有一个位置为Vector2的塔,当我足够接近时会射击目标。抛射物应该继承塔的位置,因为它的起始位置然后它会得到一个目标Vector2,它可以被击中。

当射弹知道它自己的位置和目标位置加上速度时,我需要在每次更新时计算新位置吗?

2 个答案:

答案 0 :(得分:3)

如果你有目标和原点,那么只需做目标 - 原点就会给你一个新的Vector2就是方向。然后,您需要对此方向向量进行标准化,并将其乘以抛射速度。

伪代码:

Vector2 target = objectToShootAt.position();
Vector2 origin = tower.position();
Vector2 direction = target - origin;

direction.normalize(); // or direction *= 1/direction.length()
direction *= speed;

然后只需使用方向并将其乘以帧之间的时间,并将其添加到项目符号位置。

编辑:跟进乔治的评论 如果目标正在移动,我显示的伪代码将总是错过目标,因为它假设子弹不能弯曲并且没有考虑目标速度。如果子弹曲线,正如乔治所说,你需要重新计算每帧的方向向量。

要有一个非弯曲的子弹,但考虑到目标的速度,你需要预测目标的位置,这是通过根据目标的当前航向,速度和时间来估算目标的位置来完成的。让子弹到达那里。

答案 1 :(得分:0)

也许更容易逐帧更新子弹,但是我试图解决从塔到敌人预期位置的线方程。

  Equation from Enemy => Target = EnemyOrigin + EnemyDirection.Normalized * EnemySpeed * Time;

  Equation from Tower => Target = TowerOrigin + BulletDirection.Normalized * BulletSpeed * Time;

  Target = EO + ED * ES * T, Target = TO + BD * BS *T =>

                                               (EO - TO) + ED * ES * T 
=> EO + ED * ES * T = TO + BD * BS * T => BD = -----------------------
                                                        BS * T

现在我们不知道时间,但我们可以近似它,(子弹相对于距离会有不同的速度):

Time = |(EnemyOrigen - TowerOrigen) / BulletSpeed| = |(EO - TO) / BS|;

         (EO  - TO )+ ED * ES * (EO - TO) / BS
=> BD = ---------------------------------------- =>   (+-1) * (One + (ED * ES) / BS);
                 BS * (EO - TO) / BS

现在我们知道BulletDirection,BulletOrigen和飞行时间,我们只需要插值

BulletPos = TowerOrigin + BulletDirectionNormalized * BulletSpeed * TimeElapsedFromShot;

我没有测试过它,它可能不是一个好的解决方案......但只是为了展示其他替代方案......;)