第十六章 来制作诹访子大人的弹幕吧
在前面的章节中,我们已经完善好了我们的模块,因此下面弹幕的追加将会很轻松。
现在我们只需要修改弹幕函数就行了。
我们用shot_bullet_H008来实现诹访子大人的弹幕吧。
诹访子大人的弹幕是东方风神录EX的最后一个弹幕。如果不是很清楚请在视频中确认一下。
注:这是niconico的网站,国内可能进不去,我也没办法扒下来,想看的只能搭梯子了……
出人意外的是,EX的最后一个弹幕非常简单地就实现出来了……听到这种说法不少东方厨得烧我了吧,但是确实是很简单地就做出了非常相似的弹幕。
—-在 shotH.cpp中进行以下追加 —-
//诹访子大人
void shot_bullet_H008(int n){
int t=shot[n].cnt;
int k;
if(t>=0 && t<1200 && t%90==0){
double angle=rang(PI);
for(int j=0;j<2;j++){//中途的时候就分裂为两部分
for(int i=0;i<60;i++){//一次60个
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =8;//第8号子弹
shot[n].bullet[k].angle =angle+PI2/60*i;//60个圆
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 =4;//第4号颜色
shot[n].bullet[k].cnt =0;
shot[n].bullet[k].state =j;//状态。0或者是1表示不同旋转。
shot[n].bullet[k].spd =2;
}
}
}
se_flag[0]=1;//播放发射音效
}
for(int i=0;i<SHOT_BULLET_MAX;i++){//所有子弹的循环
if(shot[n].bullet[i].flag>0){//如果有登录了的子弹
int state=shot[n].bullet[i].state;
int cnt=shot[n].bullet[i].cnt;
if(30<cnt && cnt<120){//如果是30~120次计数
shot[n].bullet[i].spd-=1.2/90.0;//90次计数总共减去1.2
shot[n].bullet[i].angle+=(PI/2)/90.0*(state?-1:1);//90次计数总共倾斜90°
}
}
}
}
请保证子弹的编号和bullet文件中的子弹的编号是一样的。
(b8.png)
从最左边开始为0号,由于淡蓝色的编号为1,因此指定颜色为1.
在这里我们让state为0或者1。由于诹访子大人的弹幕是从一个地方开始两个两个地发射,因此中途开始我们就要变成两个轨道。
因此,我们试着让指定为0的子弹角度顺时针旋转,而指定为1的子弹角度为逆时针旋转。
shot[n].bullet[i].angle+=(PI/2)/90.0*(state?-1:1);
这就是state的代入。问号用来表示三元表达式。如果不清楚的请谷歌一下。
这样以来,我们就可以分成两种角度了。
计数器 | 移动模式 | 敌人的种类 | 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 | 8 | 1 | 100 | 0 | 1200 | 0 | -1 | -1 | -1 | -1 | -1 |
运行结果