シーン:結果画面

ここではゲームプレイ後の結果画面の制御方法について説明しています。

結果画面では今回プレイした曲について、クリアか失敗か、ランク、EXゲージなどのグラフ表示、また通信プレイ時は順位などを表示します。結果画面中に何らかのボタンが押されると終了のコールバックが呼び出されるので、これを利用して次の結果情報へ遷移させます。全ての結果が終わったらこのシーンを終了させることで、通常時は再び曲選択へ、コースプレイ時は次の曲、またはコース結果画面へ遷移します。

ゲージグラフに関しては専用のhdx関数が用意されているため、これを利用することで簡単に指定の領域に対してグラフを表示させることが出来ます。
外部スクリプトファイル
システムスキンのサンプルでは、結果画面の処理は_07_result.luaファイルにまとめられています。script.luaからこのファイルをinclude()関数を使って取り込むことで、最終的にscript.luaに定義されたものとして読み込まれます。
スクリプトによる制御方法
結果画面に遷移するとOnStartResult()が呼び出されるので、ここで結果画面で使用するリソースをロードしたり、変数の初期化などを行います。

結果画面で参照するゲームの結果情報はhdxGetResult()から取得できますが、この関数は結果画面に遷移した直後から使用可能なため、OnStartResult()内で呼び出し、ゲームの結果によりどの画像をロードするかなどの判定に利用することが出来ます。

次に結果画面中は毎フレームOnRunResult()が呼び出されるので、ここで演算と画面描画を行います。

ゲージグラフを表示させるにはhdxDrawResultGraph()またはhdxDrawResultGraph2()を使用します。引数により、今回のメーターゲージや今回のEXゲージ、今までのベストゲージなどのグラフを選ぶことが出来るため、それぞれ指定した位置に対して描画できます。なお、この関数は指定した四角形の領域内に線を描きますが、線以外の部分には特に何も描画されません。つまり、同じ位置に重ねて表示させるといったことが可能となっています。また、描画する幅全体を1として0~1を指定することで、左から右に線が徐々に描画されていくような演出が可能です。

結果画面で何らかのボタンが押されるとOnEndResult()が呼び出されます。これを利用して次の情報に遷移したり、結果画面を終了させます。
サンプルコード
このサンプルでは以下の処理を行っています。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 結果画面
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
RSST_START              = 0;                // フレーム表示
RSST_RESULT             = 1;                // クリアかゲームオーバーの結果表示
RSST_RESULT_WAIT        = 2;                // キー入力待ち
RSST_RESSTR             = 3;                // 今回のランク表示
RSST_RESSTR_WAIT        = 4;                // キー入力待ち
RSST_UPD_BEST           = 5;                // ベストEXスコア更新表示
RSST_UPD_WAIT           = 6;                // キー入力待ち
RSST_END                = 7;                // 終了

rs_pid_add_point        = 0;
rs_pid_num_addpoint     = 1;
rs_pid_num_rank         = 2;
rs_pid_num_rank2        = 3;
rs_pid_num_sabun_minus  = 4;
rs_pid_num_sabun_plus   = 5;
rs_pid_num_score        = 6;
rs_pid_rankfrm_01       = 7;
rs_pid_rankfrm_02       = 8;
rs_pid_rankfrm_03       = 9;
rs_pid_rankfrm_04       = 10;
rs_pid_sabun            = 11;
rs_pid_sabun_minus      = 12;
rs_pid_sabun_plus       = 13;
rs_pid_scorebest_minus  = 14;
rs_pid_scorebest_num    = 15;
rs_pid_scorebest_plus   = 16;

g_dwResState            = RSST_START;
g_iResAlphaCount        = 0;                // 数値のフェードインカウンタ
g_iResGaugeGraphCount   = -1;               // ゲージグラフ表示カウンタ(-1=非表示、0~90=表示)
g_iResExScoreGraphCount = -1;               // EXスコアグラフ表示カウンタ(-1=非表示、0~90=表示)
g_iResNewRecordCount    = -1;               // NEW RECORD表示カウンタ(-1=非表示、0~5=表示)
g_iResNetRankCount      = -1;               // 通信時のランク表示カウンタ(-1=非表示、0~15=表示)


