没有帧率限制的运动C ++ SFML

时间:2013-08-19 03:42:37

标签: c++ limit game-physics sfml

我现在正在使用SFML制作游戏,但是我在没有帧速率限制的情况下陷入了运动状态。现在,我已经找到了如何在所有计算机上获得一致帧率的唯一方法是使用

window.setFramerateLimit(30);

我想找到一种没有帧率上限的方法,所以它在更好的计算机上看起来更好,所以如果有人的计算机速度很慢,他们仍然可以玩游戏。什么是最好的方法。

2 个答案:

答案 0 :(得分:7)

您应该将自上一帧以来经过的时间传递给需要绘制的对象,然后计算对象必须移动的空间,如下所示:

sf::Clock clock;
int speed = 300;


//Draw func that should be looped
void Draw()
{
    sf::Time elapsedTime = clock.restart();
    float tempSpeed = elapsedTime.asSeconds() * speed;
    drawnObject.move(tempSpeed, 0);
    drawnObject.draw(window);
}

这样,无论FPS如何,'drawnObject'每秒都会向右移动300(像素?)

答案 1 :(得分:5)

@Waty's answer是对的,但您可能希望使用固定时间步。

看看SFML Game development book source code。这是interesting snippet

const sf::Time Game::TimePerFrame = sf::seconds(1.f/60.f);

// ...

sf::Clock clock;
sf::Time timeSinceLastUpdate = sf::Time::Zero;
while (mWindow.isOpen())
{
    sf::Time elapsedTime = clock.restart();
    timeSinceLastUpdate += elapsedTime;
    while (timeSinceLastUpdate > TimePerFrame)
    {
        timeSinceLastUpdate -= TimePerFrame;

        processEvents();
        update(TimePerFrame);

    }

    updateStatistics(elapsedTime);
    render();
}