第2章 Windowsプログラムをゲーム用に改造する

2-6 状態別処理の考え方とプログラム

スタート画面とゲーム画面、ゲームオーバー画面など、状態によって処理(実行する関数)を変えることにより、効率のよいプログラムを作成できる。では、具体的にどのようなプログラムを作ればいいかを考える。

(a) 考え方

例えばスタート画面を表示する処理では次のように考える。

《解説》

(b) 実際のプログラム

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;
    }

}

《解説》

(c) スタート処理を追加する

スケルトンプログラムにスタート処理を組み込むには、次の手順で行う。

  1. 6-2のプログラム(プロトタイプ宣言と、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」にまとめ、ほかのソースファイルから利用できるようにしてある。
エラー処理も含めてあるため、実際に使う際には(ある程度は)エラー処理を考えなくてもいい。


[ TOP ] [ Next ]