ページ 11

選択画面の作り方

Posted: 2012年12月17日(月) 04:14
by ぽち
こんばんは。
調べるのにも詰まってしまったので、質問させて頂きます。

私は今、softyaさんのRPG講座のソースを元に、変更・追加をしながらC言語を学んでいます。
そこで、タイトル画面に「はじめから」「つづきから」という2つの選択を作り、
移動ができるようにしたかったのですが・・・。

どうやら、移動の前に選択(上キーで上へ、下キーで下へ)処理ができていないようなのです。
館さんの3.4章や、こちらのトピックを参考にしたのですが、上下キーを押しても反応がありません。

列挙体として扱っていると、また違うものなのでしょうか。
ごめんなさい、まだまだ勉強不足なもので、教えて下さると助かります。
どうぞよろしくお願い致します。

(softyaさんのソースコードを、全部載せた方がよろしかったでしょうか・・・?
キーコンフィグ、キーの入力状態の更新などはそのままなのですが)

コード:

#define SELECT_NUM 2

typedef struct{
        int x, y;       // 座標格納用変数
        char name[128]; // 項目名格納用変数
} TitleSelect_t ;

GameState_t Title()
{
	//  メニュー項目要素を作る
	static TitleSelect_t TitleSelect[SELECT_NUM]={
		{ 350, 450, "はじめから" }, 
		{ 370, 500, "つづきから" },
	};
	static int SelectNum = 0; // 現在の選択番号

	// 計算フェーズ 
	if( Key[ g_MainData.key_down ] == 1 ){ // 下キーが押された瞬間だけ処理
		SelectNum = ( SelectNum + 1 ) % SELECT_NUM; // 現在の選択項目を一つ下にずらす(ループする)
	}

	if( Key[ g_MainData.key_up ] == 1 ){ // 上キーが押された瞬間だけ処理
		SelectNum = ( SelectNum + SELECT_NUM - 1 ) % SELECT_NUM; // 現在の選択項目を一つ上にずらす(逆ループする)
	}

	if( Key[ g_MainData.key_down ] == 1 || Key[ g_MainData.key_up ] == 1 ){ // 下キーか、上キーが押された瞬間
		for( int i=0; i<SELECT_NUM; i++ ){             // メニュー項目数である2個ループ処理
			if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
				TitleSelect[i].x = 350; // 座標を350にする
			} else {                       // 今処理しているのが、選択番号以外なら
				TitleSelect[i].x = 370;// 座標を370にする
			}
		}
	}

	// 描画フェーズ

	for( int i=0; i<SELECT_NUM; i++ ){ // メニュー項目を描画
		DrawFormatString( TitleSelect[i].x, TitleSelect[i].y, GetColor(255,255,255), TitleSelect[i].name );
	}

	//  スペースで選択
	if(Key[g_MainData.key_act]==1) {
		switch( SelectNum ) {
		case 0://ゲームスタート
			return GAME_STATE_STORY;
			break;

		case 1://コンティニュー
			return GAME_STATE_CONTINUE;
			break;
		}
	}

	return g_MainData.gameState;    //状態継続
}

Re: 選択画面の作り方

Posted: 2012年12月17日(月) 11:46
by softya(ソフト屋)
一見は問題ないように見えますが、Keyと言うグローバル変数を私は作った覚えがないのでg_MainData.keyを使わずにうまく動くのか保証できません。

Re: 選択画面の作り方

Posted: 2012年12月17日(月) 14:58
by ぽち
softyaさん

早速のご返信ありがとうございます。
Keyは館さんのところと、混ざってしまっていたみたいです。
Key→g_MainData.keyに変えたところ、無事動かすことができました。

諦めきれなくてずっと悩んでいたのですが、これで解決できました。
本当にありがとうございました!

近くに聞ける人がいないもので、またお世話になることがあるかもしれませんが
その時はどうぞよろしくお願いします。