シーン:ゲームモード

ここではゲームモード選択画面の制御方法について説明しています。

この画面では、ビギナー、スタンダード、エキスパート、段位認定、フリープレイの5種類のゲームモードの選択を行います。ただし、ログインしたかどうかにより選択できるゲームモードが限られるため、選択できないモードは選択不可の状態として表示しなければなりません。なお、選択可能なモードはhdx関数から取得することが出来るので、自前でログインしたかどうかなどを判断してモードの表示・非表示を制御する必要はありません。またゲームの実装状況により、ログインしてもしなくてもまだ選択できないモードがあるため、必ずhdx関数により選択可能かどうかを判定してください。
外部スクリプトファイル
システムスキンのサンプルでは、ゲームモード画面の処理は_04_gamemode.luaファイルにまとめられています。script.luaからこのファイルをinclude()関数を使って取り込むことで、最終的にscript.luaに定義されたものとして読み込まれます。
スクリプトによる制御方法
まずこの画面が開始される時にOnStartGameMode()が呼び出されるので、ここでゲームモード選択で使用するリソースをロードしたり変数の初期化などを行います。

次にゲームモード選択中は毎フレームOnRunGameMode()が呼ばれるので、ここでゲームモード選択画面用の演算と画面描画などを行います。

スクラッチを回すことで選択中のゲームモードが移動しますが、この時ゲームモードが変化するごとにOnChangeGameMode()が呼び出されます。また、この関数の引数には新たに選択された項目が渡されるので、これを利用して画面に反映させます。

鍵盤が押されゲームモードが決定されるとOnEndGameMode()が呼び出されます。この時最後に決定したゲームモードが引数に渡されますが、タッチ操作などによりOnChangeGameMode()が呼び出されずに直接この関数が呼び出されることがあるため、OnChangeGameMode()と同様にOnEndGameMode()のモード値を必ず画面に反映させてください。
サンプルコード
このサンプルでは以下の処理を行っています。

ゲームモード選択画面用スクリプト

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ゲームモード選択
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

GMST_START          = 0;
GMST_SELECT         = 1;
GMST_END            = 2;

g_dwGMState         = GMST_START;
g_dwGMSelect        = 0;
g_iGMMenuCount      = { 0,0,0,0,0 };
g_bGMPlayerLight    = FALSE;                        // プレイヤーライティングが表示されたか

