1

私は SFML を試しており、古典的なゲーム Snake を作成しています。

一定時間後にヘビを一定量のピクセルだけ動かすことに成功しました。問題は、ゲームループの実行に異なる時間がかかることです。したがって、すべての動きの差分時間を書き出すと、次のようになります。

  • 時間: 0.273553
  • 時間: 0.259873
  • 時間: 0.260135
  • 時間: 0.396735
  • 時間: 0.258397
  • 時間: 0.262811
  • 時間: 0.259681
  • 時間: 0.257136
  • 時間: 0.266248
  • 時間: 0.412772
  • 時間: 0.260008

0.39 と 0.41 のバンプは良くありません。ヘビの動きが遅くなることがあり、見栄えがよくありません。

スネークが画面上でスムーズに動作するように、時間は常に 0.25 にする必要があります。ゲームループに実装されている私のコードは次のとおりです (snake.getSpeed() 関数は 4 を返します)。

    if(_clock.GetElapsedTime() > (1 / snake.getSpeed())){
        std::cout << "Time: " << _clock.GetElapsedTime() << std::endl;
        snake.changeDir(keyDown);       //Change direction
        snake.move();           //Move the snake
        _clock.Reset();
    }

プロセッサを遅くするだけですか、それともコードを改善する方法について別のアイデアを持っている人はいますか?

編集:上記を無視してください。リアルタイム バンパーは、GetEvent 関数のようです。理由はわかりませんが、実行に 0 秒から 0.2 秒かかります。ここに私のテストコードがあります:

    //This is just i bit of code, therefore there's no ending brackets ;)
    _clock.Reset();
    while(_mainWindow.GetEvent(currentEvent)) {
        std::cout << _clock.GetElapsedTime() << std::endl;    //cout the elapsed time for GetEvent

(_mainWindow は sf::RenderWindow です) これを修正できるかどうかはわかりませんが、質問は未回答のままにしておきます。ありがとう!

4

1 に答える 1

4

まず、SFML 2 を使用することをお勧めします。なぜなら、SFML 1.6 は 2 年半以上メンテナンスされておらず、既知の醜いバグがかなり多く、SFML 2 の多くの優れた機能が欠けているからです。

次に、特定のフレームレートを強制しようとしないほうがよいでしょう。なぜなら、それについて実際には何もできない要因 (OS の割り込み、マウスを動かすときの多くのイベントなど) があるためです。フレームレート。最も簡単な方法は、オイラー法を使用することです。

pos.x = pos.x*velocity.x*dt

ここposで、 はオブジェクトの位置のvelocityベクトル、 は 2 次元の速度のベクトル、 はdtデルタ時間、つまり 2 つのフレーム間の時間です。残念ながら、単純な Euler 法はあまり正確ではなく、Verlet 統合を使用するとよりスムーズな動きが得られる可能性があります。

しかし、それだけではありません。動きがフレーム レートにより厳密にバインドされたとしても、スパイクは依然として発生し、望ましくない効果につながるからです。したがって、タイム ステップを修正することをお勧めします。そのため、FPS (フレーム/秒) カウントを使用したレンダリングは、物理演算から独立しています。これにも多くのアプローチがあり、私が役に立つと思った記事の 1 つがその記事です

于 2012-12-27T18:00:14.047 に答える