2013-09-26 128 views
0

請看下面的代碼... 球彈得像一個普通的球,但然後球停止,然後沉沒的圖形用戶界面。關於這段代碼可能出錯的想法?彈跳球重力

public void verticalBounce(Container container) { 
     deltaY = deltaY - gravity; 
     y = y + deltaY; 

     if (y >= getHeight()) { 
      deltaY = -deltaY; 
      deltaY = (int) (deltaY * 0.9); 
      y -= -deltaY; 
     } 
    } 
+1

也許問題出在這行'y - = --deltaY;'你不打算再給delta添加deltaY,但這就是你正在做的。 'y = y + deltaY' – Kon

+0

也試過。仍然停下來,然後下沉 – PrgmRNoob

+0

我會想,一旦膽穿過可視區域的高度,您將不得不1-85反轉三角洲,2-重置對象的位置。所以'deltaY * = -1'和'y = getHeight()'或者類似的東西......假設你想讓球打滑...... – MadProgrammer

回答

1

我將使用y'表示,在對前一時間片的結束位置這個時間片和y結束y位置,嚴格便於標籤。這使你的代碼的第三行:

y' = y + deltaY; 

讓我們考慮其中y'嚴格大於getHeight()大的情況下。 (他們是平等將結束的情況下,被佔了自動,你會看到下圖)的情況下快速繪圖會是這樣的:當前的時間片期間

  _ o - y 
      | o 
      | o 
----------|--------------------- getHeight() 
      | O 
deltaY - | O 
      | O 
      |_ O - y' 

在某些時候,球擊中地板(在getHeight())。對於當前時間片的剩餘部分,我們通過量衝出地面:

y' - getHeight() 

我們需要這個餘數是當前時間片內球向上反彈的量。在當前時間片結束的實際y位置(忽略你的彈性係數的時刻)是這樣的:

     _ O - y'' 
    _ o - y  | O 
    | o   | O 
    | o   | O 
-------------------------------- getHeight() 

現在,y''getHeight()減去我們衝出地面的量,這我們上面計算:

y'' = getHeight() - (y' - getHeight()); 

(你也許會改變這2*getHeight() - y',但撐到我們到達終點。)

現在,我們很快就會拉我們早期的版本被忽視的情況下其中y' == getHeight()。正如你所看到的,y' - getHeight()變爲零,就像我們需要的一樣,保留y'' == getHeight(),所以在這種情況下沒有額外的工作要做。

好,所以我們現在需要做的就是照顧彈性常數(我認爲這是0.9因子的作用,以便隨着時間的推移衰退)。我們要適用於deltaY爲你做了,但我們還需要將其應用到當前的時間片的反彈,因爲它擊中地面:

y'' = getHeight() - 0.9*(y' - getHeight()); 

因爲我們還沒有混合yy'以及與任何我們可以簡單地取代所有這些計算的右手邊y''通過y給我們最終的if條款(僅最後一行已經改變):

if (y >= getHeight()) { 
     deltaY = -deltaY; 
     deltaY = (int) (deltaY * 0.9); 
     y = getHeight() - 0.9*(y - getHeight()); 
    } 

我敢肯定如果你畫出你以前的解決方案,你會看到在哪裏ey出錯了。另外,使用int作爲deltaY似乎是在尋求麻煩。我寧願使用花車來進行所有的計算,然後只在繪圖時才使用花車。你會注意到我還沒有對上面的y的結果進行任何鑄造,這可能是必要的,這取決於y的類型。