ボス弾幕の謎と音楽の止め方

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

ボス弾幕の謎と音楽の止め方

#1

投稿記事 by オメガファイター » 14年前

おはようございます。
2、3日前に、2面以降の作り方について聞いたものですが、過去ログ等を見ても分からない事があったので質問します。


現在作っている超絶お試しSTGも2面作りに成功したので、現在は絵を描いたり、タイトル画面作ったり、残機やボムの上限などの、プログラムの館で紹介しきれていない所をボチボチ搭載しています。


そこで出てきた問題ですが、

1つ目は、
『ボス(中ボス含む)の弾幕で死んで(ゲームオーバー)からタイトルに戻って、再度1面からやり直した場合、何故かボスが放っていた弾幕が画面に(停止状態で)残ってしまっている』

2つ目、
『2面やタイトルに戻った時も、1面の音楽が止まらず、2重に音楽がかかってしまう』



1つ目は、雑魚敵の弾幕で死んでやり直した場合は残らないのですが、ボスの弾幕で死んでやり直した場合、何故か死んだ時に画面に表示されていた弾幕が、停止状態で表示されてしまいます。

2つ目は、単純に音楽の止め方がイマイチ分かりません。
ini.ccpの中で音楽の初期化もしてありますし、
駄目もとで、area.bgm.flag=0;や=2;などをmain.ccpのcase文に入れて見ましたが、それでも止まりませんでした。



2つともゲームタイトルを作る前から発生していた問題なので、タイトルは関係ないと思われます。
この問題、両方ともini.ccpで初期化されている内容のハズ(ですよね?)なのに何故、初期化されていないのでしょう?


1つ目はともかく、2つ目はゲームとして確実に問題があるので、どうか解決策をお願いします。

オメガファイター

Re: ボス弾幕の謎と音楽の止め方

#2

投稿記事 by オメガファイター » 14年前

main.ccpのcase文載せます。

コード:

while(ProcessLoop()==0){//メインループ
		music_ini();
		switch(func_state){
			case 0://タイトル
				G_title();//ゲームタイトル表示
				area.bgm.flag=0;
				if(CheckStatePad(configpad.shot)==1)//Zキーが押されたらスタート
					func_state=10;
				break;
			case 10://初回のみ入る処理
				load();		//データロード
				first_ini();//初回の初期化
				func_state=99;
				break;
			case 98://2面初期化
				area.bgm.flag=0;
				snd_ini();//←2回目の初期化。ここはmemset(&ch,0,sizeof(ch_t));と初期残機・ボム数の文のみ削除。
				load_story2();//2面読み込み
				func_state=110;//2面スタート
				break;
			case 99://STGを始める前に行う初期化
				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(stage_count==3000)//カウント3000で2面の初期化へ
					func_state=98;
				if(ch.num==0)//残機ゼロなら
					func_state=0;//タイトルへ
				break;
		   case 110://通常処理
								 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(ch.num==0)//残機ゼロなら
					func_state=0;//タイトルへ
				break;
			default:
				printfDx("不明なfunc_state\n");
				break;
		}

codeの使い方があってるか不安……

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ボス弾幕の謎と音楽の止め方

#3

投稿記事 by みけCAT » 14年前

もし可能であれば、プロジェクト全体を(あぷろだなどに)アップロードしていただけないでしょうか?
あぷろだの例:http://www.axfc.net/uploader/
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: ボス弾幕の謎と音楽の止め方

#4

投稿記事 by Dixq (管理人) » 14年前

> 『ボス(中ボス含む)の弾幕で死んで(ゲームオーバー)からタイトルに戻って、再度1面からやり直した場合、何故かボスが放っていた弾幕が画面に(停止状態で)残ってしまっている』

これは弾の初期化・終了処理をしていないからです。
弾幕を終了する時には毎回必ず弾情報の初期化をするようにして下さい。
とりあえずすべての弾のフラグを落とせばこのようなことは無くなると思います。

> 『2面やタイトルに戻った時も、1面の音楽が止まらず、2重に音楽がかかってしまう』

音楽をとめていないからでしょう。
どのような関数で鳴らしているか解りませんが、DXライブラリのHPのリファレンスを見れば止め方が書いてあります。
http://homepage2.nifty.com/natupaji/DxLib/dxfunc.html

オメガファイター

Re: ボス弾幕の謎と音楽の止め方

#5

投稿記事 by オメガファイター » 14年前

みけCATさん

うpしてみました。
http://www1.axfc.net/uploader/N/so/118928
passは「x-555」です。

龍神録の50章改が元になっています。
素材を龍神録のモノに戻したり、タイトル画像を消しましたが、問題なく問題は発生している(?)ので変わりはないはずです。
最初の画面は暗いですが、Zキーを押すとステージが始まります。
後、1面はデバックのために1000カウントで移動するようになってます(ようは変え忘れたままあげてしまった。


管理人さん

ありがとうございます。
いろいろ試行錯誤してみます。

>どのような関数で鳴らしているか解りませんが

ソースそのままなので、龍神録の再生法と変わらないハズです。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ボス弾幕の謎と音楽の止め方

#6

投稿記事 by みけCAT » 14年前

確認はしていませんが

コード:

			case 98://2面初期化
				area.bgm.flag=0;
				snd_ini();
				load_story2();
				func_state=110;
				break;
のところを

コード:

			case 98://2面初期化
				StopSoundMem(area.bgm.handle);//追加
				delete_bgm();//追加
				area.bgm.flag=0;
				snd_ini();
				load_story2();
				func_state=110;
				break;
としてみたらどうでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ボス弾幕の謎と音楽の止め方

#7

投稿記事 by みけCAT » 14年前

ボスが放った弾幕が残る件については、ini関数とsnd_ini関数の最初のmemsetのあたりに

コード:

memset(&boss_shot,0,sizeof(boss_shot_t));
を追加してみたらどうですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

オメガファイター

Re: ボス弾幕の謎と音楽の止め方

#8

投稿記事 by オメガファイター » 14年前

返信が送れてすみません。

みけCATさんのやり方に、過去ログなどをみて変更していたらどちらも解決しました。

ありがとうござました。

閉鎖

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