2009-11-22 64 views
3

我正在用javascript/html5編寫一個簡單的遊戲,並試圖實現「重力」。'Gravity'在Javascript/HTML5遊戲中無法正常工作

我的代碼是有點像這樣:

gravity = 4; 
acceleration = 1.1; 

function gameLoop() { 

    gravity = gravity*acceleration; 

    if (characterPositionY < 600) 
    characterPositionY = characterPositionY + gravity; 

    setTimeout(gameLoop,1000/30); 
} 

數字「600」的畫面是底部,「地」,如果你願意,玩家應該停止下跌。

不幸的是,由於重力使角色在每個循環週期內至少下降4個像素(並且增加)......角色往往會停止過去,或者在地面之前停止。像這樣,例如:

[1] characterPositionY是590

-add 4-

[2] characterPositionY是594

-add 4-

[3] characterPositionY是598

-add 4-

[4] char acterPositionY是602

...過去的地面。

我以前從來沒有真正做過任何遊戲,我只是隨着我的進展而全力以赴。有可能有更好的方法去做這件事。

+1

你的物理公式是錯誤的。簡化一下,重力是一個恆定的向下的力,因此在每個時間步增加速度的不斷增加。因此,該公式應該讀取更多類似於「downward_speed + = gravity_acceleration」的內容。 gravity_acceleration每秒大約10米 - 將每步時間轉換爲像素的比例是由您決定的。 – Kylotan 2009-11-23 11:14:09

回答

5

測試更改爲類似:

if (characterPositionY + gravity < 600) 
    characterPositionY = characterPositionY + gravity; 
else 
    characterPositionY = 600; 
+1

你也可以使用min函數:characterPositionY = min(characterPositionY + gravity,600); 它在CPU上佔用更少的代碼和更少的操作。 – mattbasta 2009-11-22 15:28:05

0
function gameLoop(){ 

    gravity = gravity*acceleration; 

    if (characterPositionY < 600-gravity) 
    characterPositionY = characterPositionY + gravity; 

    setTimeout(gameLoop,1000/30); 

} 

也許這樣做會有幫助嗎?

0
if (characterPositionY < 600) { 
    characterPositionY = characterPositionY + gravity; 
    if (characterPositionY > 600) characterPositionY = 600; 
} 
0
gravity = 0; /* rate of change of position due to grav*/ 
acceleration = .4; /* rate of change of grav*/ 


function gameLoop(){ 

    if (characterPositionY < 600)/* above ground*/ 
    { 
    gravity = gravity + acceleration; /*increase speed of drop*/ 
    characterPositionY = characterPositionY + gravity; /*apply speed to position*/ 
    } 
    if (characterPositionY >= 600)/*at or below ground*/ 
    { 
    characterPositionY = 600; /*set on ground if character has 'clipped' through*/ 
    gravity = 0; /*touching the ground has stopped Y movement due to gravity*/ 
    } 

    setTimeout(gameLoop,1000/30); 

} 

重力VAR真正代表重力的爲Y運動的貢獻。考慮將其重命名爲fallSpeed。

此外,請注意var,加速度爲增加了重力。這更準確地表示恆定的加速度。您也可以考慮將加速重命名爲gravAcceleration。

我希望這會有所幫助。