【发布时间】:2012-01-23 05:41:45
【问题描述】:
我正在尝试复制 Sonic physics engine 的逻辑,它是为固定时间步长系统 (60 FPS) 在可变时间步长时代(准确地说是 Slick2D)中编写的。
在原版中按下跳跃按钮时,玩家的velocity.y 设置为-6.5,每个刻度 0.21875 添加到velocity.y 以模拟重力。
每次调用我的逻辑更新时,都会传递一个时间增量参数,指定已传递多少毫秒。如果经过的毫秒数比我预期的要多,那么我重复更新逻辑,传递一个最多为 1 的“内部增量”,或者如果我们正在处理目标帧的“剩余”,则传递更少。
例如如果我们预计一帧需要 16 毫秒,而它确实需要 16 毫秒,则循环将迭代一次并将 thisMiniTick 作为 1 传递。如果增量不是 16 毫秒而是 40 毫秒,则循环将执行三个次,经过 1、1,最后是 0.5。
我错误地认为在每个内部更新循环中我都可以执行velocity.y += (gravity * thisMiniTickRelative),但这不起作用。在较快的帧速率下,没有施加足够的重力导致更高的跳跃,而在较慢的帧速率上,跳跃较低(尽管没有那么明显)。
有没有一种方法可以适用于几乎所有帧速率,还是我必须求助于为delta 设置上限和下限?
“内部更新”循环:
float timeRemaining = delta/1000f;
while(timeRemaining > 0)
{
float thisMiniTick = Math.min(timeRemaining, 1f / FRAMES_PER_SECOND);
float thisMiniTickRelative = thisMiniTick / (1f / FRAMES_PER_SECOND);
updateInput(container, game, thisMiniTickRelative);
if (playerAirState)
{
playerVelocity.y += (GRAVITY * thisMiniTickRelative);
}
clampPlayerVelocity();
playerPosition.add(playerVelocity);
doCollisions();
timeRemaining -= thisMiniTick;
}
【问题讨论】:
标签: game-physics lwjgl slick2d 2d-games