2009-11-22 66 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。

我希望这会有所帮助。