その7 ゲーム遷移の実装をあれこれ考えてみる:サンプルプログラム
ゲーム製作技術編その7「ゲーム遷移の実装をあれこれ考えてみる」で説明した内容を踏まえたサンプルプログラムです。実行するとコンソールウィンドウが出現してテキストベースの遷移が行われます。
サンプルスクリーンショット。味気ないとか言っちゃいけません!ちゃんと遷移しています。
操作方法は至って簡単です。タイトル遷移になったら「S」か「E」を押します。Sはゲームスタート。Eはゲーム終了です。尚、遷移を見るのが目的なので、ゲーム自体は入っていません(^-^;。タイトルで時間が経過するとデモに遷移します。
このサンプルの状態遷移図はこのようになっています。
GameSceneクラスは3つの状態を保持しています。各状態もクラスで表現されています。状態間のつながりはGameSeneクラスが作っています。
○ プログラムの実行方法
サンプルプログラムはこちらからダウンロードできます(GDEVSmp_No7_State.lzh)。プログラムは幾つかのヘッダーファイル(.h)と実装ファイル(.cpp)で構成されています。実行形式もありますので、まずは実行させて動作確認をしてみて下さい。
VS上で動かすには、空のWindowsアプリケーションを立ち上げ(プリコンパイル済みヘッダーははずしてください)、Sourceフォルダ内にある全てのヘッダーファイルと実装ファイルをプロジェクトに追加するだけです。尚、各クラスはご自由にお使い下さって結構です。
○ ファイルの説明
・ SceneBase.h
シーンを管理する親クラスです。このクラス内に状態の終了を表すStateResult列挙型が定義されています。またupdateメソッドもあります。
・ GameScene.h、GameScene.cpp
ゲームの大外の状態遷移を管理するクラスです。updateメソッド内で上の図の遷移に該当するメソッドの呼び出しが行われています。各ステートメソッドはこのクラスの持つより小さい状態クラス(DemoSceneなど)のupdateメソッドを呼び出しています。
・ DemoScene.h、DemoScene.cpp
デモの状態を管理するクラスです。デモは初期化、再生、終了の3つの状態を持っています。updateメソッドでその状態を遷移させています。
・ main.cpp
アプリケーションが行うゲームループが入っています。物凄く、物凄くシンプルになっている事に注目です。アプリケーションが行うべき事はゲームの初期化(GameSceneオブジェクトの生成がそれに該当)、フレーム時間の管理とゲームのアップデート(後は描画の開始宣言も)くらいにしたいもんです。
・ MyGameScene.h、MyGameScene.cpp
ゲームの状態を管理するクラスです。ゲームは初期化、アイドル状態そして終了の3つの状態を持っています。サンプルでは時間が経過したらメッセージを表示する機構を簡単に作ってあります。
・ TitleScene.h、TitleScene.cpp
タイトルの状態を管理するクラスです。タイトルは初期化、アイドル状態そして終了の3つの状態を持っています。上の図にもあるように、タイトルは終了時にデモかゲームか終了かという3つの方向に分岐します。このためタイトルクラスにはSelect列挙型及びgetSelectResultメソッドという終了時の選択状態を取得する機構が追加されています。こういうのは状態遷移では度々出てきますが、親クラスに置けるほど一般化できない部分でもあります。