【龍神録】ゲームオーバーの実装について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

【龍神録】ゲームオーバーの実装について

#1

投稿記事 by amehirune » 11年前

何度も質問してしまい申し訳ありません。アメヒルネです。

今回は、(音楽データの問題は後半に回すとして)ゲームオーバー画面の仮実装している最中に起こったバグについて尋ねたいです。

以下、ソースファイル
[hr]↓main.cpp

コード:

//前略
		switch(func_state){
			case 0://初回のみ入る処理
				loading();
				load();		//データロード
				func_state=10;
				break;

			case 10://初期化処理
				loading();
				first_ini();//初回の初期化
				score_ini();//ハイスコアの読み込み
				PlaySoundMem(music[0],DX_PLAYTYPE_BACK);
				func_state=20;
				break;

			case 19:
				loading();
				delete_bgm();
				ini();
				func_state=20;
				break;

			case 20://メニュー画面処理
				GAME_TITLE();
				break;

			case 99://STGを始める前に行う初期化
				loading();
				ini();
				load_story();
				func_state=100;
				break;

			case 100://通常処理
								 //enter_func_tm("最初");
				calc_ch();       //enter_func_tm("キャラ計算");
				ch_move();       //enter_func_tm("キャラ移動");
				cshot_main();    //enter_func_tm("自機ショットメイン");
				enemy_main();	 //enter_func_tm("敵処理メイン");
				boss_shot_main();//enter_func_tm("ボスショットメイン");
				shot_main();	 //enter_func_tm("ショットメイン");
				out_main();  	 //enter_func_tm("当たり判定");
				effect_main();   //enter_func_tm("エフェクトメイン");
				calc_main();	 //enter_func_tm("計算メイン");
				graph_main();    //enter_func_tm("描画メイン");
				bgm_main();		 //enter_func_tm("BGMメイン");
				if(boss.flag==0)					stage_count++;

				if(CheckStateKey(KEY_INPUT_P)==1)	func_state=101;//Pキーで簡易型ポーズの実装
				if(ch.num<0){
					func_state=102;
				}
				if(stage_count>stage_end_time[stage])	func_state=103;
				break;
			
			case 101://仮実装のポーズ画面処理
				pause();
				break;

			case 102://仮実装のゲームオーバー画面操作
				continue_game();
				break;

			case 103://仮実装のステージ移行操作
				stage_count=0;
				stage++;
				func_state=100;
				break;

			case 999://終了前のファイル出力。増やす可能性大
				hiscore_write();
				func_state=1000;
				break;

			default:
				printfDx("不明なfunc_state\n");
				break;
		}
//後略
↓menu.cpp

コード:

void continue_game(){

//shotキーはKey[4],bomキーはKey[5]に対応している
	static int over_state;

	switch(over_state){

		case 0:
			DrawFormatString( 150, 200, color[0], "Game Over!!" );
			if(Key[4]==1)	over_state=1;
			break;

		case 1:
			if(ch.credit>0){
				DrawFormatString( 150, 250, color[0], "continue?  credit=%d",ch.credit);
				DrawFormatString( 150, 265, color[0], "Yes>>shot	No>>bom" );
	
				if(Key[4]==1){
					ch.score=0;
					ch.num=3;
					ch.score++;
					ch.credit--;
					func_state=100;
					over_state=0;
				}
				if(Key[5]==1){
					func_state=19;
					over_state=0;
				}
		
			}
			else{
				WaitKey();
				func_state=19;
			}

			break;

		default:
			printfDx("不明なover_func");
			break;
	}

}
[hr]このコードだと、ゲームオーバーになると即時に自動でコンテニューされてしまい、
途中でやめるなどの操作ができません。

自分での考察として、
①func_stateの値の変化のさせ方が不相応
②continue_game関数内のif文の制御の方法が不相応
③over_stateの値の変化のさせ方が不相応

と考えております。

自分でも何度も考えてみましたが、わかりません。
また凡ミスをしている可能性もあるので、再度チェックを重ねるつもりですが、どうかよろしくお願いします。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

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

Re: 【龍神録】ゲームオーバーの実装について

#2

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

デバッガでブレーク→ステップ実行で追いかけてみましたか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: 【龍神録】ゲームオーバーの実装について

#3

投稿記事 by Tatu » 11年前

Key[4]の値は押した時間でしょうか?0と1だけでしょうか?