///////////////////////////////////////////////////////////////////////
// 結果画面の開始時に呼び出される。
///////////////////////////////////////////////////////////////////////
function OnStartResult()
    game_info   = hdxGetGameInfo();         // ゲーム情報を取得
    result      = hdxGetResult();           // 結果を取得

    // 初期化
    g_dwResState            = RSST_START;
    g_iResAlphaCount        = 0;
    g_iResGaugeGraphCount   = -1;
    g_iResExScoreGraphCount = -1;
    g_iResNewRecordCount    = -1;
    g_iResNetRankCount      = -1;

    // 画像ロード
    hdxLoadImage( 0,"res_object.tga" );

    // 切り抜き
    hdxSetPutRange( rs_pid_add_point        ,0,464,160,350,28,0,0   );          // add_point
    hdxSetPutRange( rs_pid_num_addpoint     ,0,8,288,240,30,0,0     );          // num_addpoint
    hdxSetPutRange( rs_pid_num_rank         ,0,838,160,168,20,0,0   );          // num_rank
    hdxSetPutRange( rs_pid_num_rank2        ,0,8,160,432,50,0,0     );          // num_rank2
    hdxSetPutRange( rs_pid_num_sabun_minus  ,0,344,260,312,30,0,0   );          // num_sabun_minus
    hdxSetPutRange( rs_pid_num_sabun_plus   ,0,8,234,312,30,0,0     );          // num_sabun_plus
    hdxSetPutRange( rs_pid_num_score        ,0,464,212,408,24,0,0   );          // num_score
    hdxSetPutRange( rs_pid_rankfrm_01       ,0,8,8,234,128,0,0      );          // rankfrm_01
    hdxSetPutRange( rs_pid_rankfrm_02       ,0,266,8,234,128,0,0    );          // rankfrm_02
    hdxSetPutRange( rs_pid_rankfrm_03       ,0,524,8,234,128,0,0    );          // rankfrm_03
    hdxSetPutRange( rs_pid_rankfrm_04       ,0,782,8,234,128,0,0    );          // rankfrm_04
    hdxSetPutRange( rs_pid_sabun            ,0,896,204,44,26,0,0    );          // sabun
    hdxSetPutRange( rs_pid_sabun_minus      ,0,272,288,26,30,0,0    );          // sabun_minus
    hdxSetPutRange( rs_pid_sabun_plus       ,0,964,204,26,30,0,0    );          // sabun_plus
    hdxSetPutRange( rs_pid_scorebest_minus  ,0,992,258,24,28,0,0    );          // scorebest_minus
    hdxSetPutRange( rs_pid_scorebest_num    ,0,680,260,288,28,0,0   );          // scorebest_num
    hdxSetPutRange( rs_pid_scorebest_plus   ,0,992,310,24,28,0,0    );          // scorebest_plus


    // アニメロード
    hdxLoadAnime( 0,"res_bg.hda" );
    hdxCtrlAnime( 0,CTRLMODE_AUTO_LOOP,0,40,-1 );               // 最初から再生して途中をループ

    if( game_info["gmode"]==GAMEMODE_EXPERT ||                  // エキスパートか
        game_info["gmode"]==GAMEMODE_CLASS ||                   // 段位認定か
        game_info["opt_difficult"]==OPTDIFFICULT_HARD ) then    // HARDか
        // 赤色のグラフ
        hdxLoadAnime( 1,"res_frame2.hda" );
    else
        // 赤と緑のグラフ
        hdxLoadAnime( 1,"res_frame1.hda" );
    end
    hdxCtrlAnime( 1,CTRLMODE_AUTO_END,0,0,35 );                 // 指定のフレームで止める

    if( result["clear"]==TRUE ) then
        hdxLoadAnime( 2,"res_clear.hda" );                      // CLEARアニメ
    else
        hdxLoadAnime( 2,"res_failed.hda" );                     // FAILEDアニメ
    end
    hdxCtrlAnime( 2,CTRLMODE_MANUAL,-1,0,-1 );                  // 非表示

    hdxLoadAnime( 3,"res_djlevel_"..result["rank"]..".hda" );   // 今回のDJLEVELアニメ
    hdxCtrlAnime( 3,CTRLMODE_MANUAL,-1,0,-1 );                  // 非表示

    hdxLoadAnime( 4,"res_djlevel_small.hda" );                  // 今回のDJLEVEL(小)
    hdxCtrlAnime( 4,CTRLMODE_MANUAL,-1,0,-1 );                  // 非表示

    hdxLoadAnime( 5,"res_djlevel_normal.hda" );                 // 今回のDJLEVEL(中)
    hdxCtrlAnime( 5,CTRLMODE_MANUAL,-1,0,-1 );                  // 非表示

    hdxLoadAnime( 6,"res_fadeout.hda" );                        // フェードアウト
    hdxCtrlAnime( 6,CTRLMODE_MANUAL,-1,0,-1 );                  // 非表示
    
    // 通信ランキング用
    hdxLoadAnime( 10,"res_rank_frm.hda" );                      // 今回の順位表示フレーム
    hdxCtrlAnime( 10,CTRLMODE_MANUAL,-1,0,-1 );                 // 非表示

    hdxLoadAnime( 11,"res_rank_list.hda" );                     // ベストランクリスト
    hdxCtrlAnime( 11,CTRLMODE_MANUAL,-1,0,-1 );                 // 非表示

    // タイトル名
    hdxCreateFont( 0, "メイリオ", 30, result["title"], 0xFFFFFFFF, 0xFFF080FF, 1, 0xFF000000 );

    // ニックネームフォント構築
    for i=0,result["ranking_count"]-1 do
        hdxCreateFont( i+10, "メイリオ", 24, result["ranking_nickname"..i], 0xFFFFFF, 0xFFFFFF, 1, 0x360086 );
        trace( "["..i.."] "..result["ranking_nickname"..i] );
    end

    // サウンド
    if( result["clear"]==TRUE ) then
        hdxLoadSound( 0,"res_clear.wav" );
    else
        hdxLoadSound( 0,"res_failed.wav" );
    end
    hdxPlaySound( 0,FALSE );

