弾幕名:なし (「そして誰もいなくなるか?」のサンプル)
作製難易度:★★★★ (4/10)

実行結果



第六回弾幕作製講座は、練習の為の弾幕です。

「そして誰もいなくなるか?」のような周りからせめてくるような弾を作ってみましょう。

前の節で☆を描く為に座標を移動しながら弾を置いていきましたが、あれと同じように、

座標を移動させながら弾を置いていきましょう。

今回は☆ほど計算式が複雑じゃないので、ただの方程式で置く事は出来ますが、

今後の拡張の為に、先ほどと同じ方法でやってみます。

さて、画面左上を始点とし、まず画面右上の方向へ角度angle=0の方向に移動します。

画面右上端まで来たら、angle+=PI/2をし、下に向けます。そして画面右下端まできたらまたangle+=PI/2し・・・

として画面端を一周させます。

弾を置いていく間隔は定義文1つ変更すれば全部自動的に綺麗に変更できるよう少々綺麗に書いてみる事を試みます。

#define DNUMX 15

が、画面水平方向に置く弾の個数です。

画面の幅÷置く個数

を計算すれば弾を置く間隔が求まります。

この間隔で縦の画面幅から割れば置く個数が求まり、またたての画面幅から個数でわれば実数としての

鉛直方向に置く幅が求まります。

下の宣言部分ではそれをやっています。

後は、画面中央に向けて発射するだけです。

今回、k番目の弾をx,y座標に向かせる角度を求める関数bossatan3を実装しました。

弾の番号と向かせたい座標を渡せば角度が返ります。

今回は3種類の弾の動きを作りました。

スピード、角度などをちょっと変更するだけで色々動きが変わるのでやってみて下さい。



---- boss_shotH.cpp に以下を追加 ----

//周りから中央への発射
void boss_shot_bulletH006(){
#define TM006 300
//横一列に置く弾の数
#define DNUMX 15
    int i,j,k,t=boss_shot.cnt%TM006,t2=boss_shot.cnt;
    double xlen=FMX/DNUMX;//画面にDNUM個並べるにはxlen間隔で並べればいい
    int dnumy=FMY/xlen;//xlenずつならべると鉛直方向にいくつはいるか
    int cnum;
    if(dnumy==0){printfDx("boss_shot_bulletH006で0割り\n"); return ;}
    double ylen=FMY/dnumy;//ylenずつおけばいい
    double x,y,angle;
    static int num;
    if(t2==0)num=0;
    if(t==0){
        x=0,y=0,angle=0,cnum=0;
        //画面左上端から 右→下→左→上 の4方向移動させる
        for(j=0;j<4;j++){
            //水平方向ならDNUMX、鉛直方向ならdnumy
            int to = j%2 ? dnumy: DNUMX ;
            //水平方向、鉛直方向では置く個数が違うので、to回置く
            for(i=0;i<=to;i++){
                if((k=search_boss_shot())!=-1){
                    boss_shot.bullet[k].x     = x;//座標
                    boss_shot.bullet[k].y     = y;
                    boss_shot.bullet[k].knd   = 4;//弾の種類
                    boss_shot.bullet[k].flag  = 1;
                    boss_shot.bullet[k].cnt   = 0;
                    switch(num){
                        case 0://発射種類1
                    boss_shot.bullet[k].col   = 0;//弾の色
                    boss_shot.bullet[k].angle = bossatan3(k,FMX/2,FMY/2);//角度
                    boss_shot.bullet[k].spd   = 1.3;//スピード
                    boss_shot.bullet[k].state = 0;//ステータス
                        break;
                        case 1://発射種類2
                    boss_shot.bullet[k].col   = 3;//弾の色
                    boss_shot.bullet[k].angle = bossatan3(k,FMX/2,FMY/2);//角度
                    boss_shot.bullet[k].spd   
                        = 1.4+ ((j%2 ? -1 : 1) * ((cos(PI2/to*i-PI)+1)/2))*0.4;//スピード
                    boss_shot.bullet[k].state = 1;//ステータス
                        break;
                        case 2://発射種類3
                    boss_shot.bullet[k].col   = 6;//弾の色
                    boss_shot.bullet[k].angle = bossatan3(k,FMX/2,FMY/2);//角度
                    boss_shot.bullet[k].spd   = 1.3;//スピード
                    boss_shot.bullet[k].state = 2;//ステータス
                    boss_shot.bullet[k].base_angle[0] 
                        = PI/1000 * (j%2 ? -1 : 1) * ((cos(PI2/to*i-PI)+1)/2);//加算する角度
                        break;
                    }
                    se_flag[0]=1;
                    cnum++;
                }
                x+=cos(angle)*xlen;
                y+=sin(angle)*ylen;
            }
            angle+=PI/2;
        }
    }
    for(i=0;i<BOSS_BULLET_MAX;i++){
        if(boss_shot.bullet[i].flag>0){
            int cnt=boss_shot.bullet[i].cnt;
            switch(boss_shot.bullet[i].state){
                case 2://発射種類3なら
                                        //角度を加算
                    boss_shot.bullet[i].angle+=boss_shot.bullet[i].base_angle[0];
                    break;
                default:
                    break;
            }
        }
    }
    if(t==TM006-1)
        num=(++num)%3;
}


変更されているfunc.hも確認しておいて下さい。

またまた安置があるので調整は必要です。


- Remical Soft -