///////////////////////////////////////////////////////////////////////
// ゲームモード画面が始まる際に呼び出される。
///////////////////////////////////////////////////////////////////////
function OnStartGameMode( gmode )
    trace( "OnStartGameMode : "..gmode );
    g_dwGMSelect        = gmode;

    g_dwGMState         = GMST_START;
    g_iGMMenuCount[1]   = 30;                           // 配列は1から
    g_iGMMenuCount[2]   = 34;
    g_iGMMenuCount[3]   = 38;
    g_iGMMenuCount[4]   = 42;
    g_iGMMenuCount[5]   = 46;
    g_bGMPlayerLight    = FALSE;

    // 3Dモデルロード
    hdxMatrixRotationX( 0,hdxToRadian(90) );            // 3dsMax座標補正
    hdxLoadModel( 0,"title.x",0 );

    // アニメーションロード
    hdxLoadAnime( 0,"frame.hda",0 );                    // 共通フレーム
    hdxCtrlAnime( 0,CTRLMODE_AUTO_END,0,110,-1 );       // 

    hdxLoadAnime( 1,"gm_start.hda",0 );                 // ゲームモード開始演出
    hdxCtrlAnime( 1,CTRLMODE_AUTO_END,0,0,-1 );         // 

    hdxLoadAnime( 2,"star.hda",0 );                     // 星アニメ
    hdxCtrlAnime( 2,CTRLMODE_AUTO_LOOP,0,0,-1 );        // 

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

    hdxLoadAnime( 4,"gm_finish.hda",10 );               // ゲームモード確定演出
    hdxCtrlAnime( 4,CTRLMODE_MANUAL,-1,0,-1 );          // 

    hdxLoadAnime( 5,"pl_light1.hda",0 );                // 1P側プレイヤーライト
    hdxCtrlAnime( 5,CTRLMODE_MANUAL,-1,0,-1 );          // 

    hdxLoadAnime( 6,"pl_light2.hda",0 );                // 2P側プレイヤーライト
    hdxCtrlAnime( 6,CTRLMODE_MANUAL,-1,0,-1 );          // 

    // ゲームモード名
    hdxLoadAnime( 10,"gm_mode01.hda",0 );               // 
    hdxCtrlAnime( 10,CTRLMODE_MANUAL,-1,0,-1 );         // 
    hdxLoadAnime( 11,"gm_mode02.hda",0 );               // 
    hdxCtrlAnime( 11,CTRLMODE_MANUAL,-1,0,-1 );         // 
    hdxLoadAnime( 12,"gm_mode03.hda",0 );               // 
    hdxCtrlAnime( 12,CTRLMODE_MANUAL,-1,0,-1 );         // 
    hdxLoadAnime( 13,"gm_mode04.hda",0 );               // 
    hdxCtrlAnime( 13,CTRLMODE_MANUAL,-1,0,-1 );         // 
    hdxLoadAnime( 14,"gm_mode05.hda",0 );               // 
    hdxCtrlAnime( 15,CTRLMODE_MANUAL,-1,0,-1 );         // 

    // 画像のロード
    hdxLoadImage( 0,"gm_image.tga" );
    // 切り抜き
    hdxSetPutRange( 0,0,704,48,259,44,129,22 );         // cursor_disable_off
    hdxSetPutRange( 1,0,440,96,259,44,129,22 );         // cursor_disable_on
    hdxSetPutRange( 2,0,704,0,259,44,129,22  );         // cursor_off
    hdxSetPutRange( 3,0,440,48,259,44,129,22 );         // cursor_on
    hdxSetPutRange( 4,0,864,96,143,25,71,12  );         // mode_beginner
    hdxSetPutRange( 5,0,704,96,154,25,77,12  );         // mode_standard
    hdxSetPutRange( 6,0,112,120,108,24,54,12 );         // mode_expert
    hdxSetPutRange( 7,0,0,120,112,28,56,14   );         // mode_class
    hdxSetPutRange( 8,0,224,120,71,24,35,12  );         // mode_free
    hdxSetPutRange( 9,0,0,0,697,48,348,24    );         // not_select
    hdxSetPutRange( 10,0,0,48,439,70,219,35  );         // player_light


    // サウンドロード
    hdxLoadSound( 0,"gm_bgm.wav" );
    hdxLoadSound( 1,"gm_cursor.wav" );

    // BGM再生
    hdxPlaySound( 0,TRUE );

    // 初期選択のモードアニメを開始
    hdxCtrlAnime( g_dwGMSelect+10,CTRLMODE_AUTO_END,0,0,30 );
end