end


///////////////////////////////////////////////////////////////////////
// 結果画面で毎フレーム呼び出されるので、ここで演算と描画処理を行う。
///////////////////////////////////////////////////////////////////////
function OnRunResult( upd_frm )
    // 結果を取得
    local result = hdxGetResult();

    ///////////////////////////////////
    // 処理
    ///////////////////////////////////
    if( g_dwResState==RSST_START ) then
        if( hdxIsEndAnime(1)==TRUE ) then
            // クリア・ゲームオーバーアニメを表示
            hdxCtrlAnime( 2,CTRLMODE_AUTO_END,0,0,-1 );     // 最初から最後まで
            g_iResGaugeGraphCount   = 0;                    // ゲージグラフ表示開始
            g_iResExScoreGraphCount = 0;                    // EXゲージグラフ表示可意思
            g_dwResState = RSST_RESULT;
        end
    elseif( g_dwResState==RSST_RESULT ) then
        if( hdxIsEndAnime(2)==TRUE ) then
            // キー入力待ちへ
            g_dwResState = RSST_RESULT_WAIT;
        end
    elseif( g_dwResState==RSST_RESULT_WAIT ) then
        // 入力イベント側で処理
    elseif( g_dwResState==RSST_RESSTR ) then
        if( hdxIsEndAnime(1)==TRUE ) then
            // キー入力待ちへ
            g_dwResState = RSST_RESSTR_WAIT;
        end
    elseif( g_dwResState==RSST_RESSTR_WAIT ) then
        // 入力イベント側で処理
    elseif( g_dwResState==RSST_UPD_BEST ) then
        if( hdxIsEndAnime(1)==TRUE ) then
            // キー入力待ちへ
            g_dwResState = RSST_UPD_WAIT;
        end
    elseif( g_dwResState==RSST_UPD_WAIT ) then
        // 入力イベント側で処理
    elseif( g_dwResState==RSST_END ) then
        if( hdxIsEndAnime(6)==TRUE ) then
            trace( "結果画面終了" );
            hdxNextScene();
        end     
    end

    // 60fps処理
    if( upd_frm==TRUE ) then
        // ゲージグラフカウンタ
        if( g_iResGaugeGraphCount>=0 ) then
            // 表示状態なら
            g_iResGaugeGraphCount = g_iResGaugeGraphCount + 1;
            if( g_iResGaugeGraphCount>90 ) then
                g_iResGaugeGraphCount = 90;
            end
        end
        // EXスコアグラフカウンタ
        if( g_iResExScoreGraphCount>=0 ) then
            // 表示状態なら
            g_iResExScoreGraphCount = g_iResExScoreGraphCount + 1;
            if( g_iResExScoreGraphCount>90 ) then
                g_iResExScoreGraphCount = 90;
            end
        end
        // NEW RECORDカウンタ
        if( g_iResNewRecordCount>=0 ) then
            // 表示状態なら
            g_iResNewRecordCount = g_iResNewRecordCount + 1;
            if( g_iResNewRecordCount>5 ) then
                g_iResNewRecordCount = 5;
            end
        end
        // 通信時のランク表示カウンタ
        if( g_iResNetRankCount>=0 ) then
            // 表示状態なら
            g_iResNetRankCount = g_iResNetRankCount + 1;
            if( g_iResNetRankCount>15 ) then
                g_iResNetRankCount = 15;
            end
        end
    end



    ///////////////////////////////////
    // 描画
    ///////////////////////////////////
    hdxDrawAnime( 0, 0, 0, 1.0, 1.0 );                  // BG
    hdxDrawAnime( 1, 0, 0, 1.0, 1.0 );                  // FRAME

    if( g_dwResState>=RSST_RESULT ) then
        // CLEAR・FAILED表示以降にフェードインする
        g_iResAlphaCount = g_iResAlphaCount + 1;
        if( g_iResAlphaCount>15 ) then
            g_iResAlphaCount = 15;
        end

        local alpha = g_iResAlphaCount / 15.0;

        // 各種スコア値
        hdxPutInt( rs_pid_num_score, 447, 363, result["score"], alpha, ALIGNTYPE_RIGHTBOTTOM );
        hdxPutInt( rs_pid_num_score, 379, 400, result["total_notes"], alpha, ALIGNTYPE_RIGHTBOTTOM );
        hdxPutInt( rs_pid_num_score, 379, 437, result["maxcombo"], alpha, ALIGNTYPE_RIGHTBOTTOM );
        hdxPutInt( rs_pid_num_score, 345, 474, result["pkgreat"], alpha, ALIGNTYPE_RIGHTBOTTOM );
        hdxPutInt( rs_pid_num_score, 345, 511, result["great"], alpha, ALIGNTYPE_RIGHTBOTTOM );
        hdxPutInt( rs_pid_num_score, 345, 548, result["good"], alpha, ALIGNTYPE_RIGHTBOTTOM );
        hdxPutInt( rs_pid_num_score, 345, 585, result["bad"], alpha, ALIGNTYPE_RIGHTBOTTOM );
        hdxPutInt( rs_pid_num_score, 345, 622, result["poor"], alpha, ALIGNTYPE_RIGHTBOTTOM );
        hdxPutInt( rs_pid_num_score, 412, 664, result["total_exscore"], alpha, ALIGNTYPE_RIGHTBOTTOM );

        hdxPutInt( rs_pid_num_score, 1108, 372, result["exscore"], alpha, ALIGNTYPE_RIGHTBOTTOM );                  // 今回のEXスコア
        hdxPutInt( rs_pid_num_score, 1108, 420, result["target_exscore"], alpha, ALIGNTYPE_RIGHTBOTTOM );           // ターゲットEXスコア
        hdxPutInt( rs_pid_num_score, 1108, 469, result["best_exscore"], alpha, ALIGNTYPE_RIGHTBOTTOM );             // 自己ベストEXスコア

        // 差分
        hdxSetPutStatus( rs_pid_sabun, alpha, 1.0, 1.0, 0.0 );
        hdxPut( rs_pid_sabun, 1180, 360 );
        _resDrawNum4( 1148,393,result["exscore"]-result["target_exscore"],alpha );          // ターゲットの差分
        _resDrawNum4( 1148,443,result["exscore"]-result["best_exscore"],alpha );            // 自己ベストの差分

        // DJ LEVEL
        hdxCtrlAnime( 4, CTRLMODE_MANUAL, result["rank"], 0, -1 );
        hdxDrawAnime( 4, 1071, 506, alpha, 1.0 );

        // タイトル名
        local sz = hdxGetFontSize(0);
        if( sz["width"]<484 ) then
            // 幅が収まるなら等倍表示
            hdxDrawFont( 0, 640, 595, alpha, ALIGNTYPE_CENTER );
        else
            // はみ出すならスケーリング表示
            hdxSetFilterMode( FILTER_LINEAR );                  // バイリニア
            hdxDrawFontEx( 0, 398, 580, 484, 30, alpha ); 
            hdxSetFilterMode( FILTER_POINT );
        end

    end


    // グラフ表示
    if( g_iResGaugeGraphCount>=0 ) then
        // ゲージグラフはクリッピング
        hdxSetViewport( 43, 38, 460, 260 );
        hdxDrawResultGraph( GRAPHTYPE_GAUGE,  43, 38, 460, 260, g_iResGaugeGraphCount/90.0, 0, 6, 0x009230, 0xFF003E );
    end

    if( g_iResExScoreGraphCount>=0 ) then
        // クリッピング解除
        hdxSetViewport( 0, 0, 0, 0 );
        hdxDrawResultGraph( GRAPHTYPE_TARGET_EXSCORE, 785, 49, 430, 240, g_iResExScoreGraphCount/90.0, 0, 4, 0xFF3073, 0xFF3073 );      // ターゲットのEXスコアグラフ
        hdxDrawResultGraph( GRAPHTYPE_BEST_EXSCORE, 785, 49, 430, 240, g_iResExScoreGraphCount/90.0, 0, 4, 0x149B5B, 0x149B5B );        // ベストEXスコアグラフ
        hdxDrawResultGraph( GRAPHTYPE_EXSCORE, 785, 49, 430, 240, g_iResExScoreGraphCount/90.0, 0, 4, 0x00F0FF, 0x00F0FF );             // 今回のEXスコアグラフ
    end

    // NEW RECORD表示
    if( g_iResNewRecordCount>=0 ) then
        local alpha = g_iResNewRecordCount / 5;

        // ベストランク
        hdxCtrlAnime( 5,CTRLMODE_MANUAL,result["best_rank"],0,-1 );
        hdxDrawAnime( 5, 202, 156, alpha, 1.0 );

        // 今回のランク
        hdxCtrlAnime( 5,CTRLMODE_MANUAL,result["rank"],0,-1 );
        hdxDrawAnime( 5, 360, 156, alpha, 1.0 );

        // ベストと今回のEXスコア
        hdxPutInt( rs_pid_scorebest_num, 192, 226, result["best_exscore"], alpha, ALIGNTYPE_CENTER );       // ベストEXスコア
        hdxPutInt( rs_pid_scorebest_num, 373, 226, result["exscore"], alpha, ALIGNTYPE_CENTER );            // 今回のEXスコア

        // ベストと今回のEXスコアの差分
        _resDrawCenterNum( 279, 273, result["exscore"]-result["best_exscore"] , alpha );
    end

    // 通信時のランク
    if( g_iResNetRankCount>=0 ) then
        hdxDrawAnime2( 10, 1070, 620, 1.0, 1.0, "_resDrawRank" );           // 今回の順位(中心指定)
        hdxDrawAnime2( 11,  771,  38, 1.0, 1.0, "_resDrawRankList" );       // ランキングリスト

        // 今回の加算ポイントと合計ポイントを表示
        local alpha = g_iResNetRankCount / 15;
        hdxSetPutStatus( rs_pid_add_point, alpha, 1, 1, 0 );
        hdxPut( rs_pid_add_point, 550, 642 );

        // 加算ポイント
        hdxPutInt( rs_pid_num_addpoint, 588, 638, result["add_point"], alpha, ALIGNTYPE_LEFTTOP );

        // トータルポイント
        local user_info = hdxGetUserInfo();
        hdxPutInt( rs_pid_num_rank, 892, 668, user_info["point"], alpha, ALIGNTYPE_RIGHTBOTTOM );

    end

    // CLEAR・FAILED
    hdxDrawAnime( 2, 640, 188, 1.0, 1.0 );

    // DJLEVELアニメ
    hdxDrawAnime( 3, 0, 0, 1.0, 1.0 );

    // フェードアウト
    hdxDrawAnime( 6, 0, 0, 1.0, 1.0 );

