【问题标题】:Movement Without Framerate Limit C++ SFML没有帧率限制的移动 C++ SFML
【发布时间】:2013-08-20 19:05:23
【问题描述】:

我现在正在使用 SFML 制作游戏,但我在没有帧速率限制的情况下被卡住了。现在,我想出如何在所有计算机上获得一致帧速率的唯一方法是使用

window.setFramerateLimit(30);

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

【问题讨论】:

  • 我强烈推荐 SFML Game Development 这本书有一个章节。您需要将sf::Time deltaTime(即自上一帧以来的时间)传递给每个更新函数,并通过此增量时间调整您的移动距离。

标签: c++ limit game-physics sfml


【解决方案1】:

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

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);
}

这样,'drawnObject' 将每秒向右移动 300(像素?),无论 FPS 多少

【讨论】:

【解决方案2】:

@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();
}

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多