第十四章 来制作各种各样的弹幕数据吧
接下来,麻烦的设定已经完成了,现在我们来制作各种各样的弹幕数据吧。
一般地,自机狙的弹幕函数是001。
通过往shotatan2函数传入n,这个函数返回自机和传入的第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;//flag
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"
//只发射一发,向着自机直线发射
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回
//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;//flag
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秒一次地圆形发射
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坐标 | 速度 | 发射时间 | 弹幕种类 | 子弹的颜色 | 体力 | 子弹的种类 | 待机时间 | 物品 | |||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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
运行结果