跳进游戏

时间:2012-04-01 00:39:21

标签: javascript math physics gravity

我正在制作一个2d侧卷轴,而对于我的生活,我无法跳上班。这就是我左右移动的方式:

for(var i = 0; i < time; i++)
     newVelocityX = (oldVelocityX + accelerationX) * frictionX;

然后更新我的球员位置

  

positionX = oldPositionX + newVelocityX;

这很好用,变量“time”只有自我上次运行函数以来的ms量。摩擦效果很好,我很高兴在X方向上都很好。这就是我在Y方向所拥有的:

for(var i = 0; i < time; i++) {
    accelerationY += gravityAccelerationY;
    newVelocityY = oldVelocityY + accelerationY;
}

物体由于重力下降很好。如果我在用户点击向上箭头时设置负加速度Y,那么我甚至可以让玩家跳跃,但是在快速计算机上他们跳得很高,而在旧计算机上他们跳得很低。我不知道如何解决这个问题,我以为我已经把它放在像我一样的循环中了。

1 个答案:

答案 0 :(得分:4)

您需要做几件事来改变代码才能正常工作。您发布的代码中存在大量错误/性能命中。

以下是一些用于完成游戏基础知识的代码。

跳跃的示例代码:

if (jump) {
    velocityY = -jumpHeightSquared; // assuming positive Y is downward, and you are jumping upward
}
velocityY += gravityAccelerationY * time;
positionY += velocityY * time;
if (positionY > 0) {
    positionY = 0; // assuming the ground is at height 0
    velocityY = 0;
}

横向移动的示例代码:

velocityX += accelerationX * time;
velocityX *= Math.pow(frictionX, time);
positionX += velocityX * time;

对代码的一些评论:

速度和位置变量需要在帧之间保持它们的值(我假设你已经弄明白了)。

gravityAccelerationY和frictionX是常数值,除非重力或摩擦力发生变化。

我用* time替换你的for循环,使用单个乘法将比循环更快。唯一的区别在于低帧速率或高加速度,加速度似乎应该从应有的速度“加速”。不过,你应该没有问题。

相关问题