ゲームにおいて、ムービーの再生はいろんなところで実行される。スタート画面から一定時間経過するとでもムービーが流れたり、RPGの戦闘画面で魔法を使ったときにムービーが流れたり、いろんな使い方が考えられる。
今回はゲーム実行時にロゴムービーが流れ、ムービーが終了したらスタート画面が表示されるプログラムを作成する。
スタート場面やゲーム場面などと同じ扱いで、ロゴ場面を作成する。ゲーム実行時、ロゴムービーが表示され、ロゴムービーが終わってからスタート画面が表示されるプログラムを考える。
また、ロゴムービー実行中は他の処理が行えないようにする。
デモ場面を状態別処理として扱うため、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
ゲーム実行時、最初に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}; // ウィンドウ領域
フレーム番号(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);
}
※以上の修正を行ったらビルドを実行し、ロゴムービー再生後にスタート画面が表示されることを確認する。
| BACK(NKC_DShow.cppファイルの組み込み) | BACK(一定時間経過したらデモムービーを流すには?) |