さて面倒な設定が終わったので今度は色んな種類の弾幕データを作ってみましょう。

常に自機狙いの弾幕関数001です。

自機と渡したn番目の敵との角度を返すshotatan2関数にnを渡す事で、簡単に自機との角度をangleに代入出来ます。


//100カウント中に10発、自機に向かって直線発射(常に自機狙い)
void shot_bullet_H001(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<100 && t%10==0){//100カウント中10カウントに1回
                if(shot[n].flag!=2 && (k=shot_search(n))!=-1){//敵がいて、弾が登録可能なら
                        shot[n].bullet[k].knd   =enemy[shot[n].num].blknd2;//弾登録
                        shot[n].bullet[k].angle =shotatan2(n);//角度
                        shot[n].bullet[k].flag  =1;//フラグ
                        shot[n].bullet[k].x     =enemy[shot[n].num].x;//座標
                        shot[n].bullet[k].y     =enemy[shot[n].num].y;
                        shot[n].bullet[k].col   =enemy[shot[n].num].col;//色
                        shot[n].bullet[k].cnt   =0;//カウンタ
                        shot[n].bullet[k].spd   =3;//スピード
                        se_flag[0]=1;
                }
        }
}


値の数値だけ見てもよくわからないでしょうから、実行結果と見比べてみて下さい。



---- shotH.cppを変更 ----


#include "../include/GV.h"

//1発だけ、自機に向かって直線発射
void shot_bullet_H000(int n){
        int k;
        if(shot[n].cnt==0){
                if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                        shot[n].bullet[k].knd   =enemy[shot[n].num].blknd2;
                        shot[n].bullet[k].angle =shotatan2(n);
                        shot[n].bullet[k].flag  =1;
                        shot[n].bullet[k].x     =enemy[shot[n].num].x;
                        shot[n].bullet[k].y     =enemy[shot[n].num].y;
                        shot[n].bullet[k].col   =enemy[shot[n].num].col;
                        shot[n].bullet[k].cnt   =0;
                        shot[n].bullet[k].spd   =3;
                        se_flag[0]=1;
                }
        }
}

//100カウント中に10発、自機に向かって直線発射(常に自機狙い)
void shot_bullet_H001(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<100 && t%10==0){//100カウント中10カウントに1回
                if(shot[n].flag!=2 && (k=shot_search(n))!=-1){//敵がいて、弾が登録可能なら
                        shot[n].bullet[k].knd   =enemy[shot[n].num].blknd2;//弾登録
                        shot[n].bullet[k].angle =shotatan2(n);//角度
                        shot[n].bullet[k].flag  =1;//フラグ
                        shot[n].bullet[k].x     =enemy[shot[n].num].x;//座標
                        shot[n].bullet[k].y     =enemy[shot[n].num].y;
                        shot[n].bullet[k].col   =enemy[shot[n].num].col;//色
                        shot[n].bullet[k].cnt   =0;//カウンタ
                        shot[n].bullet[k].spd   =3;//スピード
                        se_flag[0]=1;
                }
        }
}

//100カウント中に10発、自機に向かって直線発射(角度記憶)
void shot_bullet_H002(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<100 && t%10==0){
                if(t==0)
                        shot[n].base_angle[0]=shotatan2(n);
                if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                        shot[n].bullet[k].knd   =enemy[shot[n].num].blknd2;
                        shot[n].bullet[k].angle =shot[n].base_angle[0];
                        shot[n].bullet[k].flag  =1;
                        shot[n].bullet[k].x     =enemy[shot[n].num].x;
                        shot[n].bullet[k].y     =enemy[shot[n].num].y;
                        shot[n].bullet[k].col   =enemy[shot[n].num].col;
                        shot[n].bullet[k].cnt   =0;
                        shot[n].bullet[k].spd   =3;
                        se_flag[0]=1;
                }
        }
}

//100カウント中に10発、自機に向かってスピード変化直線発射
void shot_bullet_H003(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<100 && t%10==0){
                if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                        shot[n].bullet[k].knd   =enemy[shot[n].num].blknd2;
                        shot[n].bullet[k].angle =shotatan2(n);
                        shot[n].bullet[k].flag  =1;
                        shot[n].bullet[k].x     =enemy[shot[n].num].x;
                        shot[n].bullet[k].y     =enemy[shot[n].num].y;
                        shot[n].bullet[k].col   =enemy[shot[n].num].col;
                        shot[n].bullet[k].cnt   =0;
                        shot[n].bullet[k].spd   =1+5.0/100*t;
                        se_flag[0]=1;
                }
        }
}