end


// 指定の数値を負号と4桁で表示
function _resDrawNum4( x,y,num,alpha )
    
    local pid;      // 数値画像ID

    if( num<0 ) then
        // マイナスなら
        hdxPut( rs_pid_sabun_minus,x,y );       // 「-」
        num = -num;                             // 負号を逆転
        pid = rs_pid_num_sabun_minus;
    else
        // プラスなら
        hdxPut( rs_pid_sabun_plus,x,y );        // 「+」
        pid = rs_pid_num_sabun_plus;
    end

    // 4桁分の数値
    hdxPutInt( pid, x+22+20*0, y, (num/1000)%10, alpha, ALIGNTYPE_LEFTTOP );
    hdxPutInt( pid, x+22+20*1, y, (num/100 )%10, alpha, ALIGNTYPE_LEFTTOP );
    hdxPutInt( pid, x+22+20*2, y, (num/10  )%10, alpha, ALIGNTYPE_LEFTTOP );
    hdxPutInt( pid, x+22+20*3, y, (num/1   )%10, alpha, ALIGNTYPE_LEFTTOP );
end

// ベストと今回のEXスコアの差分
function _resDrawCenterNum( x,y,num,alpha )
    local minus = FALSE;
    if( num<0 ) then
        num     = -num;
        minus   = TRUE;
    end

    // 桁数を取得
    local keta = 1;
    local num2 = num;
    while num2>=10 do
        keta = keta + 1;
        num2 = math.floor(num2 / 10);
    end

    // 負号を入れた幅を算出
    local w = (1 + keta) * 24;

    // 左上の座標を算出
    x = x - w / 2;
    y = y - 28 / 2;

    // 負号
    if( minus==TRUE ) then
        hdxSetPutStatus( rs_pid_scorebest_minus, alpha, 1, 1, 0 );
        hdxPut( rs_pid_scorebest_minus, x, y );                         // 「-」
    else
        hdxSetPutStatus( rs_pid_scorebest_plus, alpha, 1, 1, 0 );
        hdxPut( rs_pid_scorebest_plus, x, y );                          // 「+」
    end
    x = x + 24;

    // 数値
    hdxPutInt( rs_pid_scorebest_num, x, y, num, alpha, ALIGNTYPE_LEFTTOP );