rascal
記事: 27
登録日時: 11年前

Re: 【龍神録】ゲームオーバーの実装について

#4

投稿記事 by rascal » 11年前

おはようございます
>このコードだと、ゲームオーバーになると即時に自動でコンテニューされてしまい、
途中でやめるなどの操作ができません。についてですが
10行目と18行目の if(Key[4]==1)が一回のキー入力で同時に判定されています
なので自動コンティニューしているようにみえます

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: 【龍神録】ゲームオーバーの実装について

#5

投稿記事 by amehirune » 11年前

softya(ソフト屋) さんが書きました:デバッガでブレーク→ステップ実行で追いかけてみましたか?
お恥ずかしいことながら、実は私、ステップ実行というものがよくわかりません…(´Д` ;)トホホ
詳しいやり方やその機能の説明等、ご教授していただけないでしょうか?
Tatu さんが書きました:Key[4]の値は押した時間でしょうか?0と1だけでしょうか?
基本的に時間となります。
こちらが、そのKeyの値を保存する関数です。参考までに。

コード:

void gpUpdateKey(){	// パット・キーの入力状態を監視・更新する関数

	int inputpad[6];
    inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
    inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);
	inputpad[4]=CheckStatePad(configpad.shot); inputpad[5]=CheckStatePad(configpad.bom);

	for(int i=0;i<6;i++){
		if(inputpad[i]>0)	Key[i]++;
		else				Key[i]=0;
	}

}
rascal さんが書きました:おはようございます
>このコードだと、ゲームオーバーになると即時に自動でコンテニューされてしまい、
途中でやめるなどの操作ができません。についてですが
10行目と18行目の if(Key[4]==1)が一回のキー入力で同時に判定されています
なので自動コンティニューしているようにみえます
これは間違いないはずです。
10行目のキー入力が終了すると同時にその関数は終了され、
再度読み込まれる際には再びKeyの値は更新されてから、なので。

…と、思ったらバグポイントを発見しました(汗)
やっぱり凡ミスですね(泣)

コード:

gpUpdateKey();
他の関数ではこれを読み込んでいるのに対し、このゲームオーバーの関数のみ読み込みを忘れていました…トホホ
というわけで、解決です。ありがとうございました…というより、ご迷惑をおかけしました。 orz
以下、改良ソースです。

コード:

void continue_game(){

	static int over_state;
	gpUpdateKey();

	switch(over_state){

		case 0:
			DrawFormatString( 150, 200, color[0], "Game Over!!" );
			if(Key[4]==1)	over_state=1;
			break;

		case 1:
			if(ch.credit>0){
				DrawFormatString( 150, 250, color[0], "continue?  credit=%d",ch.credit);
				DrawFormatString( 150, 265, color[0], "Yes>>shot	No>>bom" );
	
				if(Key[4]==1){
					ch.score=0;
					ch.num=3;
					ch.score++;
					ch.credit--;
					func_state=100;
					over_state=0;
				}
				if(Key[5]==1){
					func_state=19;
					over_state=0;
				}
		
			}
			else{
				WaitKey();
				func_state=19;
			}

			break;

		default:
			printfDx("不明なover_func");
			break;
	}

}
【追記】
ステップ実行についてよくわかっていないので、softyaさんからの回答をいただいてから解決といたします。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

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

Re: 【龍神録】ゲームオーバーの実装について

#6

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

ブレークが出来るならF10でステップ実行出来ます。やってみればすぐわかります。デバッグメニューにも有るんですけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

rascal
記事: 27
登録日時: 11年前

Re: 【龍神録】ゲームオーバーの実装について

#7

投稿記事 by rascal » 11年前

こんにちは
デバックのステップ実行については 以下のサイトが参考にならないでしょうか?

デバック技術

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: 【龍神録】ゲームオーバーの実装について

#8

投稿記事 by amehirune » 11年前

お二方、ご回答ありがとうございます。

参考サイトのほうを確認させていただきました。
超基本…(;ω;`)ブワッ

あと実行しては見たのですが、ちょっとよくわからない部分が多かったです(汗)

本当にありがとうございました!
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: 【龍神録】ゲームオーバーの実装について

#9

投稿記事 by amehirune » 11年前

先ほどのコメントでよくわからない書き方をしてしまい、申し訳ありません。
あれって何回も実行して使用する方法だったんですね^^;
今、把握しました。
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

閉鎖

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