2016-04-24 33 views
-3

我正在製作一個簡單的遊戲,它將有一艘太空飛船被屏幕中心的星星引力吸引。我迄今爲止的代碼以一種並不平滑的方式移動矩形(很快成爲火箭)。矩形在到達恆星時也不會停止,而是在返回之前保持超越恆星。Java中的行星萬有引力

這裏是我的代碼:

public void move() { 
    // Deals with gravity towards the center star 

    if (x > game.getWidth()/2) { 
     xVel -= xa; 
    } 
    if (x < game.getWidth()/2) { 
     xVel += xa; 
    } 
    if (y > game.getHeight()/2) { 
     yVel -= ya; 
    } 
    if (y < game.getHeight()/2) { 
     yVel += ya; 
    } 

    x += xVel; 
    y += yVel; 
} 

我通過計算在火箭位於相對於中心的屏幕上開始,然後改變其加速度值Xa和Ya,根據需要。然後將加速度值添加到Velocity變量xVel和yVel。

+3

感謝您的信息...你的問題是? – pczeus

+0

除非添加*碰撞檢測*,否則受重力吸引的任何物體將繼續移動經過重心,然後再從現在位於物體後面的重力的拉力中減速。這就是重力如何工作。 – Andreas

回答

0

你還沒有提供所有的代碼,但對我來說,這聽起來像你正在使用整數,你應該使用浮動或雙打。

如果decalre的變量,如以下

int x; 
int velX; 

,你不會得到精度需要流暢的動畫(有句號之後沒有)。整數5/2 == 2而不是整數2.5只能存儲整數。這就是爲什麼你會變得生硬。

您需要使用浮點變量來轉換它們。

float x = 0.0f; 
float vecX; 

double x = 0.0; 
double vecX; 

這將會給你你想要的平滑運動。

1

很明顯,你通過

yVel += ya; 

等改變速度,因爲它從你的措辭,似乎那是一個可以接受的東西給你。但是,這將創造一個不斷提高的速度(即最終飛行)。

如果你想保持變速恆你做

if (x > game.getWidth()/2) { 
    xVel = -xa; 
} 

if (x < game.getWidth()/2) { 
    xVel = xa; 
} 

和等效。這將有可能在中心附近的矩形oscilate。請更新並提出新問題。

1

你的宇宙飛船的運動看起來並不平坦,因爲它正在不顧時間而移動。如果在後臺打開一個CPU密集型應用程序,並且Java進程獲得的計算時間更少,會發生什麼情況?現在你不會經常打電話move(),所以你的飛船突然減速。

您需要跟蹤自上次致電move()以來經過了多長時間 - 我確定您還記得高中物理公式distance = velocity * time。有多種方式可以獲得時間 - see here專門針對遊戲進行討論。

這會使運動變得平滑一些,但是如果您希望運動看起來像重力,那麼您不能僅僅使用速度 - 您還需要考慮加速度。你的太空飛船由於它的重力,向着明星加速加速。你的飛船越接近恆星,重力加速度就越強。這是另一種高中物理學公式,你應該可以在網上找到。

+0

對於加速對象,時間*速度將無法正常工作,尤其是在涉及到第二個積分的情況下。你不能隨速度乘以速度,當速度由於加速度而隨時間改變時,以及由於加速度也隨着時間的推移而變化,唯一的選擇是做所有的數學(很多數學)。對於這種類型的SIM卡,您可以使用verlet集成,或者以離散的時間步長運行並接受最小化的錯誤。使用幀時間會導致不確定和不可管理的錯誤。雖然我很懷疑幀率是問題。 – Blindman67