取得した時間を他のソースから利用する

ゲーム製作において、時間を使った処理はありとあらゆる場面で使われる。よって、現在の時間を取得する処理はUpdateFrame関数内で行い、取得した時間をグローバル変数として他の様々なソースから利用できるようにしておいたほうがよい。よって、プログラムを次のように修正しておく。

現在の時間を取得し、グローバル変数として利用させる処理

timeGetTime関数を実行すれば現在の時間を取得できるが、一度のループで何度も実行するのは効率が悪い。ゲームループのたびに必ず実行されるUpdateFrame関数内でtimeGetTime関数を一度だけ実行し、取得した値を他のソースから利用できるようにプログラムを修正する。

WinMain.cppの修正

// グローバル変数
/* 他ソースも利用するもの */
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);
}

《POINT》

取得した時間を他のソースから利用する

UpdateFrame関数内で取得した時間をグローバル変数に格納しておけば、他の様々な関数から自由に利用できる。他のソースから利用できるよう、共通ヘッダファイルを次のように修正する。

NKC_Common.hの修正

// グローバル変数
/* WinMain.cppで宣言されているもの */
extern HWND hWnd;                           // ウィンドウハンドル
extern BYTE g_FrameNo;                      // フレーム選択用
extern DWORD gl_nowTime;                    // 現在の時間を格納
extern BYTE gl_KeyTbl[256];                 // キーボードの状態を格納
extern RECT gl_rcScreen;                    // ウィンドウ領域

《POINT》

以上の修正を行うことにより、UpdateFrame関数で取得した時間(gl_nowTime)を、WinMain.cpp以外の様々なソースから利用できるようになる。


BACK(FPSを調べる) NEXT(一定時間経過したら、デモが流れる)