スタート画面を作る場合

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
L

スタート画面を作る場合

#1

投稿記事 by L » 17年前

ここで紹介されているようなシューティングゲームにスタート画面を作る場合はどのような処理で作るのがよいのでしょうか?
以下のような方法で作成してみようと思っていますがどうでしょう?
// ------------------------------------------------------------
// -   ゲームループ処理                                       -
// -   毎ループごとにシステムから呼ばれる                     -
// ------------------------------------------------------------
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);
}

管理人

Re:スタート画面を作る場合

#2

投稿記事 by 管理人 » 17年前

しばらく家を空けていたので遅くなりましたm(_ _)m

サッとみただけですし、よくわからない関数の仕様は勝手に想像で補完しましたが、
いいと思いますよ。
私は私なりの方法しか知らないのでこれが大規模なゲームになった時ふさわしいかどうかはわかりませんが、
とりあえず私も似たような書き方で作っています。

少しだけ気になったのはgGameModeへの値代入がメインループのスイッチ文内で行われていたり、
呼んだ先の関数内で行われていたりしているので、
その辺統一したほうがいいかもしれませんね。

メインループのスイッチ文には関数を呼ぶ記述しかしないと統一するのなら
DDDrawText関数もそれように作った関数で呼んであげるほうがいいかもしれませんが、
まぁたいしたことじゃないと思います。

Re:スタート画面を作る場合

#3

投稿記事 by » 17年前

ありがとうございました。

参考にしてみます。

閉鎖

“C言語何でも質問掲示板” へ戻る