2013-07-11 58 views
0

我一直有一些麻煩,試圖讓子彈在我放入的角度發射。我正在使用eclipse和java。無法讓子彈以正確的角度拍攝?

我的代碼:

x += (int) (spd * Math.cos(dir)); 
y -= (int) (spd * Math.sin(dir));` 

喜歡它不工作的原因是感覺,因爲它是鑄造爲int這可能使得它如此不準確。但爲了繪製矩形,它需要整數。

當輸入dir爲0時,它很好,並向右移動。問題是當我投入90後,而不是直接射門,它向左射門。

有關如何解決這個問題的任何想法?謝謝!

回答

4

不,你犯了一個經典錯誤:Java trig函數需要弧度而不是度數。你不應該超過90歲;它是π /2.0。

所以一定要由π /180.0乘以角度以度轉換爲弧度。

對於C,C++,Java,JavaScript,C#和我所知道的其他所有語言都是如此。我無法命名使用角度的單個語言。

double radians = dir*Math.PI/180.0; 
x += (int)(spd*Math.cos(dir)); 
y -= (int) (spd * Math.sin(dir));` // I don't know why you do this. Funny left-handed coordinate system. 

速度是速度矢量的大小。寫成的等式只將速度表示爲(vx,vy)分量。

如果你想位移,你必須通過一個時間步長乘以:

vx = speed*Math.cos(angle); 
vy = speed*Math.sin(angle); 
dx = vx*dt; 
dy = vy*dt; 
x += dx; // movement in x-direction after dt time w/ constant velocity 
y += dy; // movement in y-direction after dt time w/ constant velocity 

如果有涉及(如重力)的加速度,你應該計算一段時間內的速度變化一樣。

+0

噢,那也是!完全錯過了那部分。 – Amadan

+0

我認爲這是問題的真正根源。 – duffymo

+0

好吧我真的不知道如何解釋發生了什麼,但我做到了這一點:dir = dir * Math.PI/2.0;但是,子彈似乎圍繞對方發生的事實真是奇怪。 – mkjrfan

3

將座標保持爲浮動,只在調用繪圖方法時投射它們(或將它們投射到另一個變量中)。您需要保留下一次迭代的精確值。

+0

嗯,我做的是我拿出(int)s並將其放入get方法中,但它仍然只在8-9個不同的方向射擊。 – mkjrfan

1

是的,你需要保持角度爲浮動。

但更有可能的是,你說你正在使用0和90. Math.cos()和Math.sin()取弧度值。如果你通過學位,你肯定會把事情朝錯誤的方向發展。度數轉換爲弧度,您的指示可能會好得多。

0

一個問題是,舍入誤差propogates當你增加xy每次迭代。一個posssible解決方案是基於一個計數器,而不是計算xy座標:

x = (int) (time * spd * Math.cos(dir)); 
y = (int) (time * spd * Math.sin(dir)); 

這裏我使用變量名time的櫃檯,以表明它是因爲這已經過去的時間量的一些措施子彈被擊中。