在游戏中跳跃

3

我正在制作一个2D横向卷轴游戏,但是我无论如何都无法实现跳跃。这是我处理左右移动的方式:

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

然后更新我的玩家位置我这样做:

positionX = oldPositionX + newVelocityX;

这很好用,变量"time"只是自上次运行函数以来的毫秒数。摩擦力在X方向上很好用,我很高兴一切都在X方向上很好。这是我在Y方向上的代码:

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

物体由于重力原因可以很好地下落。如果用户按上箭头键时我设置一个负的accelerationY,那么甚至可以使玩家跳跃,但在快速电脑上跳得很高,在旧电脑上跳得很低。我不确定如何解决这个问题,我认为我已经通过将其放入for循环中来解决它。


听起来好像在旧计时器过期和新计时器启动之间有一个显著的时间间隔。当然,在慢速计算机上,这样的间隔会更长。但这只是一个想法:如果不相关,请忽略。祝好运。 - thb
1
我们能看到更多的代码吗?比如主游戏循环? - Jeffrey Sweeney
1个回答

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循环的地方,使用单个乘法比循环更快。唯一的区别可能出现在低帧率或高加速率的情况下,此时加速度似乎会比应有的加速度更快。不过你不应该遇到这样的问题。


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