>>点此回到教程目录
弹幕名:恋之迷路(恋の迷路)
制作难易度:★★★★ (4/10)
运行结果
第三回弹幕制作讲座我们将制作弹幕——“恋之迷路”。
恋之迷路稍微有点麻烦。
让子弹一边旋转一边发射,并且在特定的部分不发射的处理相当重要。
旋转的方向由计数器决定。
使用计数器进行旋转方向的计数,当计数器到达1周次数-2或者1周次数-1的话那就不发射。
如果1周的计数器已经达到1周次数 -1的话,则接下来将会有1次计数错开而不发射。那么我们来试着实现吧。
(译者注:我这里重新解释一遍作者的意思。通过阅读源码可以发现,作者设置了三个静态变量cnt、tcnt和cnum,这3个变量在每次Boss开始发放弹幕的时候分别设置为0、2和0。其中作者设置了所谓的“1周”的计数为DF003——它的值为20,有兴趣的话您也可以把这个数字换成其它数字试试。
tcnt的大小用于固定“1周”的数值,它的设置条件为tcnt-1 == cnt的时候。
现在我们来考虑第1次弹幕发射的时候,这时tcnt-1 = 1并不等于cnt,所以tcnt没有被置数,这个时候Boss发射第一次弹幕,然后cnt++。然后,第2次进入弹幕发射的时候由于tcnt-1 = 1 = cnt了,那么tcnt被置数为tcnt += DF003-2,事实上这里就确定了允许发射的1周的最终一次为cnt变为cnt-2的时候,此时cnt-2=tcnt。可以认为是cnt从1变为18这个区间内都要发射弹幕,而当cnt=19或者20的时候就不发射了——这里也就产生了视频中的“空缺部分”,而当cnt=19的时候tcnt+=DF003-2又被执行,这样一来,相当于计数器被重置……如此循环也就形成了“有空缺”的弹幕。如果您还看不懂的话我也没辙了。)
—-在 boss_shotH.cpp 中进行以下追加 —-
void boss_shot_bulletH003(){ #define TM003 600 #define DF003 20 int i,j,k,t=boss_shot.cnt%TM003,t2=boss_shot.cnt; static int tcnt,cnt,cnum; double angle; if(t2==0){ //在40<x<FMX-40 50<y<150的范围内80次计数中移动到100单位外的位置 input_phy_pos(FMX/2,FMY/2, 50); cnum=0; } if(t==0){ boss_shot.base_angle[0]=bossatan2(); cnt=0; tcnt=2; } if(t<540 && t%3){ angle=bossatan2(); if(tcnt-2==cnt || tcnt-1==cnt){ if(tcnt-1==cnt){ boss_shot.base_angle[1]=boss_shot.base_angle[0]+PI2/DF003*cnt*(cnum?-1:1)-PI2/(DF003*6)*3; tcnt+=DF003-2; } } else{ for(i=0;i<6;i++){ if((k=search_boss_shot())!=-1){ boss_shot.bullet[k].col = cnum?1:4; boss_shot.bullet[k].x = boss.x; boss_shot.bullet[k].y = boss.y; boss_shot.bullet[k].knd = 8; boss_shot.bullet[k].angle = boss_shot.base_angle[0]+PI2/DF003*cnt*(cnum?-1:1)+PI2/(DF003*6)*i*(cnum?-1:1); boss_shot.bullet[k].flag = 1; boss_shot.bullet[k].cnt = 0; boss_shot.bullet[k].spd = 2; se_flag[0]=1; } } } cnt++; } if(40<t&&t<540 && t%30==0){ for(j=0;j<3;j++){ angle=boss_shot.base_angle[1]-PI2/36*4; for(i=0;i<27;i++){ if((k=search_boss_shot())!=-1){ boss_shot.bullet[k].col = cnum?6:0; boss_shot.bullet[k].x = boss.x; boss_shot.bullet[k].y = boss.y; boss_shot.bullet[k].knd = 7; boss_shot.bullet[k].angle = angle; boss_shot.bullet[k].flag = 1; boss_shot.bullet[k].cnt = 0; boss_shot.bullet[k].spd = 4-1.6/3*j; se_flag[0]=1; } angle-=PI2/36; } } } // for(i=0;i<BOSS_BULLET_MAX;i++){ // if(boss_shot.bullet[i].flag>0){ // // } // } if(t==TM003-1) cnum++; }
也请确认变更了的func.h。