ロゴムービーが流れてからスタート画面を表示させるには?

ゲームにおいて、ムービーの再生はいろんなところで実行される。スタート画面から一定時間経過するとでもムービーが流れたり、RPGの戦闘画面で魔法を使ったときにムービーが流れたり、いろんな使い方が考えられる。

今回はゲーム実行時にロゴムービーが流れ、ムービーが終了したらスタート画面が表示されるプログラムを作成する。

ロゴムービーのサンプルファイル(logo.mpg)

ロゴ場面の追加

スタート場面やゲーム場面などと同じ扱いで、ロゴ場面を作成する。ゲーム実行時、ロゴムービーが表示され、ロゴムービーが終わってからスタート画面が表示されるプログラムを考える。
また、ロゴムービー実行中は他の処理が行えないようにする。

1.ロゴ場面用の状態別の値を作成

デモ場面を状態別処理として扱うため、NKC_Common.hに状態を判別する値を次のように追加する。

/* ゲームの状態を識別する(フレーム番号) */
#define LOGO_FRAME       0
#define START_INIT      10
#define START_FRAME     11
#define GAME_INIT       20
#define GAME_STAGEINIT  21
#define GAME_FRAME      22
#define GAMEOVER_INIT   80
#define GAMEOVER_FRAME  81
#define GAMECLEAR_INIT  90
#define GAMECLEAR_FRAME 91

《注意》

2.フレーム番号の初期化の修正

ゲーム実行時、最初にLOGO_FRAMEを通るよう、フレーム番号の初期値を次のように修正する。

//-------------------------------------------------------------------------------------------------
// 問題番号:******
//  問題内容:******************************
//  Copyright NKC Game Staff(←自分の名前) 
//-------------------------------------------------------------------------------------------------
#include "NKC_Common.h"

// グローバル変数
/* 他ソースも利用するもの */
HWND hWnd;                              // ウィンドウハンドル
BOOL g_appActive = FALSE;               // ウィンドウの状態
BYTE g_FrameNo = LOGO_FRAME;            // フレーム選択用
DWORD gl_nowTime;                       // 現在の時間を保存
BYTE gl_KeyTbl[256];                    // キーボードの状態を格納
RECT gl_rcScreen = {0, 0, 640, 480};    // ウィンドウ領域

3.ロゴ実行処理の追加

フレーム番号(gl_FrameNo)がLOGO_FRAMEの時にロゴムービーが実行されるよう、プログラムを修正する。ムービーを再生し、終了するまで待機(制御を戻さない)する関数をNKC_DShow.cppに用意しているため、その関数を利用して、WinMain.cppのUpdateFrame関数を次のように修正する。

//-----------------------------------------------------------------------------
// 関数名 : UpdateFrame()
// 機能概要: ゲームメイン処理
//-----------------------------------------------------------------------------
BOOL UpdateFrame(void)
{
    /* 現在の時間を取得 */
    gl_nowTime = timeGetTime();

    /* 現在のキー情報を取得 */
    if ( !GetKeyboardState(gl_KeyTbl) ) {
        MessageBox(hWnd, "キー情報の取得に失敗", "ERROR", MB_OK);
        return (FALSE);
    }

    /* 画面のクリア */
    gl_lpD3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 0.0, 0);
    /* シーン開始 */
    gl_lpD3ddev->BeginScene();
    /* 頂点フォーマットを設定 */
    gl_lpD3ddev->SetVertexShader(FVF_TLVERTEX);

    /* 処理の振り分け */
    switch ( g_FrameNo ) {
        case LOGO_FRAME:
            // ロゴムービーを再生する(再生後、START_INITに流れる)
            MoviePlayNonStop("logo.mpg");
        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);
    }

    /* シーン終了 */
    gl_lpD3ddev->EndScene();
    /* フリップ(ムービー再生中はフリップを行わない) */
    if ( g_movieFlg == FALSE ) gl_lpD3ddev->Present(NULL, NULL, NULL, NULL);

    return (TRUE);
}

《POINT》

※以上の修正を行ったらビルドを実行し、ロゴムービー再生後にスタート画面が表示されることを確認する。


BACK(NKC_DShow.cppファイルの組み込み) BACK(一定時間経過したらデモムービーを流すには?)