どのようなゲームも、大体次のような流れで作成されている。
- オープニング表示(タイトル画面、オープニングムービーなど)
- ゲームメイン
- エンディング表示(ゲームオーバー画面、エンディングムービーなど)
これらを全て行うプログラムを作るには、次のような考え方で行うとよい。
![]()
《解説》
- ゲームの場面を示す変数を用意してその値によって処理を分けることにより、シンプルなプログラムを作成できる。
- キー入力の取得はWindowsメッセージではなく、API関数で行う。これにより、場面毎に動作を分けることができる。
(WM_KEYDOWN内にプログラムを書くと、分かりにくくなってしまう)※キー入力については次項で解説する
4-1のフローチャートのようにGameFrame関数を作成すると、次のようになる。
#define START_INIT 0 #define START_FRAME 1 #define GAME_INIT 10 #define GAME_FRAME 11 // プロトタイプ宣言 void UpdateFrame(HWND hWnd); // グローバル変数 BYTE g_FrameNo = START_INIT; // フレーム選択用 //----------------------------------------------------------------------------- // 関数名 : UpdateFrame() // 機能概要: 画面更新処理 //----------------------------------------------------------------------------- void UpdateFrame(HWND hWnd) { /* 現在のキー情報を取得 */ /* 処理の振り分け */ switch (g_FrameNo) { case START_INIT: // スタート画面を表示する前に実行する初期化関数を実行 case START_FRAME: // スタート画面表示処理関数を実行 break; case GAME_INIT: // ゲーム画面を表示する前に実行する初期化関数を実行 case GAME_FRAME: // ゲーム画面表示処理関数を実行 break; default: OutputDebugString("g_FrameNoの値が例外です。\n"); } /* フリップ処理 */ }《解説》
- g_FrameNoの値が変わるたびに、呼び出す関数を変える。変わらなければ、同じ関数を呼び出し続ける(同じ処理を実行し続ける)。
- StartInit関数、GameInit関数は、それぞれの場面を表示する前の各変数の初期化に使用する。初期化後は直ちに表示処理に移るため、
breakを付けていない。《補足》
- スケルトンプログラムにUpdateFrame関数を追加したら、WinMain関数のwhile文の中の
UpdateFrame関数を実行している行のコメントをはずそう。- それぞれの処理に対する関数を作成していないため、この状態でビルド&実行しても何も変わらない。