【问题标题】:jumping in a game在游戏中跳跃
【发布时间】:2012-04-01 00:39:21
【问题描述】:

我正在制作一个 2d 横向卷轴,我这辈子都无法跳起来工作。这就是我左右移动的方式:

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

然后更新我的玩家位置

positionX = oldPositionX + newVelocityX;

这很好用,变量“时间”只是我上次运行该函数以来的毫秒数。摩擦效果很好,我很高兴在 X 方向上一切都很好。这是我在 Y 方向上的:

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

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

【问题讨论】:

  • 听起来好像在旧计时器到期和新计时器开始之间有很长的间隔。当然,在速度较慢的计算机上,这样的间隔会更长。但这只是一个想法:如果无关紧要,请忽略。祝你好运。
  • 我们能看到更多代码吗?比如主游戏循环?

标签: javascript math physics gravity


【解决方案1】:

您需要做几件事来更改您的代码以使其正常工作。您发布的代码中有许多错误/性能问题。

这里有一些代码来完成游戏的基本操作。

跳转示例代码:

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;

代码上的一些cmets:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多