2016-01-13 55 views
1

我最近開始用java編程。我來自C#/ XNA背景,我已經有遊戲開發經驗。 但是我在我的java遊戲中遇到問題。我有一個彈跳腳本,它使得遊戲中的「粒子」在與固體表面(如地面)碰撞時發生反彈。 以下是管理彈跳的代碼片段。Java反彈物理學:永無止境的反彈

private final void respondY(Rectangle r) 
{ 
    if(!r.intersects(getBounds())) // If not colliding, return 
     return; 

    if(Yvel > 0) // If falling... 
    { 
     if(r.y < Y + Height) //Another collision test 
     { 
      Y = r.y - Height; // Set Y to top of object 
      Yvel *= -bounce; // Bounce (Here is the problem) 
      onFloor = true; 
     } 
    } 
    else if(Yvel < 0) // If hit ceiling 
    { 
     if(Y < r.y + r.height) // Collision test 
     { 
      Y = r.y + r.height; // Set Y to bottom of object 
      Yvel = 0; // No bouncing here 
     } 
    } 
} 

的問題是,在地板上的物體反彈,因爲它應該,但經過一段時間的物體在那裏我希望它停止跳動時,它得到的是恆定的高度相同的高度不斷反彈之後。

注:

  • Yvel是一個INT作爲對象

  • 彈跳的垂直速度是控制對象如何「有彈性的」是一個浮子。例如0.5意味着它彈回一半高,因爲它下跌

在此先感謝!請注意,這是我的第一篇文章,所以如果我犯了錯誤,請以建設性的方式指出它們。

回答

1

float(和double)類型是不精確的。這在處理非常小的數字時尤其會引發問題 - 事實上,有一個最小的可表示數量和可表示的有限數量的可能數字(有點像量子物理學)。 float存儲的數字實際上是可能表示計算結果的最接近的數字。

發生什麼事情是速度計算永遠不會達到零,因爲乘以最小數字float的結果可以用值> = .5表示。

我會放一個低門檻的計算結果是迫使零:

Yvel = Yvel * -bounce; 
if (Yvel < .000001F) 
    Yvel = 0; 
+0

感謝您的及時答覆,但是當我嘗試這樣做,但問題仍然存在。 'if(Yvel <0)'線阻止物體彈跳,如果移除物體仍然在同一高度彈跳。將.0001f更改爲像.01f這樣較大的東西可以使常量反彈高度更小,但它仍然存在...也許可以使用Math.round()完成某些操作... – JamesEpicGuru

+0

編輯:我沒有在您的答案中看到您的編輯當我寫最後一條評論時,我正在嘗試檢測一個對象是否反覆彈跳到相同的高度,如果是這樣,則在對象撞擊地面時停止。 – JamesEpicGuru