弾幕名:なし (早苗風☆弾のサンプル)
作製難易度:★★★★ (4/10)

実行結果



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

早苗風に☆を描いて綺麗な曲線を描かせてみましょう。

まずは☆の形がどのような性質を持っているか勉強してみましょう。

α+βの角度はγになることは中学生の時に習いましたね。

同様に、a+bの角度はcに等しくなります。

こうして考えると、α、β、a・・・の角を5つ足すと180°になることが解りますね。

ということは、αの角度はπ/5という事がわかります。



下の図の「始点」を描く最初の点として、stt0の時図の方向に線を引きます。

星の中心がボスの座標です。そこから始点までの距離が赤の線です。

sttが0の時に進んでいくのは円と交わるまで。円と交わったかどうかは、中心点からの距離が

半径rを超えたかどうかで判定出来ます。判定されたらsttを1とし、角度を-(PI-PI/5)して進ませます。

stt1の時図の方向に進ませて、また同様に円に交わるまで進ませます。

4になるまで進ませて、5になったらやめます。




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

//☆弾
void boss_shot_bulletH005(){
#define TM005 820
#define RANGE005 100.0
#define LEM005 4
    int i,j,k,n,t=boss_shot.cnt%TM005,t2=boss_shot.cnt;
    static int sst,bnum;
    static double sx,sy,sangle;
        //1周期の最初なら
    if(t==0){
        sst=0;
        sx=boss.x;
        sy=boss.y-RANGE005;
        sangle=PI/5/2+PI/2;
        bnum=0;
    }
        //星を描く
    if(sst<=4){
        for(i=0;i<2;i++){
            sx+=cos(sangle)*LEM005;//座標を計算
            sy+=sin(sangle)*LEM005;
                        //円と交わったら
            if((sx-boss.x)*(sx-boss.x)+(sy-boss.y)*(sy-boss.y)>RANGE005*RANGE005){
                sangle-=(PI-PI/5);//方向転換
                sst++;//ステータス変換
                if(sst==5)break;//5なら終わる
            }
            for(j=0;j<5;j++){//星を5つ描く
                if((k=search_boss_shot())!=-1){
                    boss_shot.bullet[k].flag=1;
                    boss_shot.bullet[k].state=j;
                    boss_shot.bullet[k].cnt=0;
                    boss_shot.bullet[k].spd=0;
                    boss_shot.bullet[k].knd=10;
                    boss_shot.bullet[k].col=j;
                    boss_shot.bullet[k].angle=-PI/2+PI2/5*j;
                    boss_shot.bullet[k].x=sx;
                    boss_shot.bullet[k].y=sy;
                    boss_shot.bullet[k].vx = cos(sangle)*1.4*1.2;
                    boss_shot.bullet[k].vy = sin(sangle)*1.4;
                    boss_shot.bullet[k].base_angle[0]=sangle-PI+PI/20*bnum;
                }
            }
            bnum++;
        }
        se_flag[0]=1;
    }
   for(i=0;i<BOSS_BULLET_MAX;i++){
        if(boss_shot.bullet[i].flag>0){
            int cnt=boss_shot.bullet[i].cnt;
                        //ステータスが10未満なら
            if(boss_shot.bullet[i].state<10){
                if(t==150){//150なら星を5方向に発射
                    boss_shot.bullet[i].spd=4;//スピード
                    boss_shot.bullet[i].cnt=0;//カウンタリセット
                    boss_shot.bullet[i].state+=10;//ステータス番号変更
                }
            }
            else if(boss_shot.bullet[i].state<20){//10~19なら
                if(cnt<=80){//減速
                    boss_shot.bullet[i].spd-=0.05;
                }
                if(cnt==100){//セットした基準角度から綺麗な曲線を描く
                    boss_shot.bullet[i].angle=boss_shot.bullet[i].base_angle[0];
                }
                if(cnt>=100 && cnt<160){//加速
                    boss_shot.bullet[i].spd+=0.015;
                }
            }
        }
    }
}


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

ただしこれは

全く動かない場所が安置

と言う凄まじい問題を抱えていますから、角度は適当に乱数で調整して下さい。


- Remical Soft -