我现在正在用 SFML 制作游戏,但我在没有帧速率限制的情况下被卡住了。现在,我想出如何在所有计算机上获得一致帧速率的唯一方法是使用
window.setFramerateLimit(30);
我想找到一种不设置帧速率上限的方法,这样它在更好的电脑上看起来会更好,这样如果有人的电脑很慢,他们仍然可以玩游戏。什么是最好的方法来做到这一点。
我现在正在用 SFML 制作游戏,但我在没有帧速率限制的情况下被卡住了。现在,我想出如何在所有计算机上获得一致帧速率的唯一方法是使用
window.setFramerateLimit(30);
我想找到一种不设置帧速率上限的方法,这样它在更好的电脑上看起来会更好,这样如果有人的电脑很慢,他们仍然可以玩游戏。什么是最好的方法来做到这一点。
您应该将自上一帧以来经过的时间传递给需要绘制的对象,然后计算对象必须移动的空间,如下所示:
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
@Waty 的答案是正确的,但您可能想使用固定时间步长。
看看SFML游戏开发书源代码。这是有趣的片段:
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(); }