使用固定时间步长的精灵运动

时间:2015-06-04 12:51:00

标签: c++ game-engine game-physics sfml

我有这个循环:

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变量?

2 个答案:

答案 0 :(得分:1)

问题在于object.speed = object.speed * TimePerFrame.asSeconds();

的含义

它实际上做的是第一次将速度设置为一个非常低的值,因为经过的时间可能是几毫秒。第二次执行此语句时,速度进一步降低。依此类推,直到它达到一个非常小的值,以至于您的计算机将其解释为0,因此speed * something0 * 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);