2016-07-23 15 views
0

我有一個2D側視射擊遊戲,我需要一些新的眼睛。我目前正在研究瞄準,部分工作原理:炮口速度是已知的,重力是已知的,x,y到目標的距離也是已知的。利用各種資源都在這裏對SE和維基百科,我想出以下方法計算初始載體爲彈丸速度:重寫,使Math.atan()工作不管方向

public Vector2 calculateAim(Vector2 pos, Unit target) { 
    // Check if previous calculation can be recycled 
    if (target.equals(lastTarget)) 
     return lastAim.cpy(); 
    lastTarget = target; 

    double v = RifleBullet.projectileSpeed; // Muzzle velocity 
    double g = Settings.gravity.y;   // Gravity, positive value 
    double x = offset.x;     // x distance to target. Negative if towards left 
    double y = offset.y;     // y distance to target. Negative if lower 

    double theta = Math.atan(((v * v) - Math.sqrt((v*v*v*v) - (g*(g*(x*x) + 2*y*(v*v)))))/(g * x)); 

    Vector2 aim = new Vector2(-(float)Math.cos(theta), (float)Math.sin(theta)); 
    aim.nor(); 
    aim.scl((float)RifleBullet.projectileSpeed); 
    lastAim = aim.cpy(); 
    return aim; 
} 

上述部分作品:最右邊的傢伙會正確地瞄準。然而,站在左邊的那個人總是朝錯誤的方向射擊。它看起來像Y組件是正確的,但X組件很簡單地顛倒過來。如果我計算THETA後補充一點:

if (side.contains("left")) 
    angleInRadians += Math.PI; 

...他們都火正確,但它不是從長遠來看是會出現在戰場上更多的單位可行的,並且它勢必會造成問題,當我得到到那一點。

我相信問題的根源可能是Math.atan()函數,因爲我沒有檢查三角函數計算中的假設三角形是如何定向的。

我應該如何改進我的方法,使其能夠正常工作,無論誰的左/右/上/下?

+4

閱讀atan2。 – Tenfour04

回答

3

Tenfour04說的非常有幫助。您可能要使用Math.atan2(y,x)而不是Math.atan(y/x)

請注意,您不要自己進行分割,而應將y和x作爲單獨的參數。這是atan2知道5/2和-5/-2之間的區別。以正常的阿坦,他們都看起來像2.5

+0

像魅力一樣工作,感謝您解釋爲什麼! – Jarmund

+0

很高興幫助! – Davis