ここではエキスパートモードのコース結果画面の制御方法について説明しています。コース結果画面は、コース内の曲が全て終了したあとや途中でゲームオーバーになると表示されます。
コース結果画面ではコースクリアか失敗か、ランク、EXゲージなどのグラフ表示、コース内の全トータル数やコース順位などを表示します。コース結果画面中に何らかのボタンが押されると終了のコールバックが呼び出されるので、これを利用して次の結果情報へ遷移させます。全ての結果が終わったらこのシーンを終了させることで、再びコース結果画面へ戻ります。
このサンプルでは以下の処理を行っています。
- 結果フレーム表示、クリアか失敗の表示、ランク表示をステートで管理
- コース結果画面が開始されたらフレームアニメーションを開始する
- クリアか失敗のアニメ
- 各種数値などを表示
- ランクアニメ(曲の結果画面と共通)
- 順位やランクリスト
- フェードアウトして結果画面を終了する
EXPST_START = 0;
EXPST_FADEIN = 1;
EXPST_WAIT = 2;
EXPST_FADEOUT = 3;
exp_pid_num_rank = 0;
exp_pid_num_rank2 = 1;
exp_pid_num_score = 2;
exp_pid_rankfrm_01 = 3;
exp_pid_rankfrm_02 = 4;
exp_pid_rankfrm_03 = 5;
exp_pid_rankfrm_04 = 6;
g_dwExpState = EXPST_START;
g_iExpFadeCount = -1;
g_iExpPkGreatPer = 0;
g_iExpGreatPer = 0;
g_iExpGoodPer = 0;
g_iExpBadPer = 0;
g_iExpPoorPer = 0;
function OnStartCourseResult()
local course = hdxGetCourseResult();
g_dwExpState = EXPST_START;
g_iExpFadeCount = -1;
g_iExpPkGreatPer = math.floor( course["pkgreat"] / course["total_notes"] * 100 );
g_iExpGreatPer = math.floor( course["great"] / course["total_notes"] * 100 );
g_iExpGoodPer = math.floor( course["good"] / course["total_notes"] * 100 );
g_iExpBadPer = math.floor( course["bad"] / course["total_notes"] * 100 );
g_iExpPoorPer = math.floor( course["poor"] / course["total_notes"] * 100 );
hdxLoadImage( 0,"ex_object.tga" );
hdxSetPutRange( exp_pid_num_rank ,0, 8,434,168,20,0,0 );
hdxSetPutRange( exp_pid_num_rank2 ,0, 8,312,432,50,0,0 );
hdxSetPutRange( exp_pid_num_score ,0, 8,386,408,24,0,0 );
hdxSetPutRange( exp_pid_rankfrm_01 ,0, 8,8,234,128,0,0 );
hdxSetPutRange( exp_pid_rankfrm_02 ,0, 266,8,234,128,0,0 );
hdxSetPutRange( exp_pid_rankfrm_03 ,0, 8,160,234,128,0,0 );
hdxSetPutRange( exp_pid_rankfrm_04 ,0, 266,160,234,128,0,0 );
hdxLoadAnime( 0,"ex_bg.hda" );
hdxCtrlAnime( 0,CTRLMODE_AUTO_END,0,0,-1 );
hdxLoadAnime( 1,"ex_frame.hda" );
hdxCtrlAnime( 1,CTRLMODE_AUTO_END,0,0,-1 );
hdxLoadAnime( 2,"ex_fadeout.hda" );
hdxCtrlAnime( 2,CTRLMODE_MANUAL,-1,0,-1 );
if( course["clear"]==TRUE ) then
hdxLoadAnime( 3,"ex_clear.hda" );
else
hdxLoadAnime( 3,"ex_failed.hda" );
end
hdxCtrlAnime( 3,CTRLMODE_AUTO_END,0,0,-1 );
hdxLoadAnime( 4,"res_djlevel_"..course["rank"]..".hda" );
hdxCtrlAnime( 4,CTRLMODE_AUTO_END,0,0,-1 );
hdxLoadAnime( 10,"res_rank_frm.hda" );
hdxCtrlAnime( 10,CTRLMODE_AUTO_END,0,0,-1 );
hdxLoadAnime( 11,"res_rank_list.hda" );
hdxCtrlAnime( 11,CTRLMODE_AUTO_END,0,0,-1 );
hdxCreateFont( 0, "メイリオ", 30, course["title"], 0xFFFFFFFF, 0xFFF080FF, 1, 0xFF000000 );
for i=0,course["ranking_count"]-1 do
hdxCreateFont( i+10, "メイリオ", 24, course["ranking_nickname"..i], 0xFFFFFF, 0xFFFFFF, 1, 0x360086 );
trace( "["..i.."] "..course["ranking_nickname"..i] );
end
if( course["clear"]==TRUE ) then
hdxLoadSound( 0,"ex_clear.wav" );
else
hdxLoadSound( 0,"ex_failed.wav" );
end
hdxPlaySound( 0,FALSE );
end
function OnRunCourseResult( upd_frm )
local course = hdxGetCourseResult();
if( g_dwExpState==EXPST_START ) then
if( hdxIsEndAnime(1)==TRUE ) then
g_iExpFadeCount = 0;
g_dwExpState = EXPST_FADEIN;
end
elseif( g_dwExpState==EXPST_FADEIN ) then
g_iExpFadeCount = g_iExpFadeCount + 1;
if( g_iExpFadeCount>=10 ) then
g_iExpFadeCount = 10;
g_dwExpState = EXPST_WAIT;
end
elseif( g_dwExpState==EXPST_WAIT ) then
elseif( g_dwExpState==EXPST_FADEOUT ) then
if( hdxIsEndAnime(2)==TRUE ) then
trace( "コース結果画面終了" );
hdxNextScene();
end
end
hdxDrawAnime( 0, 0, 0, 1.0, 1.0 );
hdxDrawAnime( 1, 0, 0, 1.0, 1.0 );
hdxDrawAnime( 3,970,270, 1.0, 1.0 );
hdxDrawAnime( 4, 94, 30, 1.0, 1.0 );
if( g_iExpFadeCount>=0 ) then
alpha = g_iExpFadeCount / 10.0;
hdxPutInt( exp_pid_num_score, 418, 421, course["pkgreat"], alpha, ALIGNTYPE_RIGHTBOTTOM );
hdxPutInt( exp_pid_num_score, 418, 458, course["great"], alpha, ALIGNTYPE_RIGHTBOTTOM );
hdxPutInt( exp_pid_num_score, 418, 495, course["good"], alpha, ALIGNTYPE_RIGHTBOTTOM );
hdxPutInt( exp_pid_num_score, 418, 532, course["bad"], alpha, ALIGNTYPE_RIGHTBOTTOM );
hdxPutInt( exp_pid_num_score, 418, 569, course["poor"], alpha, ALIGNTYPE_RIGHTBOTTOM );
hdxPutInt( exp_pid_num_score, 548, 421, g_iExpPkGreatPer, alpha, ALIGNTYPE_RIGHTBOTTOM );
hdxPutInt( exp_pid_num_score, 548, 458, g_iExpGreatPer, alpha, ALIGNTYPE_RIGHTBOTTOM );
hdxPutInt( exp_pid_num_score, 548, 495, g_iExpGoodPer, alpha, ALIGNTYPE_RIGHTBOTTOM );
hdxPutInt( exp_pid_num_score, 548, 532, g_iExpBadPer, alpha, ALIGNTYPE_RIGHTBOTTOM );
hdxPutInt( exp_pid_num_score, 548, 569, g_iExpPoorPer, alpha, ALIGNTYPE_RIGHTBOTTOM );
hdxPutInt( exp_pid_num_score, 550, 632, course["total_exscore"], alpha, ALIGNTYPE_RIGHTBOTTOM );
hdxDrawAnime2( 10, 1088, 100, 1.0, 1.0, "_expDrawRank" );
hdxDrawAnime2( 11, 732, 390, 1.0, 1.0, "_expDrawRankList" );
local sz = hdxGetFontSize(0);
if( sz["width"]<484 ) then
hdxDrawFont( 0, 622, 64, alpha, ALIGNTYPE_CENTER );
else
hdxSetFilterMode( FILTER_LINEAR );
hdxDrawFontEx( 0, 381, 49, 484, 30, alpha );
hdxSetFilterMode( FILTER_POINT );
end
end
hdxDrawAnime( 2, 0, 0, 1.0, 1.0 );
end
function _expDrawRank( layer,x,y,frm_x,frm_y,frm_sx,frm_sy,frm_alpha,frm_rot )
if( layer==0 ) then
local course = hdxGetCourseResult();
local frm_id;
if( course["current_ranking"]==1 ) then
frm_id = exp_pid_rankfrm_01;
elseif( course["current_ranking"]==2 ) then
frm_id = exp_pid_rankfrm_02;
elseif( course["current_ranking"]==3 ) then
frm_id = exp_pid_rankfrm_03;
else
frm_id = exp_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( exp_pid_num_rank2, x+frm_x, y+frm_y+20, course["current_ranking"], frm_alpha, ALIGNTYPE_CENTER );
return TRUE;
end
return FALSE;
end
function _expDrawRankList( layer,x,y,frm_x,frm_y,frm_sx,frm_sy,frm_alpha,frm_rot )
if( layer==1 ) then
local course = hdxGetCourseResult();
for i=0,course["ranking_count"]-1 do
hdxPutInt( exp_pid_num_rank, x+frm_x+41, y+frm_y+44+i*22, course["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( exp_pid_num_rank, x+frm_x+430, y+frm_y+54+i*22, course["ranking_exscore"..i], frm_alpha, ALIGNTYPE_RIGHTBOTTOM );
end
return TRUE;
end
return FALSE;
end
function OnCourseResult()
if( g_dwExpState==EXPST_WAIT ) then
hdxCtrlAnime( 2,CTRLMODE_AUTO_END,0,0,-1 );
g_dwExpState = EXPST_FADEOUT;
end
end