Update(GameTime)メソッドとPauseの実装に関する問題


7

私は一時停止機能を実装しており、プレーヤーの画面を暗くしてゲームプレイの更新を停止するという点で正しく機能します。

問題は、一時停止中にGameTimeが増加し続けることです。そのため、別の敵を生成する前にgameTimeとpreviousSpawnTimeをチェックするメソッドがめちゃくちゃになり、ゲームの一時停止が長すぎると、次の敵の描画が早すぎることがわかります。

これが敵のアップデート用のコードです。

private void UpdateEnemies(GameTime gameTime)
    {
        // Spawn a new enemy every 1.5 seconds
        if (gameTime.TotalGameTime - previousSpawnTime > enemySpawnTime)
        {
            previousSpawnTime = gameTime.TotalGameTime;

            // Add an Enemy
            AddEnemy();
        }
...

gameTimeに依存する他のメソッドもあります。合計休止時間を取得し、それを合計ゲーム時間から差し引こうとしましたが、それが私がこれを解決しようとする方法である場合、それが正しく機能するようには見えません。

他のコードが必要な場合はお知らせください。ありがとうございました。

回答:


8

TotalGameTimeuse を使用する代わりに、現在のElapsedGameTime合計をいくつかの変数に累積します。次に、ゲームを一時停止するときは、変数への経過時間の追加を停止するだけです。次に例を示します。

float spawnTimer = 0.0f;
float timeBetweenSpawns = 1.5f;

private void Update(GameTime gameTime)
{
    // Perform actions that should only happen when the game is not paused
    if(!isPaused)
    {
        // Add time elapsed since previous frame to running timer
        spawnTimer += (float) gameTime.ElapsedGameTime.TotalSeconds;

        // Check if enough time has passed to spawn a new enemy
        if(spawnTimer >= timeBetweenSpawns)
        {
            AddEnemy();

            // Decrement the timer to prepare it for the next spawn
            spawnTimer -= timeBetweenSpawns;
        }
    }

    // Perform any actions that should happen all the time
}

3
0.0タイムデルタでUpdateEnemiesを呼び出す方が優れたオプションであり、ゲームのプレイに影響を与えることなく、敵が退屈に足を叩くなどの付随的またはフレーバーアクティビティの処理を行うことができます。単に更新の呼び出しを停止すると、そのような興味深いオプションが失われます。
Patrick Hughes

@PatrickHughesはい、私はあなたが一時停止を解除するのを待っている彼らの足を中バトルタップする多くの男のアイデアが好きです。
MichaelHouse

1
@PatrickHughes質問は主に時間の管理に関係していたため、一時停止を示すために私が選んだ方法は単なる例示でした。それにもかかわらず、私は2つの理由でゼロ時間デルタを渡さないでしょう。GameTimeフレームワークによって自動的に計算および管理されるため、ゼロデルタを渡すには、別のGameTimeオブジェクトをインスタンス化するか、フロートを使用するように署名を変更する必要があります。また、デルタがゼロであっても、不要な追加およびタイマーチェックを実行します。必要に応じて、メソッドの一部を一時停止チェックでラップし、残りの半分が更新を継続できるようにします。
David Gouveia

2
@PatrickHughesあなたが説明しているのは明らかにビューの概念です。ゲームが一時停止すると、「退屈なアイドル」のアニメーションでモデルをレンダリングします。これは、Update呼び出しではなく、Draw呼び出しで処理する必要があります。
ダニエルカールソン、2012年

1
@PatrickHughesはい、少し奇妙です。そのため、すべてのプロジェクトで、更新ループの先頭で最初に行うことは、GameTimeオブジェクトを単純なフロートに変換し、代わりにその値を使用することです。必要はありませんでしたが、スローモーションの実装が簡単になりました。経過時間の値を定数でスケーリングするだけです。ゲームの一時停止に関しては、個人的な好みの問題だと思います。時間依存の計算を明示的にスキップするために、一時停止をゼロデルタではなくオン/オフスイッチのように扱うのが好きですが、どちらも完全に有効な解決策です:)
David Gouveia
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.