状態またはフェーズでよく使用するアプローチは、マネージャー クラスを使用することです。基本的に、 、、およびメソッドGamePhase
を持つオブジェクトが必要であり、場合によってはおよびも必要です。また、ハンドオーバーを処理するための何らかの方法が必要になることもよくあります。それについては後で詳しく説明します。このクラスを取得したら、それを継承して各フェーズのクラスを作成します。、、、などInitialise()
Update()
Draw()
Dispose()
Pause()
Resume()
SoldierPlacementPhase
MovementPhase
AttackPhase
次に、 、、およびメソッドGamePhaseManager
を持つクラスがあり、おそらく何らかのメソッドがあります。また、マネージャーに状態を追加するメソッドも必要です。状態を保存する方法も必要です。またはをキーとして使用することをお勧めします。メソッドはそのキーをパラメーターとして受け取ります。Initialise()
Update()
Draw()
Dispose()
SetCurrentPhase()
Add()
Dictionary<>
int/enum
string
SetCurrentPhase()
基本的に、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
で埋めます。にいくつかの調整が必要な場合がありますScreenManager
Screen
PlacementPhase
PlayerPhase
ScreenManager
適切な情報が必要なメソッドに確実に届くようにコードを作成する必要がありますが、Update()
switch ケースごとに細分化された乱雑なメソッドを使用するよりもはるかにすっきりしています。