選択画面について

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

選択画面について

#1

投稿記事 by しーろう » 14年前

以前に質問をさせていただきました者です。
今回もみなさんのお力をお借りしたいです。

本題に入りましょう。
以前に選択画面の指摘を受けたので現在、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だけになってしまうからかな、とは思うのですがいまいち理解できません。
そもそも構造体の受け渡しはこれでいいのでしょうか。
つまり「おまけ」または「ゲーム終了」にしか動かない理由、それと構造体の受け渡しについても教えていただきたいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 選択画面について

#2

投稿記事 by softya(ソフト屋) » 14年前

SelectNum がローカル変数で関数に入るたびに初期化されている方に一票ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

しーろう

Re: 選択画面について

#3

投稿記事 by しーろう » 14年前

コード:

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 選択画面について

#4

投稿記事 by softya(ソフト屋) » 14年前

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
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

しーろう

Re: 選択画面について

#5

投稿記事 by しーろう » 14年前

すみません、返信が遅くなりました。

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

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

閉鎖

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