>>点此回到教程目录
(译者注:这个标题原文为“みょん弾幕を作ってみょん”,“みょん”这个妖妖梦里面的梗我实在不知道怎么翻译才好,干脆直接按照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个弹幕吧。
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数据的修改的地方。
从现在开始,由于弹幕的编号会发生改变,请对“弹幕种类”的编号进行逐一增加。
Excel数据下载