状態またはフェーズでよく使用するアプローチは、マネージャー クラスを使用することです。基本的に、 、、およびメソッドGamePhaseを持つオブジェクトが必要であり、場合によってはおよびも必要です。また、ハンドオーバーを処理するための何らかの方法が必要になることもよくあります。それについては後で詳しく説明します。このクラスを取得したら、それを継承して各フェーズのクラスを作成します。、、、などInitialise()Update()Draw()Dispose()Pause()Resume()SoldierPlacementPhaseMovementPhaseAttackPhase
次に、 、、およびメソッドGamePhaseManagerを持つクラスがあり、おそらく何らかのメソッドがあります。また、マネージャーに状態を追加するメソッドも必要です。状態を保存する方法も必要です。またはをキーとして使用することをお勧めします。メソッドはそのキーをパラメーターとして受け取ります。Initialise()Update()Draw()Dispose()SetCurrentPhase()Add()Dictionary<>int/enumstringSetCurrentPhase()
基本的に、GamePhaseManagerゲーム内に のインスタンスを設定し、各フェーズ オブジェクトを作成して初期化し、マネージャに追加します。次に、ゲームの更新ループが を呼び出しますGamePhaseManager.Update()。これは、現在の状態の Update メソッドを呼び出してパラメーターを渡すだけです。
フェーズには、いつ終了するかを伝える何らかの方法と、それを処理する何らかの方法が必要になります。最も簡単な方法は、オブジェクトをセットアップしてから、次のフェーズへの参照を各フェーズに与えるGamePhaseようなメソッドを用意することです。GamePhase.SetNextPhase(GamePhase next)次に必要なのはExiting、保護されたセッターとパブリックゲッターを備えたブール値だけです。これにより、内部ロジックがフェーズが終了したと判断したときにExiting = true設定できるようになり、次のことができます。Update()GamePhaseManager.Update()
public void Update(TimeSpan elapsed)
{
if (CurrentPhase.Exiting)
{
CurrentPhase.HandOver();
CurrentPhase = CurrentPhase.NextPhase;
}
CurrentPhase.Update(elapsed);
}
更新前にフェーズが変更されていることに気付くでしょう。これは、終了フェーズがそのサイクルを終了できるようにするためです。そうしないと、奇妙な動作が発生します。このCurrentPhase.HandOver()メソッドは基本的に、現在のフェーズを取得して、次のフェーズが適切なポイントから続行するために知る必要があるものをすべて渡します。これはおそらくNextPhase.Resume()、内部的に呼び出し、必要な情報をパラメーターとして渡すことによって行われます。ここでも設定することを忘れないでくださいExiting = false。そうしないと、更新ループが 1 回だけの後で引き続き引き渡されます。
メソッドはDraw()同じ方法で処理されます。ゲーム ループはを呼び出しますGamePhaseManager.Draw()。これは単に を呼び出しCurrentPhase.Draw()、パラメータを渡します。
フェーズに依存しないもの (マップなど) がある場合は、それを に格納し、のGamePhaseManagerメソッドでそのメソッドを呼び出すGamePhaseManagerか、フェーズにそれを渡し、そのメソッドを呼び出させることができます。または、トップレベルに維持して、の横にあるメソッドを呼び出すことができますGamePhaseManager。フェーズが必要とするアクセスの量によって異なります。
編集
あなたの編集は、上記のかなりの部分があなたに知られていることを示していますが、将来この質問に出くわした人を助けるためにそこに残しておきます。
ゲームのステージを処理するマネージャーが既にいる場合、私の直感はそれを入れ子にすることです。ゲームにステージがあることを確認し、それらを処理するクラスを作成しました。独自のステージを持つステージがあるので、既に作成したステージ処理コードを使用してみませんか? Screenオブジェクトからクラスを継承するSubdividedScreenか、それを呼び出したいと思うものは何でも継承します。この新しいクラスはほとんど親と同じですが、クラスの独自のインスタンスも含まれていますScreenManager。Screen呼び出しmapているオブジェクトをこれらのオブジェクトのいずれかに置き換え、さまざまな段階 ( 、など)を表すインスタンスSubdividedScreenで埋めます。にいくつかの調整が必要な場合がありますScreenManagerScreenPlacementPhasePlayerPhaseScreenManager適切な情報が必要なメソッドに確実に届くようにコードを作成する必要がありますが、Update()switch ケースごとに細分化された乱雑なメソッドを使用するよりもはるかにすっきりしています。