がりらぼ

WindowsRuntimeの応援ブログ

XNAでのゲーム状態管理

ゲームプログラミングに置いて状態管理というものは難しいポイントの一つです。
有限状態管理とか言うらしいですが通常だとswitch分岐を考えてしまいがちですが途中ゲームに改良を加えようとした時に困ることとなります。
ではどうやって状態管理を行うかと言うと
f:id:garicchi:20120219110825p:image
クラス図があってる気がしない(^q^)

各スクリーンのベースとなるScreenBaseクラスを作り、各スクリーンに継承させます。
ScreenBaseには仮想メソッドとしてUpdateやDraw,Initializeなどを用意しておきます
派生クラスではコレをオーバーライドします。

そしてすべてのスクリーンをListで管理するクラスがScreenManagerクラスです。
List<ScreenBase>型で管理し、AddメソッドやRemoveメソッドで各スクリーンを追加、削除します。
ScreenManagerXnaDrawableComponentクラスを継承し、foreachで各クラスのUpdateやDrawを実行します。SpriteBarchクラスもこのクラスがインスタンス化し、各スクリーンに渡します。

そして各スクリーンのコンストラクタではScreenManagerインスタンスを渡しておきます。
こうすることで各スクリーンにゲームの進行を任せることができ、自身を消すときは

screenManager.Remove(this);

次のスクリーンを作るには

screenManager.Add(new Screen1());

このようにすることができます。

このようにゲームの進行を各スクリーンに任せることによってゲームの進行を容易に可変することができます。

サンプルソース
AppHubゲームの状態管理