我正在制作一个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,那么我甚至可以让玩家跳跃,但是在快速计算机上他们跳得很高,而在旧计算机上他们跳得很低。我不知道如何解决这个问题,我以为我已经把它放在像我一样的循环中了。
答案 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循环,使用单个乘法将比循环更快。唯一的区别在于低帧速率或高加速度,加速度似乎应该从应有的速度“加速”。不过,你应该没有问题。