ページ 11

選択画面について

Posted: 2011年6月01日(水) 22:03
by しーろう
以前に質問をさせていただきました者です。
今回もみなさんのお力をお借りしたいです。

本題に入りましょう。
以前に選択画面の指摘を受けたので現在、http://dixq.net/g/03_04.htmlを参考にゲームのタイトル画面を製作しています。
そして、マイナス方向へのループも理解できました。

しかし、メインループの中にすべてをごちゃごちゃと書くよりは大まかな処理ごとに関数でわけようと考えました。
そこで選択画面の処理を新たに関数に書きました。
すると思うように動作しないのです。

参考ページの

コード:

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

		// 描画フェーズ

		for( int i=0; i<5; i++ ){ // メニュー項目を描画
			DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
		}
にあたる部分です。
これを新たに作った関数、void title(int SelectNum, MenuElement_t MenuElement[5])に入れたら「おまけ」または「ゲーム終了」にしか動きません。
自分では描画フェーズのint iが1,4だけになってしまうからかな、とは思うのですがいまいち理解できません。
そもそも構造体の受け渡しはこれでいいのでしょうか。
つまり「おまけ」または「ゲーム終了」にしか動かない理由、それと構造体の受け渡しについても教えていただきたいです。

Re: 選択画面について

Posted: 2011年6月01日(水) 22:24
by softya(ソフト屋)
SelectNum がローカル変数で関数に入るたびに初期化されている方に一票ですね。

Re: 選択画面について

Posted: 2011年6月01日(水) 23:41
by しーろう

コード:

		int SelectNum = 0; // 現在の選択番号
	
	        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, Escが押されていない, キー更新)
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && Key[KEY_INPUT_ESCAPE]==0 && gpUpdateKey()==0 ){
	
		title(SelectNum, MenuElement);
このようになっていました。title関数が受け取る値が常に0になってしまってるってことですよね?
いろいろ試してみたのですがわかりません。結局どうすれば初期化されないのでしょうか。

Re: 選択画面について

Posted: 2011年6月01日(水) 23:49
by softya(ソフト屋)
title(SelectNum, MenuElement);
SelectNumは引数ですよね?
引数は値渡しですので、title関数内で変更されてもmain側のSelectNumは変更されません。
つまり呼び出すたびにmain側のSelectNumの値の0に戻ります。

これを解決するには、SelectNumをグローバル変数にして引数を止めるか、SelectNumをポインタ渡しにしてください。
詳しくは、お持ちのC言語の入門書でご確認ください。

[追記]
一応参考に。

「C言語の引数について」
http://www.c-lang.org/argument.html
「C言語編 第30章 ポインタを引数や戻り値にする」
http://www.geocities.jp/ky_webid/c/030.html

Re: 選択画面について

Posted: 2011年6月02日(木) 20:51
by しーろう
すみません、返信が遅くなりました。

ひとまず、グローバル変数にして解決しました。

まだ、構造体や因数など理解出来ていない部分も多々あるので、しっかり勉強しておきます。
また、分からない点があった時にはよろしくお願いします。
では、解決とさせていただきます。的確な回答とアドバイス、参考ページまでありがとうございました。