end

// 今回のランク表示
function _resDrawRank( layer,x,y,frm_x,frm_y,frm_sx,frm_sy,frm_alpha,frm_rot )
    if( layer==0 ) then
        // ロケーターなら
        local result = hdxGetResult();      // 結果を取得
        // 順位フレーム
        local frm_id;
        if( result["current_ranking"]==1 ) then
            frm_id = rs_pid_rankfrm_01;
        elseif( result["current_ranking"]==2 ) then
            frm_id = rs_pid_rankfrm_02;
        elseif( result["current_ranking"]==3 ) then
            frm_id = rs_pid_rankfrm_03;
        else
            frm_id = rs_pid_rankfrm_04;
        end
        hdxSetPutStatus( frm_id, frm_alpha, frm_sx, frm_sy, frm_rot );
        hdxPut( frm_id, x+frm_x-110, y+frm_y-57 );                          // 左上に移動

        // 順位
        hdxPutInt( rs_pid_num_rank2, x+frm_x, y+frm_y+20, result["current_ranking"], frm_alpha, ALIGNTYPE_CENTER );

        return TRUE;
    end

    return FALSE;
end

// ランキングリスト
function _resDrawRankList( layer,x,y,frm_x,frm_y,frm_sx,frm_sy,frm_alpha,frm_rot )
    if( layer==1 ) then
        // ロケーターなら
        local result = hdxGetResult();      // 結果を取得

        for i=0,result["ranking_count"]-1 do
            hdxPutInt( rs_pid_num_rank, x+frm_x+41, y+frm_y+44+i*22, result["ranking_num"..i], frm_alpha, ALIGNTYPE_CENTER );               // 順位

            hdxSetViewport( x+frm_x+61, y+frm_y+32, 280, 219 );                                                                             // ニックネーム部分をマスク
            hdxDrawFont( i+10, x+frm_x+70, y+frm_y+30+i*22, frm_alpha, ALIGNTYPE_LEFTTOP );                                                 // ニックネーム
            hdxSetViewport( 0, 0, 0, 0 );

            hdxPutInt( rs_pid_num_rank, x+frm_x+430, y+frm_y+54+i*22, result["ranking_exscore"..i], frm_alpha, ALIGNTYPE_RIGHTBOTTOM );     // EXスコア
        end

        return TRUE;
    end

    return FALSE;
