2013-08-19 35 views
4

我正在SFML中製作遊戲,但是我在運動時沒有幀速限制。現在我已經找到了如何讓所有計算機上保持一致幀率的唯一方法是通過使用無框架限制的運動C++ SFML

window.setFramerateLimit(30); 

我想找到一種方法,沒有幀率帽所以它看起來更好更好的電腦,使如果有人有一臺非常慢的電腦,他們仍然可以玩遊戲。什麼是最好的方式來做到這一點。

+2

我強烈建議書SFML遊戲開發這對這個章節。您需要將'sf :: Time deltaTime'(這是自上一幀以來的時間)傳遞給每個更新函數,並在此增量時間內調整移動距離。 –

回答

6

你應該通過自上一幀到需要繪製的對象,經過的時間,然後計算對象必須移動的空間,就像這樣:

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是多少?

+1

這是正確的,但它可能會導致與較高的幀速率更新時經過的時間很小,導致一些舍入與浮動錯誤的問題。我不打算詳細說明,這裏有一個有用的鏈接:http://gafferongames.com/game-physics/fix-your-timestep/ –

4

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