



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