在Javascript/HTML5游戏中,“重力”无法正常工作

3

我正在使用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

-添加4-

[2] characterPositionY为594

-添加4-

[3] characterPositionY为598

-添加4-

[4] characterPositionY为602

...超过了地面。

我以前从未制作过任何游戏,我只是随心所欲地进行创作。可能有更好的方法来处理这个问题。


1
你的物理公式是错误的。简单来说,重力是一个恒定的向下力,因此在每个时间步长中会增加一个恒定的速度增量。因此,方程应该更像是“downward_speed += gravity_acceleration”。gravity_acceleration大约为10米/秒 - 将其转换为每个时间步长的像素取决于你。 - Kylotan
4个回答

5

将您的测试更改为以下内容:

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

1
你也可以使用min函数:characterPositionY = min(characterPositionY + gravity, 600);这样可以减少代码量和CPU的操作。 - mattbasta

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);

}

gravity变量实际上代表了重力对Y轴运动的贡献。考虑将其重命名为类似于fallSpeed的名称。

此外,请注意,变量acceleration是添加到重力中的。这更准确地表示了恒定加速度。您还可以考虑将加速度重命名为gravAcceleration。

希望这可以帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接