使用固定时间步移动精灵

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 * something0 * 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);