我现在正在使用SFML制作游戏,但是我在没有帧速率限制的情况下陷入了运动状态。现在,我已经找到了如何在所有计算机上获得一致帧率的唯一方法是使用
window.setFramerateLimit(30);
我想找到一种没有帧率上限的方法,所以它在更好的计算机上看起来更好,所以如果有人的计算机速度很慢,他们仍然可以玩游戏。什么是最好的方法。
答案 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(); }