ボスの弾幕について

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

ボスの弾幕について

#1

投稿記事 by ジュンヤ » 15年前

四聖龍神録のオマケにある「ニコニコ中毒になりし者」で
ボスが出てきて、最初に撃ってくる、
オーロラみたいなきれいな羽の形をした弾幕を作りたいと思ったのですが、
うまくできないので、アドバイスしていただけませんでしょうか?

両方の羽の形の弾幕をいきなり作ったら難しいと思ったので、
最初に右の羽の形の弾幕だけ作ろうと思い、以下のように書きました。

最初は、angleとt(カウンター)を調整すれば、できそうな気がしたのですが、
ただ単にangleを上向きに上げて、上げきったら今度は、
下に行かせるというようなやりかたではできそうにないと思いました。
angleやt(カウンター)以外にも調整する必要な箇所はあるのでしょうか?
よろしくお願いします。
void boss_shot_bulletH000(){
   int i,k,t=boss_shot.cnt%120;
    if(t<60){
        for(i=0;i<2;i++){
            if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].col   = 0;//弾の色
                boss_shot.bullet[k].x     = FMX/2;//座標
                boss_shot.bullet[k].y     = 100;
                boss_shot.bullet[k].knd   = 2;//弾の種類
                boss_shot.bullet[k].angle = PI/120*t-PI/4;//角度
                boss_shot.bullet[k].flag  = 1;
                boss_shot.bullet[k].spd   = 1.5;//スピード
                boss_shot.bullet[k].eff   = 1;
	  }
        }
    }
    if(60<t&&t<120){
        for(i=0;i<2;i++){
            if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].col   = 0;//弾の色
                boss_shot.bullet[k].x     = FMX/2;//座標
                boss_shot.bullet[k].y     = 100;
                boss_shot.bullet[k].knd   = 2;//弾の種類
                boss_shot.bullet[k].angle = PI/2-PI/120*t;//角度
                boss_shot.bullet[k].flag  = 1;
                boss_shot.bullet[k].spd   = 1.5;//スピード
                boss_shot.bullet[k].eff   = 1;
            }
        }
    }
}

Dixq (管理人)

Re:ボスの弾幕について

#2

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

>ジュンヤさん

こんにちは^^
あの弾幕の上部分にウェーブみたいに出てるレーザーのことですよね?
あれは単にsin使ってるだけですよ。

sinの使い方は解りますか?
sinは
角度0で0,
角度PI/2で1,
角度PIで0,
角度PI*2/3で-1
となりますよね。
-1~1の間の値をスムーズに変化させて取得できます。
sin波を思い浮かべて頂ければよいかと思います。

つまり今PI/2の振れ幅でかつ周期を2秒にしたいなら

.angle = sin(PI2/120*cnt)*PI/2;

となります。
cntは適切なカウンタ値にして下さい。
これで2秒かけて-90°~+90°の値が延々と繰り返し取得できます。

ジュンヤ

Re:ボスの弾幕について

#3

投稿記事 by ジュンヤ » 15年前

Dixgさんこんにちは^^

詳しく解説していただき、ありがとうございます。
弾幕を2つ別に作るのではなく、sinを使えばよかったのですね。

そこでさっそく作ってみたのですが、
ニコニコ動画で拝見させていただいた物とは、
似ても似つかないようなものになってしまいました。

自分なりの考えをまとめると
①周期は、およそ2秒周期なので、sin(PI2/120*t)とする。
②振れ幅は、135度なので、PI/4+PI/8とする。
③開始位置を20度ずらすため、20度をラジアンに変換して、その値を加算及び減算する。

動画を何回もよく見て観察したのですが、
ウェーブみたいに出てるレーザーの一番最初のangleは、
PI*2/3(270度)でsinが-1の状態の時ではないでしょうか?

そうだとすると、同じように上向きに撃ち始めるには、
sinが-1から始めるようにしないといけないと思いました。
sinは0から始めると、振れ幅のちょうど真ん中から始まってしまいますよね。

それともう一つ質問なんですが、周期を早くすると、レーザーの隙間が大きくなってしまい、
きれいに見えないのですが、動画で拝見させていただいた物は、
周期が早いわりには、レーザーの隙間がなく、きれいに見えました。
これは何か理由があるのでしょうか?

長々と質問してしまって、すみません。
以下にプログラムも載せておきますので、
時間のある時に見ていただければ、幸いです。
よろしくお願いします。
void boss_shot_bulletH000(){
    int i,k,t=boss_shot.cnt%120;
    if(t<120){
        for(i=0;i<2;i++){
            if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].col   = 0;//弾の色
                boss_shot.bullet[k].x     = FMX/2;//座標
                boss_shot.bullet[k].y     = 100;
                boss_shot.bullet[k].knd   = 2;//弾の種類
                boss_shot.bullet[k].angle = sin(PI2/120*t)*(PI/4+PI/8)-(20*PI/180); //角度
                boss_shot.bullet[k].flag  = 1;
                boss_shot.bullet[k].spd   = 1.5;//スピード
                boss_shot.bullet[k].eff   = 1;
            }
	    if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].col   = 4;//弾の色
                boss_shot.bullet[k].x     = FMX/2;//座標
                boss_shot.bullet[k].y     = 100;
                boss_shot.bullet[k].knd   = 2;//弾の種類
                boss_shot.bullet[k].angle = -sin(PI2/120*t)*(PI/4+PI/8)+(20*PI/180)+PI; //角度
                boss_shot.bullet[k].flag  = 1;
                boss_shot.bullet[k].spd   = 1.5;//スピード
                boss_shot.bullet[k].eff   = 1;
            }
        }
    }
}

閉鎖

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