スタート画面とゲーム画面、ゲームオーバー画面など、状態によって処理(実行する関数)を変えることにより、効率のよいプログラムを作成できる。では、具体的にどのようなプログラムを作ればいいかを考える。
例えばスタート画面を表示する処理では次のように考える。
![]()
《解説》
- UpdateFrame関数内で、
g_FrameNoの値によって実行する関数が振り分けられているため、関数内ではそれぞれの処理のみを行えばいい。- g_FrameNoの値を変えて関数を終了すれば、
次のループで別の関数が実行される。
6-1のフローチャートのようにスタート画面処理を作成すると、次のようになる。
/* プロトタイプ宣言 */ void StartInit(HWND hWnd); void StartFrame(HWND hWnd); //----------------------------------------------------------------------------- // 関数名 : StartInit() // 機能概要: スタート処理初期化 //----------------------------------------------------------------------------- void StartInit(HWND hWnd) { //------------------------------------------------------- 各変数の初期化 //------------------------------------------------------- フレームナンバーセット g_FrameNo = START_FRAME; } //----------------------------------------------------------------------------- // 関数名 : StartFrame() // 機能概要: 画面更新処理 //----------------------------------------------------------------------------- void StartFrame(HWND hWnd) { // スタート画面用の背景画像を転送 // タイトル画像をバックバッファに転送 // START画像(Push SpaceKey to Start)をバックバッファに転送 // スペースキーが押されたら、ゲーム開始 if (KeyTbl[VK_SPACE] & 0x80) { g_FrameNo = GAME_INIT; return; } }《解説》
- 初期化処理では、スタート画面表示処理で使用する各変数に対して初期値をセットし、最後にg_FrameNoの値を変更する。
- スタート画面表示処理では、背景を塗りつぶした後、タイトル画像とスタート画像を表示している。関数終了時にスペースキーが押されているかどうかを調べ、押されていたらg_FrameNoの値を変更する。
- ゲーム処理やゲームオーバー処理なども、この考え方で作成できる。
- 描画処理については次章で解説する。
スケルトンプログラムにスタート処理を組み込むには、次の手順で行う。
- 6-2のプログラム(プロトタイプ宣言と、2つの関数)を追加する。
- UpdateFrame関数のswitch文を次のように修正する。
switch (g_FrameNo) { case START_INIT:StartInit(hWnd);case START_FRAME:StartFrame(hWnd);break; case GAME_INIT: // ゲーム画面を表示する前に実行する初期化関数を実行 case GAME_FRAME: // ゲーム画面表示処理関数を実行 break; default: OutputDebugString("g_FrameNoの値が例外です。\n"); }※画面更新に関する処理を一切追加していないため、実行結果は変わらない。
補足
実習で使用するプログラムでは、DirectDraw関係の関数を1本のソースファイル「myDraw.cpp」「myDraw.h」にまとめ、ほかのソースファイルから利用できるようにしてある。
エラー処理も含めてあるため、実際に使う際には(ある程度は)エラー処理を考えなくてもいい。