スタートボタンを押してから一定時間経過後、ゲームが開始する

次は、スタート画面からゲーム画面に切り替わる際、すぐに切り替えるのではなく一定時間待機してからゲーム画面に切り替わるようなプログラムを考える。
本来ならメニューでスタートを選択したら、スタートの文字が点滅するなどのアクションが起こった後にゲームが開始されるようにするが、今回は時間の制御がメインであるため、それらのアニメーションは割愛する。
04のプログラムが正常に動くことを確認しておくこと。

リターンキー挿入後、一定時間待機してからゲーム画面に切り替える処理を追加する

リターンキーを押してから一定時間が経過したら、ゲーム画面に切り替わるようにプログラムを修正する。待機中は、デモ画面に移るなどの処理が行われないような工夫が必要である。様々な方法が考えられるが、そのうちの1つを紹介する。

マクロとグローバル変数を宣言

スタート画面からゲーム画面に切り替わるまでの時間と、リターンキーを押したときの時間を保存する変数を宣言する。

//=============================================================================
//  スタート処理関係の自作関数群
//  Copyright NKC Game Staff(←自分の名前) 
//-----------------------------------------------------------------------------
#include "NKC_Common.h"

// マクロの定義
#define DEMOSTART_TIME 5000 // デモ画面に切り替わる時間(ミリ秒)
#define GAMESTART_TIME 7000 // ゲーム画面に切り替わる時間(ミリ秒)

// グローバル変数
/* 自ソースでのみ利用するもの */
static TLVERTX BackVertex[4];               // 背景用頂点情報配列
static TLVERTX MenuVertex[4];               // メニュー用頂点情報配列
static TLVERTX CursorVertex[4];             // カーソル用頂点情報配列
static DWORD gl_beforeTime;                 // 計測開始時間を保存
static DWORD gl_gameWaitTime;               // ゲーム開始選択時間を保存

《POINT》

初期化処理(StartInit関数)の修正

スペースキーを押した時間をセットする変数を初期化するよう、初期化処理(StartInit関数)を修正する。現在の時間(gl_nowTime)をセットしていないことに注意!!

//--------------------------------------------------- 各変数の初期化
/* 背景 */
InitVertex(BackVertex, (float)gl_rcScreen.left, (float)gl_rcScreen.top, (float)gl_rcScreen.right, (float)gl_rcScreen.bottom, 255);
/* メニュー */
MenuInitVertex(MenuVertex, 200.0f, 250.0f, 400.0f, 442.0f);
/* カーソル */
MenuInitVertex(CursorVertex, 150.0f, 250.0f, 200.0f, 300.0f);
/* 時間のセット */
gl_beforeTime = gl_nowTime;
gl_gameWaitTime = 0;

《POINT》

スタート処理(StartFrame関数)の修正

リターンキーが押されたら、その時間をセットし、セットした時間から一定時間が経過したらゲーム画面に移るようにプログラムを修正する。

//-----------------------------------------------------------------------------
// 関数名 : StartFrame()
// 機能概要: スタート画面処理
//-----------------------------------------------------------------------------
void StartFrame(void)
{
    /* 描画処理 */
    // 背景
    gl_lpD3ddev->SetTexture(0, gl_TXBack);
    gl_lpD3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, BackVertex, sizeof(TLVERTX));
    // メニュー
    gl_lpD3ddev->SetTexture(0, gl_TXMenu);
    gl_lpD3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, MenuVertex, sizeof(TLVERTX));
    // カーソル
    gl_lpD3ddev->SetTexture(0, gl_TXCursor);
    gl_lpD3ddev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, CursorVertex, sizeof(TLVERTX));

    // リターンキーが押されたかどうかによって、実行する処理を変える
    if ( gl_gameWaitTime == 0 ) {
        // カーソルキーを押したら計測開始時間をクリアする
        if ( gl_KeyTbl[VK_UP] & 0x80 || gl_KeyTbl[VK_DOWN] & 0x80) gl_beforeTime = gl_nowTime;

        // 一定時間経過したら、デモ画面に切り替える
        if ( gl_nowTime - gl_beforeTime > DEMOSTART_TIME ) {
            ReleaseStartTexture();
            g_FrameNo = DEMO_INIT;
        }

        // リターンキーが押されたら、時間をセット
        if ( gl_KeyTbl[VK_RETURN] & 0x80 ) gl_gameWaitTime = gl_nowTime;
    } else if ( gl_nowTime - gl_gameWaitTime > GAMESTART_TIME ) {
        ReleaseStartTexture();
        g_FrameNo = GAME_INIT;
    }

}

《POINT》

※以上の修正を行ったらビルドを行い、リターンキーを押したらデモ画面に切り替わることなくゲーム画面に切り替わることを確認する。

問題点

時間制御をメインに解説したため、プログラム的にはあまり美しいものではない。しかし、どう使うかによってプログラムはまったく変わるため、どのように組めばいいかという決まった形は存在しないと考えたほうがいいだろう。
いずれにせよ、時間を自由にコントロールできるようになれば、ゲーム製作においてスムーズなプログラムが行えるようになると共に、時間を使った様々なアイデアが浮かぶようになるだろう。


BACK(一定時間経過したら、デモが流れる) NEXT(カーソルの移動制御(メニューの選択))