弾幕の作成について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
クラバック
記事: 26
登録日時: 8年前
住所: 関東

弾幕の作成について

#1

投稿記事 by クラバック » 7年前

いつもお世話になっております。
弾幕を作成していたのですが、行き詰ってしまったので質問させて頂きます。

ボスから射出された自機狙い弾(大弾)の周囲を、別の弾(小弾)が回っているような弾幕を考えています。
ですが、実行してから大体10個目以降の大弾に、小弾が付属しない失敗した大弾が混ざります。
何個目の大弾がうまくいかないのかは、実行する度に異なり、思ったような弾が作成できません。

宜しくお願い致します。

コード:

void boss_shot_bulletH015(){
	int t = boss_shot.cnt;
	int k;
	static double x, y;

	if(t % 120 == 0){	
		if((k=search_boss_shot())!=-1){//大弾の作成
			boss_shot.bullet[k].x = boss.x;
			boss_shot.bullet[k].y = boss.y;
			boss_shot.bullet[k].angle = bossatan2();
			boss_shot.bullet[k].cnt = 0;
			boss_shot.bullet[k].knd = 0;
			boss_shot.bullet[k].col = 0;
			boss_shot.bullet[k].flag = 1;
			boss_shot.bullet[k].state = 0;
			boss_shot.bullet[k].spd = 1;
			boss_shot.bullet[k].eff_detail = 0;
			boss_shot.bullet[k].rem_spd[0] = 1;
		}
	}
	for(int i = 0; i < BOSS_BULLET_MAX; i++){
		if(boss_shot.bullet[i].flag > 0){

			if(boss_shot.bullet[i].state == 0){

				x = boss_shot.bullet[i].x;//大弾のx座標を取得
				y = boss_shot.bullet[i].y;//大弾のy座標を取得

				if(boss_shot.bullet[i].rem_spd[0] == 1){
					
					if((k=search_boss_shot())!=-1){//大弾の周りを回る小弾の作成
						boss_shot.bullet[k].x = boss_shot.bullet[i].x;
						boss_shot.bullet[k].y = boss_shot.bullet[i].y - 50;
						boss_shot.bullet[k].cnt = 0;
						boss_shot.bullet[k].state = 1;
						boss_shot.bullet[k].flag = 1;
						boss_shot.bullet[k].knd = 4;
						boss_shot.bullet[k].col = 1;
						boss_shot.bullet[k].eff_detail = 1;
						boss_shot.bullet[k].rem_spd[0] = 0;
						boss_shot.bullet[k].angle = 0;
						boss_shot.bullet[k].spd = 0;
					}
					boss_shot.bullet[i].rem_spd[0] = 10;
				}
			}
			if(boss_shot.bullet[i].state == 1){//大弾の周りを回る小弾の制御
				
				boss_shot.bullet[i].x = x + 50 * cos(PI2/120*t);
				boss_shot.bullet[i].y = y + 50 * sin(PI2/120*t);

			}		
		}
	}
}

jay
記事: 314
登録日時: 9年前
住所: 大阪市
連絡を取る:

Re: 弾幕の作成について

#2

投稿記事 by jay » 7年前

(覚えてないと思いますけど)どうもお久しぶりです
若干燃え尽き症候群気味なjayです(だから何さ)

本題に入りますね

小さい方の弾は自身でスピードや角度と言った情報は持たず
49~50行目の部分で位置を計算しているのですよね?
その計算に使っている変数xとyに問題があるのだと思います

コード:

    for(int i = 0; i < BOSS_BULLET_MAX; i++){
        if(boss_shot.bullet[i].flag > 0){
 
            if(boss_shot.bullet[i].state == 0){
 
                x = boss_shot.bullet[i].x;//大弾のx座標を取得
                y = boss_shot.bullet[i].y;//大弾のy座標を取得
この部分を見るに
弾を全部検索して、その中でフラグが立っているstateが0の弾を見つけて、その弾の座標をとりあえず取得しているようですが

xとyをとりあえず取得したは良いものの、大弾についてくる筈の小弾にその値が適用されていないのでしょう
このやり方だと「検索で大弾がヒットするたびにxとyが書き変わる」わけですが
大弾がヒットした後で、次に値が書き変わるまでの間に、その弾についてくる小さい弾が必ずヒットする保証はどこにもないですからね

だから最初の方に撃った弾が画面外に出て、boss_shot.bulletの配列の最初の方が空いた辺りから動きがおかしくなるのだと思います


解決策としましては~
何でしょうね? 僕ならstate0の大きな弾にstate0の小さな弾をついて行かせてstate1にはstate1をついて行かせる
っていう風にしますね

まぁ、いつぞやと同じく最初は敢えて正解に繋がるコードは張らないでおきますので、解決策についてはまずはご自分で考えてみてください
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

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

Re: 弾幕の作成について

#3

投稿記事 by Tatu » 7年前

今回、大弾は直進しかしないようですね。
それならば、円運動と直進移動を組み合わせてみてはどうでしょうか?
円運動はspdとangleでさせて、
直進移動はvx,vyで大弾と同じようにするとか。

もし、大弾が複雑な軌道を描くようならば
小弾に基準となる大弾の番号を記憶させ、
大弾の座標にあわせて動くようにした方がよいかもしれません。

コード
► スポイラーを表示
上記コードの実行結果
無題.png

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

Re: 弾幕の作成について

#4

投稿記事 by Tatu » 7年前

さらに手を加えてみました。
無題.png
コード
► スポイラーを表示

閉鎖

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