我正在尝试实现一个固定的时间步长循环,以便游戏以恒定的速率刷新。我在http://gafferongames.com/game-physics/fix-your-timestep/找到了一篇很棒的文章,但我无法将其转换为我自己的 2d 引擎。
我指的具体地方是最后一部分“The Final Touch”中的功能,这是大多数人推荐的。这是他的功能:
double t = 0.0;
const double dt = 0.01;
double currentTime = hires_time_in_seconds();
double accumulator = 0.0;
State previous;
State current;
while ( !quit )
{
double newTime = time();
double frameTime = newTime - currentTime;
if ( frameTime > 0.25 )
frameTime = 0.25; // note: max frame time to avoid spiral of death
currentTime = newTime;
accumulator += frameTime;
while ( accumulator >= dt )
{
previousState = currentState;
integrate( currentState, t, dt );
t += dt;
accumulator -= dt;
}
const double alpha = accumulator / dt;
State state = currentState*alpha + previousState * ( 1.0 - alpha );
render( state );
}
对我自己来说,我只是在屏幕上移动一个玩家来跟踪 x 和 y 位置以及速度,而不是进行微积分积分。**我对更新玩家位置(dt 还是 t?)的应用感到困惑。有人可以分解并进一步解释吗?
第二部分是我理解的插值,因为提供的公式是有意义的,我可以简单地在当前和之前的 x、y 玩家位置之间进行插值。
另外,我意识到我需要一个更准确的计时器。