///////////////////////////////////////////////////////////////////////
// ゲームモード画面で毎フレーム呼び出されるので、ここで演算と描画処理を行う。
///////////////////////////////////////////////////////////////////////
function OnRunGameMode( upd_frm )

    ///////////////////////////////////
    // 処理
    ///////////////////////////////////

    // プレイ可能なゲームモードを取得
    local game_mode = hdxIsSupportedGameMode();
    // インデックス配列に変換
    local game_mode2 = { game_mode["beginner"],game_mode["standard"],game_mode["expert"],game_mode["class"],game_mode["free"] };

    if( g_dwGMState==GMST_START ) then
        if( hdxIsEndAnime(1)==TRUE ) then
            hdxEnableGameMode();
            g_dwGMState = GMST_SELECT;
        end
    elseif( g_dwGMState==GMST_SELECT ) then

    elseif( g_dwGMState==GMST_END ) then
        if( hdxIsEndAnime(4)==TRUE ) then
            hdxNextScene();
        end
    end

    // プレイヤーライトの開始処理
    if( g_bGMPlayerLight==FALSE ) then
        // まだ開始していなければ
        if( hdxGetAnimeFrame(0)>=80 ) then
            // プレイヤーライトアニメの開始
            local game_info = hdxGetGameInfo();
            if( game_info["pmode"]==0 ) then
                // シングル左側なら
                hdxCtrlAnime( 5,CTRLMODE_AUTO_LOOP,0,0,-1 );
            elseif( game_info["pmode"]==1 ) then
                // シングル右側なら
                hdxCtrlAnime( 6,CTRLMODE_AUTO_LOOP,0,0,-1 );
            else
                // ダブルなら
                hdxCtrlAnime( 5,CTRLMODE_AUTO_LOOP,0,0,-1 );
                hdxCtrlAnime( 6,CTRLMODE_AUTO_LOOP,0,0,-1 );
            end
            // プレイヤーライトが開始された
            g_bGMPlayerLight = TRUE;
        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( 3, 0, 0, 1.0, 1.0 );                  // ライティング

    // カーソル表示
    for i=0,4 do

        // 移動
        g_iGMMenuCount[i+1] = g_iGMMenuCount[i+1] - 1;
        if( g_iGMMenuCount[i+1] < 0 ) then
            g_iGMMenuCount[i+1] = 0;
        end

        local x = (1 - math.cos( g_iGMMenuCount[i+1]*3*math.pi/180 )) * 480 + 1070;
        local y = i * 62 + 238;
        if( i==g_dwGMSelect ) then
            // 選択
            if( game_mode2[i+1]==TRUE ) then
                hdxPut( 3,x-16,y );
            else
                hdxPut( 1,x-16,y );
            end
            hdxPut( 4+i,x-16,y );
        else
            // 非選択
            if( game_mode2[i+1]==TRUE ) then
                hdxPut( 2,x,y );
            else
                hdxPut( 0,x,y );
            end
            hdxPut( 4+i,x,y );
        end
    end


    hdxDrawAnime( 0, 0, 0, 1.0, 1.0 );                  // フレーム
    hdxDrawAnime( 2, 1150, 67, 1.0, 1.0 );              // 星

    // プレイヤーライト(選択画面以降でアニメーション表示)
    hdxDrawAnime( 5, 224, 651, 1.0, 1.0 );              // 1P側
    hdxDrawAnime( 6,1056, 651, 1.0, 1.0 );              // 2P側

    hdxDrawAnime( g_dwGMSelect+10, 0, 0, 1.0, 1.0 );    // モードアニメ

    hdxDrawAnime( 1, 0, 0, 1.0, 1.0 );                  // スタートフェード

    hdxDrawAnime( 4, 0, 0, 1.0, 1.0 );                  // 終了アニメ
end


///////////////////////////////////////////////////////////////////////
// ゲームモードが選択されるごとに呼び出される。
//   gmode : 0=BEGINNER、1=STANDARD、2=EXPERT、3=CLASS、4=FREE
///////////////////////////////////////////////////////////////////////
function OnChangeGameMode( gmode )
    // 選択変更
    g_dwGMSelect    = gmode;

    // SE再生
    hdxPlaySound( 1,FALSE );

    // 選択したモードのアニメを最初から再生
    hdxCtrlAnime( g_dwGMSelect+10,CTRLMODE_AUTO_END,0,0,30 );
end


///////////////////////////////////////////////////////////////////////
// ゲームモードが確定した際に呼び出される。
///////////////////////////////////////////////////////////////////////
function OnEndGameMode( gmode )
    // 選択変更
    g_dwGMSelect    = gmode;

    // BGM停止
    hdxStopSound( 0 );

    // 終了ステートへ
    g_dwGMState = GMST_END;

    // 終了アニメ開始
    hdxCtrlAnime( 4,CTRLMODE_AUTO_END,0,0,-1 );
end