我將使用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());
因爲我們還沒有混合y
,y'
以及與任何我們可以簡單地取代所有這些計算的右手邊y''
通過y
給我們最終的if
條款(僅最後一行已經改變):
if (y >= getHeight()) {
deltaY = -deltaY;
deltaY = (int) (deltaY * 0.9);
y = getHeight() - 0.9*(y - getHeight());
}
我敢肯定如果你畫出你以前的解決方案,你會看到在哪裏ey出錯了。另外,使用int作爲deltaY似乎是在尋求麻煩。我寧願使用花車來進行所有的計算,然後只在繪圖時才使用花車。你會注意到我還沒有對上面的y
的結果進行任何鑄造,這可能是必要的,這取決於y
的類型。
也許問題出在這行'y - = --deltaY;'你不打算再給delta添加deltaY,但這就是你正在做的。 'y = y + deltaY' – Kon
也試過。仍然停下來,然後下沉 – PrgmRNoob
我會想,一旦膽穿過可視區域的高度,您將不得不1-85反轉三角洲,2-重置對象的位置。所以'deltaY * = -1'和'y = getHeight()'或者類似的東西......假設你想讓球打滑...... – MadProgrammer