//0.5秒に1回ずつ円形発射
void shot_bullet_H004(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<120 && t%20==0){
                double angle=shotatan2(n);
                for(int i=0;i<20;i++){
                        if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                                shot[n].bullet[k].knd   =enemy[shot[n].num].blknd2;
                                shot[n].bullet[k].angle =angle+PI2/20*i;
                                shot[n].bullet[k].flag  =1;
                                shot[n].bullet[k].x     =enemy[shot[n].num].x;
                                shot[n].bullet[k].y     =enemy[shot[n].num].y;
                                shot[n].bullet[k].col   =enemy[shot[n].num].col;
                                shot[n].bullet[k].cnt   =0;
                                shot[n].bullet[k].spd   =4;
                        }
                        se_flag[0]=1;
                }
        }
}

//ばらまきショット
void shot_bullet_H005(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<120 && t%2==0){
                if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                        shot[n].bullet[k].knd   =enemy[shot[n].num].blknd2;
                        shot[n].bullet[k].angle =shotatan2(n)+rang(PI/4);
                        shot[n].bullet[k].flag  =1;
                        shot[n].bullet[k].x     =enemy[shot[n].num].x;
                        shot[n].bullet[k].y     =enemy[shot[n].num].y;
                        shot[n].bullet[k].col   =enemy[shot[n].num].col;
                        shot[n].bullet[k].cnt   =0;
                        shot[n].bullet[k].spd   =3+rang(1.5);
                        se_flag[0]=1;
                }
        }
}

//ばらまきショット(減速)
void shot_bullet_H006(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<120 && t%2==0){
                if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                        shot[n].bullet[k].knd   =enemy[shot[n].num].blknd2;
                        shot[n].bullet[k].angle =shotatan2(n)+rang(PI/4);
                        shot[n].bullet[k].flag  =1;
                        shot[n].bullet[k].x     =enemy[shot[n].num].x;
                        shot[n].bullet[k].y     =enemy[shot[n].num].y;
                        shot[n].bullet[k].col   =enemy[shot[n].num].col;
                        shot[n].bullet[k].cnt   =0;
                        shot[n].bullet[k].spd   =4+rang(2);
                        se_flag[0]=1;
                }
        }
        for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分ループ
                if(shot[n].bullet[i].spd>1.5)//速度が1.5より大きいものがあれば
                        shot[n].bullet[i].spd-=0.04;//減速
        }
}



以上の弾幕追加にともなって以下も変更して下さい。

/カウンタ 移動パターン 敵の種類 x座標 y座標 スピード 発射時間 弾幕種類 弾の色 体力 弾種類 待機時間 アイテム1 2 3 4 5 6
/cnt pattern knd x y sp bltime blknd col hp blknd2 wait item_n
60 9 0 200 150 0 60 0 0 100 7 120 0 -1 -1 -1 -1 -1
200 9 0 180 150 0 60 1 0 100 8 120 0 -1 -1 -1 -1 -1
340 9 0 200 150 0 60 2 0 100 9 120 0 -1 -1 -1 -1 -1
480 9 0 180 150 0 60 3 0 100 0 120 0 -1 -1 -1 -1 -1
620 9 0 200 150 0 60 4 0 100 7 120 0 -1 -1 -1 -1 -1
760 9 0 180 150 0 60 5 0 100 8 120 0 -1 -1 -1 -1 -1
900 9 0 180 150 0 60 6 0 100 8 120 0 -1 -1 -1 -1 -1


移動パターンは全て出現して上に行くだけのパターン9。 今回0〜6の弾幕データを作ったので

「弾幕種類」には0〜6の値を渡しています。


エクセルデータのダウンロード



---- shot.cppのexntern宣言部とポインタ代入部を以下のように変更 ----

extern void shot_bullet_H000(int);
extern void shot_bullet_H001(int);
extern void shot_bullet_H002(int);
extern void shot_bullet_H003(int);
extern void shot_bullet_H004(int);
extern void shot_bullet_H005(int);
extern void shot_bullet_H006(int);

void (*shot_bullet[SHOT_KND_MAX])(int) ={
        shot_bullet_H000,
        shot_bullet_H001,
        shot_bullet_H002,
        shot_bullet_H003,
        shot_bullet_H004,
        shot_bullet_H005,
        shot_bullet_H006,
};



---- function.h に以下を追加 ----

GLOBAL double rang(double);


---- define.h の以下を変更 ----

#define SHOT_KND_MAX 7

実行結果



実行結果のように色々な弾幕を敵が撃てば成功です。



- Remical Soft -