以下のような方法で作成してみようと思っていますがどうでしょう?
// ------------------------------------------------------------
// - ゲームループ処理 -
// - 毎ループごとにシステムから呼ばれる -
// ------------------------------------------------------------
void GameLoop(void)
{
DDClear(DDSCREEN, RGB(0,0,0)); // クリア
BackDraw();
switch ( gGameMode )
{
case MODE_LOAD1: // ロード1
DDDrawText(430,430,RGB(255,255,255),"NOW LOADING");
gGameMode = MODE_LOAD2;
break;
case MODE_LOAD2: // ロード2
GameLoad();
gGameMode = MODE_TITLE;
TitleInit(); // タイトル初期化
break;
case MODE_TITLE: // タイトル
TitleMain(); // タイトル処理
TitleDraw(); // タイトル表示
break;
case MODE_SCORE: // スコア画面
ScoreMain(); // スコア処理
ScoreDraw();
break;
case MODE_GAME: // ゲーム本体
GameMain(); // ゲーム本体処理
GameDraw(); // ゲーム本体表示
break;
case MODE_OVER: // ゲームオーバー
OverMain(); // ゲームオーバー処理
OverDraw(); // ゲームオーバー表示
break;
case MODE_CLEAR: // ゲームクリア
ClearMain(); // ゲームクリア本体処理
ClearDraw(); // ゲームクリア表示
break;
}
// デモ表示
if ( gDemoMode==ON && gDemoCnt%60>=30 )
{
DDRectBltSprite( DDSCREEN, 220,210, sDemo );
}
gDemoCnt++;
// プライマリィサーフェイス(表画面)と
// バックバッファ(裏画面)の反転
DDFlip();
}
// ************************************************************
// * *
// * タイトル *
// * *
// ************************************************************
// ------------------------------------------------
// タイトル メイン
// ------------------------------------------------
void TitleMain(void)
{
if(DDGetKeyInfo(VK_UP) == DDGETKEYINFO_DOWN )
{
DAPlaySE( sndSE6, false );
if(gTitleCnt==0)gTitleCnt=2;
else gTitleCnt--;
}
if(DDGetKeyInfo(VK_DOWN) == DDGETKEYINFO_DOWN )
{
DAPlaySE( sndSE6, false );
if(gTitleCnt==2)gTitleCnt=0;
else gTitleCnt++;
}
// エンターが押されたらば
if (gTitleCnt==0 &&
(DDGetKeyInfo(VK_RETURN) == DDGETKEYINFO_DOWN ||
DDGetKeyInfo('Z') == DDGETKEYINFO_DOWN ))
{
DAStop( sndTIT );
DAPlaySE( sndSE3, false );
gGameMode = MODE_GAME; // モードをゲーム中へ
PlayInit(); // 1ゲーム初期化
}
// エンターが押されたらば
if (gTitleCnt==1 &&
(DDGetKeyInfo(VK_RETURN) == DDGETKEYINFO_DOWN ||
DDGetKeyInfo('Z') == DDGETKEYINFO_DOWN ))
{
DAStop( sndTIT );
DAPlaySE( sndSE3, false );
gGameMode = MODE_SCORE; // モードをスコア画面へ
}
if (gTitleCnt==2 &&
(DDGetKeyInfo(VK_RETURN) == DDGETKEYINFO_DOWN ||
DDGetKeyInfo('Z') == DDGETKEYINFO_DOWN ))
{
DDQUIT_APPLICATION();
}
// 1200カウントでデモスタート
if (gDemoCnt >= 1200)
{
gGameMode = MODE_GAME; // モードをゲーム中へ
PlayInit(); // 1ゲーム初期化
gDemoMode = ON;
gDemoCnt = 0;
gShip.dir = 3;
}
}
// ------------------------------------------------
// タイトル 表示
// ------------------------------------------------
void TitleDraw(void)
{
int sy;
// タイトルの表示
// カウンタにより縮小表示
sy = gDemoCnt/1.5+1;
if ( sy > TITLE1_YSIZE ) sy=TITLE1_YSIZE;
DDRectBltSprite( DDSCREEN, 70, 50, TITLE1_XSIZE, sy,
sTitle1, 0, 0, TITLE1_XSIZE, TITLE1_YSIZE );
DDRectBltAlpha( DDSCREEN, 200, 250+gTitleCnt*38, sTitle4,0,0,200,25,(double)(gDemoCnt%99)/100);
// タイトル2の表示
DDRectBltSprite( DDSCREEN, 250, 250, sTitle2 );
DDRectBltSprite( DDSCREEN, 10, 370, sTitle3 );
}
// ------------------------------------------------
// スコア メイン
// ------------------------------------------------
void ScoreMain(void)
{
// キャンセルが押されたらば
if ( DDGetKeyInfo(VK_RETURN) == DDGETKEYINFO_DOWN ||
DDGetKeyInfo('X') == DDGETKEYINFO_DOWN )
{
DAStop( sndTIT );
DAPlaySE( sndSE3, false );
gGameMode = MODE_TITLE; // モードをタイトルへ
TitleInit();
}
}
// ------------------------------------------------
// スコア 表示
// ------------------------------------------------
void ScoreDraw(void)
{
int i;
char no[5];
char time[6];
char score[10];
DDRectBltSprite( DDSCREEN, 70, -20, sTitle1 );
DDRectBltSprite( DDSCREEN, 10, 370, sTitle3 );
DDRectBltSprite( DDSCREEN, 150, 90, sScore );
for(i=0;i<9;i++)
{
sprintf(no,"%01d", i+1);
sprintf(time,"%04d", gScore.time);
sprintf(score,"%08d", gScore.score);
NumDraw(no,160,120+i*(NUM_YSIZE+10));
NumDraw(time,285,120+i*(NUM_YSIZE+10));
NumDraw(score,375,120+i*(NUM_YSIZE+10));
}
}
// ------------------------------------------------
// タイトル 初期化
// ------------------------------------------------
void TitleInit(void)
{
gTitleCnt=0;
gDemoMode=OFF;
gDemoCnt=0;
DAPlayBGM( sndTIT, false, 150);
}