さて面倒な設定が終わったので今度は色んな種類の弾幕データを作ってみましょう。
常に自機狙いの弾幕関数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 -