使用固定时间步移动精灵
Movement of sprite using fixed time step
我有这个循环:
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 变量?
问题出在object.speed = object.speed * TimePerFrame.asSeconds();
的意思上。
它实际上所做的是第一次将您的速度设置为一个非常低的值,因为经过的时间可能只有几毫秒。第二次执行此语句时,速度进一步降低。依此类推,直到它达到一个小到您的计算机将其解释为 0 的值,因此 speed * something
是 0 * something
,它总是给出 0
.
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);
我有这个循环:
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 变量?
问题出在object.speed = object.speed * TimePerFrame.asSeconds();
的意思上。
它实际上所做的是第一次将您的速度设置为一个非常低的值,因为经过的时间可能只有几毫秒。第二次执行此语句时,速度进一步降低。依此类推,直到它达到一个小到您的计算机将其解释为 0 的值,因此 speed * something
是 0 * something
,它总是给出 0
.
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);