ゲームの実装と初期化
Gameを継承する
これまで作成したゲームは、画面に何も表示しないからのゲームでした。Game クラスはゲームの基本となる機能を提供するだけで、ゲームの中身は私たちゲーム開発者が作らなければなりません。
これまでは Game クラスを直接インスタンス化して表示してきましたが、独自のゲームを開発するには Game クラスを継承する新しいクラス(ゲームの実装)を作成し、メソッドをオーバーライドして内容をカスタマイズします。Windows フォームアプリケーションを開発した経験のある方には Form クラスを継承して、独自の外観を作り上げていく方法と同じだと考えていただいてかまわないでしょう
public class YourGame : Game { //ゲームコード... }
Run() メソッドによってゲームが起動されると Game クラスは、定められた初期化処理を順に行い、ゲームループを開始します。ゲームデータを初期化しなければならないタイミングで Initialize() メソッドが呼び出されます。このメソッドをオーバーライドし、ゲーム固有のデータを初期化します。
protected virtual void Initialize ()
ゲームに依存しない、単純な値で構成されるデータであればコンストラクタで初期化してもかまいませんが、ゲームの場合は「タイトルに戻る」などでゲームデータをリセットしなければならない場面もあるので、コンストラクタ以外のメソッドで、データを初期化する処理をまとめたほうが効率的です。また、コンストラクタが呼び出された時点では Run() メソッドが実行されていないため、ゲームは開始していません。ゲームが開始していない状態では、デバイス情報など関連したリソースがインスタンス化されていないので注意が必要です。
詳細は後述しますが、Initialize() メソッドは基底クラスでも必要な初期化処理を行っています。そのため、オーバーライドした場合は、必ず base オブジェクトの Initialize() メソッドを呼び出してください。そうしなければ、ゲームに関連する一部の機能が正しく動作しなくなる可能性があります。
protected override void Initialize() { //初期化処理... base.Initialize(); //必須! }
ゲームが起動し、初期化処理が終了した時点で BeginRun() メソッドが呼び出されます。必ず Initialize() メソッドによる初期化が終了した後に呼び出されます。
protected virtual void BeginRun ()
BeginRun() メソッドに対応する形で、ゲームが終了する直前に EndRun() メソッドが呼び出されます。
protected virtual void EndRun ()
このメソッドはゲームの終了処理が開始されたことを受けて呼び出されます。多くのゲームではコンストラクタと Initialize() メソッドのオーバーライドで初期化処理に必要な流れを得られるため、BeginRun() メソッドと EndRun() メソッドが必要になることは少ないでしょう。BeginRun() メソッドと EndRun() メソッドの代表的な応用例は自動的なシステムデータの保存です。
以上が、基本的なゲームの初期化から開始までの流れとなります。これらのメソッドは、必ずしもオーバーライドしなければなないものではありません。必要な部分のみオーバーライドし、独自の機能をゲームに追加してください。
using System.Diagnostics; using Microsoft.Xna.Framework; public class TestGame : Game { public static void Main(string[] args) { using (Game game = new TestGame()) { game.Run(); } } protected override void Initialize() { Debug.WriteLine("Initialize"); base.Initialize(); } protected override void BeginRun() { Debug.WriteLine("BeginRun"); base.BeginRun(); } protected override void EndRun() { Debug.WriteLine("EndRun"); base.EndRun(); } }
コード1は Initialize() メソッド、BeginRun() メソッド、EndRun() メソッドをオーバーライドし、それぞれのメソッドがゲーム起動時に実行されていることを確認します。 出力結果を見れば、適切な順でメソッドが実行されていることが確認できます。最初に Initialize() メソッドが呼び出され、その後 BeginRun() メソッドが呼び出されています。また、ウィンドウを閉じてゲームを終了すると EndRun() メソッドが呼び出されます。