第十五章 制作yooo~梦的弹幕吧

>>点此回到教程目录

(译者注:这个标题原文为“みょん弾幕を作ってみょん”,“みょん”这个妖妖梦里面的梗我实在不知道怎么翻译才好,干脆直接按照niconico大百科的说法直接翻成妖梦好了……,具体情况还是请各位看官自行百度吧。)

诶?题目很奇怪?别在意这些细节了啦。

接下来,既然我们已经知道了基本弹幕的制作方法了,那么我们就试着做做稍微复杂一点的弹幕吧。

……虽然这么说,要是突然就增加难度那可就不容易理解了,首先我们还是从简单的弹幕开始。

这次,我们先把运行结果给大家看看。


运行结果


具体来说,和妖梦的弹幕比起来还是有一些区别,如果要非常相似的话,计算的式子会很复杂,所以这里就简略化了。

要想这样子射出子弹,需要怎么做呢?

让发射源以敌人所在位置为中心回旋着移动?

从下往上进行半回旋。

从敌人所在的位置开始,从PI/2开始先后在PI/2+PI的方向和PI/2-PI的方向的两个方向之间回旋?

这次我们试着将这个动作在150次计数中进行15次射击来表现。

—-在 shotH.cpp中进行以下追加 —-

//妖梦弹幕
void shot_bullet_H007(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<=150 && t%10==0){
                for(int i=0;i<20;i++){
                        if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                                shot[n].bullet[k].knd   =7;
                                shot[n].bullet[k].angle =PI2/20*i;
                                shot[n].bullet[k].flag  =1;
                                shot[n].bullet[k].x     =enemy[shot[n].num].x+cos(PI/2+PI/150*t)*100;
                                shot[n].bullet[k].y     =enemy[shot[n].num].y+sin(PI/2+PI/150*t)*100;
                                shot[n].bullet[k].col   =2;
                                shot[n].bullet[k].cnt   =0;
                                shot[n].bullet[k].spd   =1.2;
                        }
                }
                for(int i=0;i<20;i++){
                        if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                                shot[n].bullet[k].knd   =7;
                                shot[n].bullet[k].angle =PI2/20*i;
                                shot[n].bullet[k].flag  =1;
                                shot[n].bullet[k].x     =enemy[shot[n].num].x+cos(PI/2-PI/150*t)*100;
                                shot[n].bullet[k].y     =enemy[shot[n].num].y+sin(PI/2-PI/150*t)*100;
                                shot[n].bullet[k].col   =4;
                                shot[n].bullet[k].cnt   =0;
                                shot[n].bullet[k].spd   =1.2;
                                se_flag[0]=1;
                        }
                }
        }
}
cos(PI/2+PI/150*t)*100;

中的cos的作用是在0~1的范围内计算出x分量,然后乘以圆的半径100。

如果想要变更圆的大小的话,就调整这个100就行了。

其次,如果每一次都要变更声明、定义的话很麻烦,所以这里我们先声明18个弹幕吧。

—-在 shotH.cpp中进行以下追加 —-

void shot_bullet_H008(int n){}
void shot_bullet_H009(int n){}
void shot_bullet_H010(int n){}
void shot_bullet_H011(int n){}
void shot_bullet_H012(int n){}
void shot_bullet_H013(int n){}
void shot_bullet_H014(int n){}
void shot_bullet_H015(int n){}
void shot_bullet_H016(int n){}
void shot_bullet_H017(int n){}

—-在 shot.cpp 中任意地方进行以下修改 —-

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);extern void shot_bullet_H007(int);extern void shot_bullet_H008(int);
extern void shot_bullet_H009(int);extern void shot_bullet_H010(int);extern void shot_bullet_H011(int);
extern void shot_bullet_H012(int);extern void shot_bullet_H013(int);extern void shot_bullet_H014(int);
extern void shot_bullet_H015(int);extern void shot_bullet_H016(int);extern void shot_bullet_H017(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,shot_bullet_H007,shot_bullet_H008,shot_bullet_H009,
        shot_bullet_H010,shot_bullet_H011,shot_bullet_H012,shot_bullet_H013,shot_bullet_H014,
        shot_bullet_H015,shot_bullet_H016,shot_bullet_H017,
};

—-对 define.h 的定义进行以下修改 —-

#define SHOT_KND_MAX 18

这是Excel数据的修改的地方。

从现在开始,由于弹幕的编号会发生改变,请对“弹幕种类”的编号进行逐一增加。

计数器 移动模式 敌人的种类 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 7 0 100 0 200 0 -1 -1 -1 -1 -1

Excel数据下载

>>点此回到教程目录

results matching ""

    No results matching ""