弾幕シューティングゲームにおいて弾を固定した後角度変化を持たせたい

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

弾幕シューティングゲームにおいて弾を固定した後角度変化を持たせたい

#1

投稿記事 by 青成 » 4年前

どうも、度々お世話になっております。
私は龍神録プログラミングの館様で弾幕シューティングゲームの勉強をさせて頂いております。
今回私は「リサージュ図形を描き弾を配置した後、規則的な角度変化で弾が飛んでいく」弾幕を作ろうと思っております。
イメージは東方星蓮船のレイディアントトレジャーガンのような感じです。
参考動画 [youtube][/youtube]
弾が直線状に配置された後に規則的な角度変化で弾が飛んでいます。

自分で組んでみた結果次のようになりました

コード:


inline double Get_Angle_To_Radian ( double Temp_Angle ) { return Temp_Angle /180.0 *PI; }
        void shot_bullet_H008(int n){
	  int t=shot[n].cnt;
        int k;
        if(t>=0 && t<360 && t%1==0){
                if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                        shot[n].bullet[k].knd   =4;
                        shot[n].bullet[k].angle =PI2;
                        shot[n].bullet[k].flag  =1;
                        shot[n].bullet[k].x     =200 +cos ( Get_Angle_To_Radian ( 5.0 *t ) )*150;
                        shot[n].bullet[k].y     =140 -sin ( Get_Angle_To_Radian ( 6.0 *t ) + 0 )*150;
                        shot[n].bullet[k].col   =6;
                     shot[n].bullet[k].cnt   =0;
                        shot[n].bullet[k].spd   =0;
                        se_flag[0]=1;
                }
        }
      for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分
        if(shot[n].bullet[i].flag>0){//登録されている弾があれば
            int cnt=shot[n].bullet[i].cnt;
           if(cnt >= 500){
			  for(int a=0;a<360;a++){
                                 shot[n].bullet[i].angle +=PI2*a;
				 shot[n].bullet[i].spd   =2.5;
			  }
            }
        }
    }


}
リサージュ図形の軌道で弾を配置するプログラムは組めましたが、500カウント経過した後、弾が全て0度(真右方向)に飛んで行ってしまいます。
for(int a=0;a<360;a++){
shot[n].bullet.angle +=PI2*a;

のように書けば角度が1度ずつずれて飛んでいく・・・と思っていましたが角度は変化せずに0度のままでした。

どのようにすれば配置された弾が一定の角度変化で飛んでいくようになりますか?お願いします。

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

Re: 弾幕シューティングゲームにおいて弾を固定した後角度変化を持たせたい

#2

投稿記事 by Tatu » 4年前

0,2π,4π,…の方向に撃っていますが
これらはすべて0と同じ方向になります。

1°をラジアンに変換した時の値は何でしょうか?

青成

Re: 弾幕シューティングゲームにおいて弾を固定した後角度変化を持たせたい

#3

投稿記事 by 青成 » 4年前

1度を弧度法にすると0.0174・・・・ラジアンになりますね。
つまり度数法を弧度法として扱えばいいと言うことですか?
調べてみると計算式は
1度=(1 × 3.14) ÷ 180 ということが分かりました。

これをプログラムに入れると、

コード:

 for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分
        if(shot[n].bullet[i].flag>0){//登録されている弾があれば
            int cnt=shot[n].bullet[i].cnt;
           if(cnt >= 500){
              for(int a=0;a<360;a++){
                                 shot[n].bullet[i].angle +=PI2+((a*PI)/180);
                 shot[n].bullet[i].spd   =2.5;
              }
            }
        }
となりました。

そうすると弾が0度の方向に飛んでいくことはなくなりましたが、その場で震えるだけになりました。恐らく500カウント後にずっと角度変化が行われるため
その場で360度くるくる高速回転しているんだと思います・・・。
500カウント後の最初の一度だけ角度が決められるようにしたいです。ご教授ください。
またここまでで何か違う点はございますでしょうか・・・?

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

Re: 弾幕シューティングゲームにおいて弾を固定した後角度変化を持たせたい

#4

投稿記事 by Tatu » 4年前

「500カウント後の一度だけ角度を決められるようにしたい」とのことですが
コードを見たところ、弾を撃った直後は動かないようなので
弾を撃つときに動かしたい角度を代入して、
500カウントの時は速さを2.5にするだけにするとよいでしょう。

もし、今回と違って撃った直後は敵から弾の発射位置の方向に動き、
その後に角度が変化し、変化後の角度は弾ごとに1°ずつ変わるというような弾幕を
私が作るとしたら弾のstateに発生した時のカウントを記憶させて
変化するタイミングで角度を計算するというようなやり方をすると思います。

青成

Re: 弾幕シューティングゲームにおいて弾を固定した後角度変化を持たせたい

#5

投稿記事 by 青成 » 4年前

なるほど!弾を配置する際に角度を決めておく、その発想はなかったです。
先ほどはfor文でaの値を変化させてましたが、tに適当な数字をかけることで自分の理想の形にする事ができました。Tatu様ありがとうございました。
以下コードです。

コード:

void shot_bullet_H008(int n){
	  int t=shot[n].cnt;
        int k;
        if(t>=0 && t<360 && t%1==0){
                if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                        shot[n].bullet[k].knd   =4;
		       shot[n].bullet[k].angle =PI2+(((t*15)*PI)/180);
                        shot[n].bullet[k].flag  =1;
                        shot[n].bullet[k].x     =200 +cos ( Get_Angle_To_Radian ( 5.0 *t ) )*150;
                        shot[n].bullet[k].y     =140 -sin ( Get_Angle_To_Radian ( 6.0 *t ) + 0 )*150;
                        shot[n].bullet[k].col   =8;
                     shot[n].bullet[k].cnt   =0;
                        shot[n].bullet[k].spd   =0;
                        se_flag[0]=1;
                }
        }
      for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分
        if(shot[n].bullet[i].flag>0){//登録されている弾があれば
            int cnt=shot[n].bullet[i].cnt;
           if(cnt >= 500){
				 shot[n].bullet[i].spd   =2.5;
				 shot[n].bullet[i].col   =3; //変化したというのが分かりやすいように
			   
			  
            }
        }
    }


}

