2016-12-12 7 views
0

このトピックを検索したところ、フレームに依存しない更新(deltaTimeを使用)を実装するためにsf::Clockを使用すると、それを解決するのに役立つことが判明しました。しかし、それを追加した後でさえ、パドルの動きはちょっとぎこちない。一方、Playingケース全体をdeltatimeを使用せずにevent polling loopにシフトすると、ゲームがスムーズに実行されているように見えます。SFMLで滑らかな動きが得られない

は、どのように私は私のコードで正しくsf::Clockを使用して行くのです、なぜ私のゲームは、私もdeltatimeを使用せずにイベント・プールループでPlayingケースをシフトする際にスムーズに実行すると思われるのでしょうか?

ゲームの初期化:

void Game::start() { 
    if (_gameState != Uninitialized) { 
     return; 
    } 
    //Creating window 
    _mainWindow.create(sf::VideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 32), "Pong"); 
    _gameState = ShowingMenu; 

    //Adding game entities to the manager  
    VisibleGameObject *paddle1 = new PlayerPaddle("Player1", 1.0f, sf::Keyboard::Key::Up, sf::Keyboard::Key::Down); 
    VisibleGameObject *paddle2 = new PlayerPaddle("Player2", 1.0f, sf::Keyboard::Key::W, sf::Keyboard::Key::S); 
    VisibleGameObject *background = new Background("Background", 0.0f); 
    paddle1 -> setPosition(SCREEN_WIDTH - (paddle1 -> getWidth()), 0); 
    paddle2->setPosition(0, 0); 
    manager.addObject(paddle1); 
    manager.addObject(paddle2); 
    manager.addObject(background); 

    //Starting Clock 
    deltaTime = 0.0f; 
    frameClock.restart(); 


    while (!isExiting()) {  
     gameLoop(); 
    } 
    _mainWindow.close(); 
} 

ゲームループ:

void Game::gameLoop() 
{ 
    static bool firstPass = true; 
    sf::Event currentEvent; 

    //Event loop 
    while(_mainWindow.pollEvent(currentEvent) || firstPass) 
    { 

     if (firstPass) { 
      currentEvent = sf::Event(); 
      currentEvent.type = sf::Event::GainedFocus; 
      firstPass = false; 
     } 

     if (currentEvent.type == sf::Event::Closed) 
     { 
      _gameState = Exiting; 
     } 

     switch (_gameState) 
     { 
      case ShowingMenu: 
      { 
       showingMenu(); 
       break; 
      } 
      case Paused: 
      { 
       break; 
      } 


      default: 
       break; 
     } 

    } 

    //Extracting deltaTime to update game logic 

    deltaTime = frameClock.restart().asSeconds(); 
    if(_gameState == Playing) 
    { 
     manager.updateAllLayers(deltaTime); 
     manager.drawAllLayers(_mainWindow); 
     _mainWindow.display(); 
    } 
} 

パドル更新論理:

void PlayerPaddle::update(const float & elapsedTime) 
{ 
    sf::Vector2f currentPos = getPosition(); 
    float displacement = 0.0f; 

    if (sf::Keyboard::isKeyPressed(controls.up)) 
    { 
     displacement = -speed * elapsedTime;  
    } 
    else if (sf::Keyboard::isKeyPressed(controls.down)) 
    { 
     displacement = speed * elapsedTime; 
    } 

    if (displacement + currentPos.y < 0.0f) 
    { 
     setPosition(currentPos.x, 0.0f); 
     return; 
    } 
    else if (displacement + currentPos.y + getHeight() > Game::SCREEN_HEIGHT) 
    { 
     setPosition(currentPos.x, Game::SCREEN_HEIGHT - getHeight()); 
     return; 
    } 

    setPosition(currentPos.x, currentPos.y + displacement); 
} 
+0

をあなたは更新機能にどのような値を渡しますか? –

+0

@DenisErmolin 1 –

+0

@KaranJoisher firstPassはどのくらいの頻度で真実になっていますか?コードを表示できますか? –

答えて

0

コメントを投稿するには十分な評判がないので、私はこれを答えにしなければなりません。

すべてのフレームを更新(および描画)します。固定アップデートタイムステップを実装する場合、ゲームループは意味を持ちません。

これはあなたのゲームループのようになります。これは影響しません。これは、あなたがFPSを制限するsetFramerateLimit()を使用することができます(一定のレートであなたのゲームを更新(1/60代)と、可能な限りそれをレンダリング

// ... 

sf::Clock frameClock; 
const sf::Time timePerFrame = sf::seconds(1.0f/60.0f); 
sf::Time timeSinceLastUpdate = sf::Time::Zero; 

while (_mainWindow.isOpen()) { 
    timeSinceLastUpdate += frameClock.restart(); 

    // events 
    { 
    sf::Event evt; 
    while (_mainWindow.pollEvent(evt)) { 
     //... 
    } 
    } 

    // update 
    { 
    while (timeSinceLastUpdate > timePerFrame) { 
     timeSinceLastUpdate -= timePerFrame; 
     manager.updateAllLayers(timePerFrame); 
    } 
    } 

    // render 
    { 
    _mainWindow.clear(); 
    // ... 
    _mainWindow.display(); 
    } 
} 

// ... 

:私はあなたの便宜のために、あなたの変数名を使用します固定の更新間隔なので、問題はありません)。あなたは今のように使用されるあなたのmanager.updateAllLayersからsf::Timeを渡す

あなたelapsedTime(それは.asSeconds()ので、基本的に何の変更などの機能を持っていますが、明らかにspeedの値を調整する必要があります)、その後、経過時間を使用していけない場合

+0

私は1秒間に更新の数に依存しないソリューションを実現しようとしていますが、Urの答えは固定されたアップデート手法には正しいです。私はそれがポンのようなゲームのために重要ではないが、新しい概念を学ぶためにそうしていることを知っている。 –

関連する問題