シーン:タイトル

ここではタイトル画面の制御方法について説明しています。

タイトル画面ではゲーム開始の他に、タイトル画面で放置した場合にゲームのデモンストレーション開始と、設定画面への遷移の3つの処理が行われます。このうち、設定画面へはF5キーを押すことで強制的に遷移するため、これについてはあまり考慮する必要はありません。また、デモンストレーションへの遷移はシステム側のタイマーにて自動的に遷移しますが、このタイマーの開始と停止はスキン側で指示する必要があります。
外部スクリプトファイル
システムスキンのサンプルでは、タイトル画面の処理は_02_title.luaファイルにまとめられています。script.luaからこのファイルをinclude()関数を使って取り込むことで、最終的にscript.luaに定義されたものとして読み込まれます。
スクリプトによる制御方法
タイトル画面に遷移すると一度だけOnStartTitle()が呼び出されるので、ここでタイトル画面で使用するリソースをロードしたり、変数の初期化などを行います。

次にタイトル処理中は毎フレームOnRunTitle()が呼ばれるので、ここで演算と画面描画などを行います。

STARTボタンが押されるとOnEndTitle()が呼び出されるので、それ以降にhdxNextScene()を呼び出すことでタイトル画面を終了させることが出来ます。なおhdxNextScene()を呼び出すと即座にタイトルが終了してしまうので、フェードアウトなど開始時の演出を行いたい場合は、例えばOnEndTitle()では終了フラグを立てるだけで、実際にhdxNextScene()を呼び出すのはOnRunTitle()内で演出が完了したことを確認したら呼び出すようにします。

タイトル画面では一定時間経過したらデモプレイが始まりますが、タイトル演出中にデモが開始されてしまうのを防ぐため、タイトル遷移直後はデモ画面に行かないようにシステムで制限しています。デモ開始までの時間は設定ファイルに記述されており、このデモ開始までのタイマーを動作させるためには、タイトル画面でユーザーのスタート待ち状態になった段階でhdxStartDemoTimer()を呼び出す必要があります。

ただし、ユーザーがスタートを押した時に画面をフェードアウトするような演出を行う場合、デモタイマーは動作中のためタイミングによってはフェードアウト中にデモが開始されてしまいます。これを防ぐためにはOnEndTitle()にてフェードアウト演出を行うと同時に、hdxStopDemoTimer()を呼び出してデモタイマーを停止します。

なおOnEndTitle()はSTARTボタンが押されるごとに呼び出されますが、もしフェードイン中などでまだ遷移をさせたくない場合は無視することが可能です。これは遷移はあくまでもhdxNextScene()を呼び出して行うことになっているためで、OnEndTitle()は単にSTARTボタンのトリガーイベントとしての役割しかありません。

裏技としてはOnEndTitle()が呼ばれたらフェードインなどの演出をスキップさせるというような使い方が考えられます。
サンプルコード
このサンプルでは以下の処理を行っています。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// タイトル画面
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// タイトルステート
TITLEST_INIT        = 0;
TITLEST_WAIT        = 1;
TITLEST_START       = 2;

g_dwTitleState      = TITLEST_INIT;                 // タイトルステート管理

///////////////////////////////////////////////////////////////////////
// タイトル画面が始まる際に呼び出される。
///////////////////////////////////////////////////////////////////////
function OnStartTitle()
    // ステート初期化
    g_dwTitleState = TITLEST_INIT;

    // 3Dモデルロード
    hdxMatrixRotationX( 0,hdxToRadian(90) );        // 3dsMax座標補正
    hdxLoadModel( 0,"title.x",0 );                  // 90度回転した状態を基本姿勢としてxファイルをロード

    // アニメーションロード
    hdxLoadAnime( 0,"title.hda",0 );                // タイトルアニメ
    hdxCtrlAnime( 0,CTRLMODE_AUTO_END,0,0,-1 );     // 最後のフレームで止める

    hdxLoadAnime( 1,"lighting.hda",0 );             // 背景ライティング
    hdxCtrlAnime( 1,CTRLMODE_AUTO_LOOP,0,0,-1 );    // ループ

    hdxLoadAnime( 2,"title_btn.hda",0 );            // PRESS START BUTTON
    hdxCtrlAnime( 2,CTRLMODE_MANUAL,-1,0,-1 );      // 停止&非表示

    hdxLoadAnime( 3,"title_gc.hda",0 );             // [F5] Config
    hdxCtrlAnime( 3,CTRLMODE_MANUAL,-1,0,-1 );      // 停止&非表示

    hdxLoadAnime( 4,"title_start.hda",10 );         // STARTアニメ
    hdxCtrlAnime( 4,CTRLMODE_MANUAL,-1,0,-1 );      // 停止&非表示
end

///////////////////////////////////////////////////////////////////////
// タイトル画面で毎フレーム呼び出されるので、ここで演算と描画処理を行う。
///////////////////////////////////////////////////////////////////////
function OnRunTitle( upd_frm )
    ///////////////////////////////////
    // 処理
    ///////////////////////////////////
    if( g_dwTitleState==TITLEST_INIT ) then
        if( hdxIsEndAnime(0)==TRUE ) then
            // メイン待機へ
            trace( "メイン待機へ" );
            hdxCtrlAnime( 2,CTRLMODE_AUTO_LOOP,0,0,-1 );        // PRESS START BUTTONのループ表示
            hdxCtrlAnime( 3,CTRLMODE_AUTO_END,0,0,15 );         // [F5] Config登場後停止
            hdxStartDemoTimer();                                // デモカウンタ開始
            g_dwTitleState = TITLEST_WAIT;
        end
    elseif( g_dwTitleState==TITLEST_WAIT ) then
        // 開始待ちはボタン押下まで何もしない
    elseif( g_dwTitleState==TITLEST_START ) then
        if( hdxIsEndAnime(4)==TRUE ) then
            trace( "タイトル画面終了" );
            hdxNextScene();
        end
    end

    ///////////////////////////////////
    // 描画
    ///////////////////////////////////

    // 3Dモデル
    hdxSetZBuffer( TRUE );
    hdxMatrixRotationY( 0, hdxToRadian( ((hdxGetTime()%(360*60))/60) ) );
    hdxSetLookAt( 0,0,40, 0,0,0, 0,1,0 );
    hdxSetViewport( 0,0,RENDER_WIDTH,RENDER_HEIGHT );
    hdxDrawModel( 0,0 );                                // 背景オブジェクト
    hdxSetZBuffer( FALSE );

    // アニメ
    hdxDrawAnime( 1,   0,  0,  1.0, 1.0 );                  // 背景ライティング
    hdxDrawAnime( 0,   0,  0,  1.0, 1.0 );                  // タイトル
    hdxDrawAnime( 2, 640, 520, 1.0, 1.0 );                  // PRESS START BUTTON
    hdxDrawAnime( 3,   0,  0,  1.0, 1.0 );                  // CONFIG
    hdxDrawAnime( 4,   0,  0,  1.0, 1.0 );                  // スタートアニメ
end

///////////////////////////////////////////////////////////////////////
// タイトル画面でスタートボタンが押されたら呼び出される。
///////////////////////////////////////////////////////////////////////
function OnEndTitle()
    if( g_dwTitleState==TITLEST_WAIT ) then
        hdxCtrlAnime( 3,CTRLMODE_AUTO_END,15,15,-1 );   // [F5] Config退場後停止
        hdxCtrlAnime( 4,CTRLMODE_AUTO_END,0,0,-1 );     // スタートアニメ開始
        hdxStopDemoTimer();                             // デモカウンタ停止
        g_dwTitleState = TITLEST_START;
    end
end