第二十九章 制作弹幕——“恋之迷路”

>>点此回到教程目录

弹幕名:恋之迷路(恋の迷路)

制作难易度:★★★★ (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。

>>点此回到教程目录

results matching ""

    No results matching ""