メニュー画面について…

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

メニュー画面について…

#1

投稿記事 by » 16年前

今メニュー画面作成で頭を悩ませているので教えてください。
簡潔に言うと四聖龍神録Plusのメニューのような感じのメニューにしたいです。
上、下キーで選択できるようにするということです。
しかし、どのようにすればいいのか分からず、困っているのでどのようにすればよいのかアドバイスお願いします。

ソースは基本的に今のところ龍神録プログラミングの館のとだいたい一緒と思って下されば結構です。
コンパイラはVisual C++ 2008 、知識は最近始めたばかりでなんとなくC/C++が理解できる程度です。

BEMANI

Re:メニュー画面について…

#2

投稿記事 by BEMANI » 16年前

>>蒼さん

if文や、switch~case で分けるのが一般的?でいいのかなぁ~と思います。
下に switch~case で分けるサンプルを書いておきます。

このサンプルは、一番下の項目(終了)にカーソルがある時、下を押しても上に戻らないようにしています。
逆も同じで、一番上の項目(イージー)にカーソルがある時、上を押しても一番下に移動しません。

状態を分ける変数をここでは OPState とします。
更に、メニューの数は下のように5つにしました。

→ イージー
ノーマル
ハード
オプション
終了

[color=339933]// このように記述すると、EASY=0, NOMAL=1, HARD=2・・・GAME_END=4となっています[/color]
enum
{
	EASY, NOMAL, HARD, OPTION, GAME_END
};

[color=339933]// ステータスの初期化[/color]
OPState = EASY;

[color=339933]// カーソル処理[/color]
if( 下キーを押した && (OPState < GAME_END) )
{
	OPState++;
	カーソルのY座標 += ???;	[color=339933]// ??? に任意の値を入れてカーソルを移動させて下さい[/color]
}

if( 上キーを押した && (OPState > EASY) )
{
	OPState--;
	カーソルのY座標 -= ???;	[color=339933]// ??? に任意の値を入れてカーソルを移動させて下さい[/color]
}

[color=339933]// カーソルの値で処理を分岐[/color]
if(決定キーを押した)
{
	switch(OPState)
	{
		case EASY:		GameEasy();	break;
		case NOMAL:	GameNomal();	break;
		case HARD:		GameHard();	break;
		case OPTION:	Option();		break;
		case GAME_END:	GameEnd();		break;
	}
}

Re:メニュー画面について…

#3

投稿記事 by » 16年前

メニューで選択している画像を変えようとサンプルに工夫を加えて



int i[5];
i[0] = 0, i[1] = 0, i[2] = 0, i[3] = 0, i[4] = 0;

// このように記述すると、EASY=0, NOMAL=1, HARD=2・・・GAME_END=4となっています
enum
{
	EASY, NOMAL, HARD, OPTION, GAME_END
};

// ステータスの初期化
OPState = EASY;

// ループ処理
while(ProcessMessage() = 0)
{
	ClearDrawScreen();

	//タイトルのバック画面描画(省略)
	graph_title();

	// カーソル処理
	if( CheckHitKey(KEY_INPUT_DOWN) && (OPState < GAME_END) )
	{
		OPState++;
	}

	if( CheckHitKey(KEY_INPUT_UP) && (OPState > EASY) )
	{
		OPState--;
	}

	//描画の分岐
	switch(OPState)
		{
			case EASY:	
					i[0] = 1;
					i[1] = 0;
					i[2] = 0;
					i[3] = 0;
					i[4] = 0;

			case NOMAL:	
					i[0] = 0;
					i[1] = 1;
					i[2] = 0;
					i[3] = 0;
					i[4] = 0;
			case HARD:	
					i[0] = 0;
					i[1] = 0;
					i[2] = 1;
					i[3] = 0;
					i[4] = 0;
			case OPTION:	
					i[0] = 0;
					i[1] = 0;
					i[2] = 0;
					i[3] = 1;
					i[4] = 0;
			case GAME_END:	
					i[0] = 0;
					i[1] = 0;
					i[2] = 0;
					i[3] = 0;
					i[4] = 1;
		}

	// カーソルの値で処理を分岐
	if(CheckHitKey(KEY_INPUT_Z)
	{
		switch(OPState)
		{
			case EASY:		GameEasy();	break;
			case NOMAL:	GameNomal();	break;
			case HARD:		GameHard();	break;
			case OPTION:	Option();		break;
			case GAME_END:	GameEnd();		break;
		}
	}

	//描画処理
	DrawGraph(x座標,y座標,img_easy[i[0]],TRUE);
	DrawGraph(x座標,y座標,img_nomal[i[1]],TRUE);
	DrawGraph(x座標,y座標,img_hard[i[2]],TRUE);
	DrawGraph(x座標,y座標,img_option[i[3]],TRUE);
	DrawGraph(x座標,y座標,img_game_end[i[4]],TRUE);


	ScreenFlip();
}
注意で実際にはx座標,y座標には数値があります。
画像描画の[/url]の中が[0]なら非選択の画像、[1]なら選択している画像、です。

あとタイトル画像描画と画像の読み込みは文が長くなるので省きました。

こんな感じ(実際は少し違ったりしますが、だいたい同じです)にしてみたんですが、うまくできません。
変な感じに描画されます。

おかしい点がわからないのでアドバイスお願いします。

Justy

Re:メニュー画面について…

#4

投稿記事 by Justy » 16年前


>変な感じに描画されます

 この説明では結果から原因を推測することは出来ません。
 何がどう変なのか具体的に説明をしてください。

 とりあえず、コード上でおかしそうなところといえば
switch(OPState) {} の各 caseの中で breakがどこにも無いこと、
KEY_INPUT_Zの押下チェックの if文の()が合わないことでしょうか。

Re:メニュー画面について…

#5

投稿記事 by » 16年前

指摘された通り直したら無事できました!
BEMANI さん、Justy さんアドバイスありがとうございました。

閉鎖

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