質問は解決しましたので解決としましたが少し気になった所があったので追加質問させてください。
この場合500カウントから導火線のように先に置かれた弾から順番にスピードが与えられるようになっているのですが、全ての弾を同時にスピードを与えるようにするにはどうすればいいでしょうか?

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

Re: 弾幕シューティングゲームにおいて弾を固定した後角度変化を持たせたい

#6

投稿記事 by Tatu » 4年前

弾が撃たれてから500カウントではなく、
弾幕が始まってから500カウントに動き出すようにすればよいのではないでしょうか。

青成

Re: 弾幕シューティングゲームにおいて弾を固定した後角度変化を持たせたい

#7

投稿記事 by 青成 » 4年前

ハハハ・・・こうもあっさり解決できるとは・・・。

コード:

 for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分
        if(shot[n].bullet[i].flag>0){//登録されている弾があれば
           if(t >= 360){//30~120カウントなら
				 shot[n].bullet[i].spd   =2.5;
				 shot[n].bullet[i].col   =3;
			   
			  
            }
        }
    }
いやはや、本当にお世話になりました。ありがとうございました。

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

Re: 弾幕シューティングゲームにおいて弾を固定した後角度変化を持たせたい

#8

投稿記事 by Tatu » 4年前

解決したようですが
t == 360(ちょうど360の時)ではなく、
t >= 360(360以上の時)としている理由が気になりました。

青成

Re: 弾幕シューティングゲームにおいて弾を固定した後角度変化を持たせたい

#9

投稿記事 by 青成 » 4年前

前のプログラムだったら>=じゃないとfor文が働かないと思ってやってましたが今のプログラムでは不必要ですよね・・・
コピペでやってました。

閉鎖

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