2011-11-05 64 views
1

我有一个塔位置为Vector2,当我足够近时射击一个目标。射弹应该继续塔的位置,因为它的起始位置,然后它得到一个目标Vector2,这是目标。射击敌人,如何计算弹丸的下一个位置

当我知道自己的位置和目标位置加上速度时,我需要在每次更新中计算新位置时如何计算这个值?

回答

4

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

伪代码:

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

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

然后,只需使用方向与由帧之间的时间相乘,并且将其添加到子弹的位置。

编辑:跟进乔治的评论 中的伪我发现总是会错过目标,如果目标移动,因为它假定子弹不能弯曲并且不考虑目标速度。如果乔治说,子弹曲线,你需要重新计算每一帧的方向向量。

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

+0

既然他提到,他知道目标位置加上速度,这是值得一提的是你需要重新计算每帧(因为目标会移动),或者做一些稍微复杂的数学来计算影响时间并相应地调整目标方向。 –

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 

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

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;

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