第十四章 来制作各种各样的弹幕数据吧

>>点此回到教程目录

接下来,麻烦的设定已经完成了,现在我们来制作各种各样的弹幕数据吧。

一般地,自机狙的弹幕函数是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的值。

下载Excel数据

—-在 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

运行结果



如果和运行结果一样敌人发射了各种各样的弹幕的话那就成功了。

>>点此回到教程目录

results matching ""

    No results matching ""