end


///////////////////////////////////////////////////////////////////////
// 結果画面内で次の表示に遷移したい場合に呼び出される。
// 通常はSTARTボタンを押したときに呼び出されるので、このタイミングで結果画面を切り替えていく。
///////////////////////////////////////////////////////////////////////
function OnEndResult()
    local result = hdxGetResult();

    if( g_dwResState==RSST_RESULT_WAIT ) then
        // 今回のDJLEVELを表示
        hdxCtrlAnime( 1,CTRLMODE_AUTO_END,40,40,50 );           // DJLEVEL枠の表示
        hdxCtrlAnime( 2,CTRLMODE_MANUAL,-1,0,-1 );              // CLEAR・FAILEDを非表示
        hdxCtrlAnime( 3,CTRLMODE_AUTO_END,0,0,-1 );             // DJLEVELアニメ

        // 通信時はランク表示開始
        trace( "今回のランク : "..result["current_ranking"] );
        if( result["current_ranking"]>0 ) then
            g_iResNetRankCount = 0;                             // カウンタ開始
            hdxCtrlAnime( 10,CTRLMODE_AUTO_END,0,0,-1 );        // 順位表示フレーム開始
            hdxCtrlAnime( 11,CTRLMODE_AUTO_END,0,0,-1 );        // 順位リスト開始
        end
        g_dwResState = RSST_RESSTR;

    elseif( g_dwResState==RSST_RESSTR_WAIT ) then
        // ベストスコア更新か
        if( result["best_exscore"]<result["exscore"] ) then
            // 今回のスコアがベストスコアより大きい場合はベストスコア更新とする
            trace( "ベストスコア表示開始" );
            hdxCtrlAnime( 1,CTRLMODE_AUTO_END,60,60,-1 );       // NEW RECORD表示
            hdxCtrlAnime( 3,CTRLMODE_MANUAL,-1,0,-1 );          // DJLEVELアニメ非表示
            g_iResGaugeGraphCount   = -1;                       // ゲージグラフのみOFF
            g_iResNewRecordCount    = 0;                        // NEW RECORDカウント開始
            g_dwResState            = RSST_UPD_BEST;
        else
            // 更新ではなかった場合は終了
            trace( "ベストスコア更新ではないので終了" );
            hdxCtrlAnime( 6,CTRLMODE_AUTO_END,0,0,-1 );         // フェードアウト開始
            g_dwResState            = RSST_END;
        end

    elseif( g_dwResState==RSST_UPD_WAIT ) then
        // 終了
        hdxCtrlAnime( 6,CTRLMODE_AUTO_END,0,0,-1 );         // フェードアウト開始
        g_dwResState            = RSST_END;

    end
end