ゲーム製作において、時間を使った処理はありとあらゆる場面で使われる。よって、現在の時間を取得する処理はUpdateFrame関数内で行い、取得した時間をグローバル変数として他の様々なソースから利用できるようにしておいたほうがよい。よって、プログラムを次のように修正しておく。
timeGetTime関数を実行すれば現在の時間を取得できるが、一度のループで何度も実行するのは効率が悪い。ゲームループのたびに必ず実行されるUpdateFrame関数内でtimeGetTime関数を一度だけ実行し、取得した値を他のソースから利用できるようにプログラムを修正する。
// グローバル変数 /* 他ソースも利用するもの */ HWND hWnd; // ウィンドウハンドル BOOL g_appActive = FALSE; // ウィンドウの状態 BYTE g_FrameNo = START_INIT; // フレーム選択用 DWORD gl_nowTime; // 現在の時間を格納 BYTE gl_KeyTbl[256]; // キーボードの状態を格納 RECT gl_rcScreen = {0, 0, 640, 480}; // ウィンドウ領域 /* 自ソースでのみ利用するもの */ static char szWinName[] = "Exer008"; // ウィンドウクラス用文字列 static char szWinTitle[] = "時間制御"; // ウィンドウクラス用文字列 ・ ・ ・ //----------------------------------------------------------------------------- // 関数名 : UpdateFrame() // 機能概要: ゲームメイン処理 //----------------------------------------------------------------------------- void UpdateFrame(void) { #ifdef DEBUG static DWORD beforeTime = 0; // 以前の時間を格納 static int fps = 0; // FTPカウンタ char buff[80]; // 文字列表示用バッファ #endif /* 現在の時間を取得 */ gl_nowTime = timeGetTime(); /* 現在のキー情報を取得 */ if ( !GetKeyboardState(gl_KeyTbl) ) { MessageBox(hWnd, "キー情報の取得に失敗", "ERROR", MB_OK); return (FALSE); } /* 画面のクリア */ gl_lpD3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255), 0.0, 0); /* シーン開始 */ gl_lpD3ddev->BeginScene(); /* 頂点フォーマットを設定 */ gl_lpD3ddev->SetVertexShader(FVF_TLVERTEX); /* 処理の振り分け */ switch ( g_FrameNo ) { case START_INIT: // スタート画面を表示する前に実行する初期化関数を実行 StartInit(); case START_FRAME: // スタート画面表示処理関数を実行 StartFrame(); break; case GAME_INIT: // ゲーム画面を表示する前に実行する初期化関数を実行 GameInit(); case GAME_FRAME: // ゲーム画面表示処理関数を実行 GameFrame(); break; default: MessageBox(hWnd, "g_FrameNoの値が例外です。", "ERROR", MB_OK); return (FALSE); } #ifdef DEBUG /* FPSを求めて表示する */ fps++; // カウントアップ if ( gl_nowTime - beforeTime >= 1000 ) { // FPSの表示 wsprintf(buff, "%04d FPS\n", fps); OutputDebugString(buff); // 初期化 fps = 0; beforeTime = gl_nowTime; } #endif /* シーン終了 */ gl_lpD3ddev->EndScene(); /* フリップ */ gl_lpD3ddev->Present(NULL, NULL, NULL, NULL); return (TRUE); }
UpdateFrame関数内で取得した時間をグローバル変数に格納しておけば、他の様々な関数から自由に利用できる。他のソースから利用できるよう、共通ヘッダファイルを次のように修正する。
// グローバル変数
/* WinMain.cppで宣言されているもの */
extern HWND hWnd; // ウィンドウハンドル
extern BYTE g_FrameNo; // フレーム選択用
extern DWORD gl_nowTime; // 現在の時間を格納
extern BYTE gl_KeyTbl[256]; // キーボードの状態を格納
extern RECT gl_rcScreen; // ウィンドウ領域
以上の修正を行うことにより、UpdateFrame関数で取得した時間(gl_nowTime)を、WinMain.cpp以外の様々なソースから利用できるようになる。
| BACK(FPSを調べる) | NEXT(一定時間経過したら、デモが流れる) |