【发布时间】:2020-07-01 23:32:50
【问题描述】:
我正在尝试在渲染状态之前使用用于物理和插值的固定增量时间编写简单的循环。我在固定时间步长的游戏教程中使用 Gaffer,我试图理解它并使其工作。
float timeStep = 0.01;
float alpha = 1.0;
while (isOpen()) {
processInput();
deltaTime = clock.restart(); // get elapsed time
if (deltaTime > 0.25) { deltaTime = 0.25; } // drop frame guard
accumulator += deltaTime;
while (accumulator >= timeStep) {
// spritePosBefore = sprite.getPosition();
accumulator -= timeStep;
// sprite.move(velocity * timeStep, 0);
// spritePosAfter = sprite.getPosition();
}
if (accumulator > timeStep) { alpha = accumulator / timeStep; } else { alpha = 1.0; }
// sprite.setPosition(Vector2f(spritePosBefore * (1 - alpha) + spritePosAfter * alpha));
clear();
draw(sprite);
display();
}
现在,一切看起来都很好。我有固定的物理时间步长,在更新物理后尽可能绘制并在两个位置之间进行插值。它应该完美无缺,但我仍然可以看到精灵口吃,甚至偶尔会返回一个像素。为什么会这样?我的代码有问题吗?我花了两天时间试图理解游戏循环,这将确保我完美的动作,但它似乎不像我想象的那样工作。知道有什么可以改进的吗?
【问题讨论】:
标签: c++ game-physics sfml timedelta linear-interpolation