2011-11-05 109 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;

我沒有測試它,它可能不是一個很好的解決方案..但只是爲了表明其他替代...;)

相關問題