Windowsプログラムは次のような構造で作成されている。
![]()
《解説》
このプログラムは、Windowsから何かのメッセージが届くまで制御が戻ってこず、止まったままになっている(イベント・ドリブン方式)。
一般的なゲームは(おそらく)次のような処理を行っている。
- 1.初期化処理
- 環境の確保、パラメータ(変数)の初期化など
- 2.メインループ(1フレーム表示ごとに1回ループ)
- オープニング表示(タイトル画面、オープニングムービーなど)
- ゲームメイン
- エンディング表示(ゲームオーバー画面、エンディングムービーなど)
- 3.終了処理
- 環境の開放など
![]()
《解説》
Windowsからのメッセージを待つのではなく、
永久ループにする。
2-2のフローチャートのようにWinMain関数を改造すると次のようになる。
//----------------------------------------------------------------------------- // 関数名 : WinMain() // 機能概要: メイン関数、メッセージループの生成 //----------------------------------------------------------------------------- int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode) { MSG msg; HWND hWnd; /* 表示するウィンドウの定義、登録、表示 */ if (!(hWnd = InitApp(hThisInst, nWinMode))) return FALSE; /* ゲーム・ループ */while (TRUE){if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) // メッセージがあるかどうか{if (!GetMessage(&msg, NULL, 0, 0)) // メッセージを取得し、WM_QUITかどうかbreak;TranslateMessage(&msg); //キーボード利用を可能にするDispatchMessage(&msg); //制御をWindowsに戻す}else // ゲームメイン処理{//UpdateFrame(hWnd); //UpdateFrame関数はまだ作っていないため、コメントアウトSleep(1);}}return msg.wParam; }《解説》
- WM_QUITメッセージが来ると、無限ループを抜ける。
- ゲームメイン処理は
UpdateFrame関数で行う。