我有这个循环:
sf::Clock clock;
sf::Time timeSinceLastUpdate = sf::Time::Zero;
while (mWindow.isOpen())
{
processEvents();
timeSinceLastUpdate += clock.restart();
while (timeSinceLastUpdate > TimePerFrame)
{
timeSinceLastUpdate -= TimePerFrame;
processEvents();
update(TimePerFrame);
}
render();
}
在更新功能中我这样做:
object.speed = object.speed * TimePerFrame.asSeconds();
然后我运行一个方法:
sprite.move(cos(sprite.getRotation()*PI / 180) * speed, sin(sprite.getRotation()*PI / 180) * speed);
但问题是精灵不会移动。当我没有通过TimePerFrame.asSeconds()乘以速度时,它确实会移动。我应该如何修复它以便一切正确?在哪里以及如何使用TimePerFrame变量?
答案 0 :(得分:1)
问题在于object.speed = object.speed * TimePerFrame.asSeconds();
。
它实际上做的是第一次将速度设置为一个非常低的值,因为经过的时间可能是几毫秒。第二次执行此语句时,速度进一步降低。依此类推,直到它达到一个非常小的值,以至于您的计算机将其解释为0,因此speed * something
为0 * something
,总是会0
。
答案 1 :(得分:1)
object.speed = object.speed * TimePerFrame.asSeconds();
此行每帧都会降低速度,直到它为0.
每当移动对象时,您需要按增量时间缩放移动距离。试试这个:
float distance = speed * TimePerFrame.asSeconds();
sprite.move(cos(sprite.getRotation()*PI / 180) * distance, sin(sprite.getRotation()*PI / 180) * distance);