第三十二章 练习“之后就一个人都没有了吗?”风格的弹幕吧!(1)

>>点此回到教程目录

弹幕名:无 (“之后就一个人都没有了吗?”(「そして誰もいなくなるか?」)的样板)

制作难易度:★★★★ (4/10)


运行结果


第六回弹幕制作讲座是以练习为目的的弹幕。

我们来试着做出“之后就一个人都没有了吗?”中那样从四面八方逼过来的子弹。

在前面的章节中我们为了描绘☆而采取了一边运动坐标一边放置子弹的方法,这次我们也和前面一样。

也即是说,我们再来让坐标一边移动一边放置子弹吧。

这一次我们的计算式子就没有☆的这么复杂了,只要我们把方程列出来就能够完成了。

为了今后的扩充,我们使用和之前一样的方法。

接下来,以画面左上角为起始点,首先往画面右上方其角度ange=0的方向移动。

当到达画面右上角的话,使angle+=PI/2,接着往下移动。然后当到达画面右下角的话就angle+=PI/2……

如此进行,一直到绕着画面四个角走了一圈。

为了仅仅修改一个宏定义,就可以漂亮地自动变更所有的子弹的放置间隔,我们也就稍微试着这样子漂亮地写一下吧。

#define DNUMX 15

是画面水平方向放置的子弹的个数。

画面宽度÷放置的个数

这样子计算的话就可以求得子弹的放置间隔。

以这个间隔为基准去除画面的高度,也就可以求得纵向放置的个数,另外,我们用画面的高度除以个数就可以求得竖直方向放置的间隔了。(译者注:我实在没弄懂作者这样处理的意图,大概是为了精度处理吧。)

在下面的声明部分进行了上述过程。

之后只需要往画面中央发射就行了。

现在我们来实现bossatan3这个函数,它用来求得第k号子弹往x,y坐标前进所需的角度。

传入子弹的编号以及想要前进的坐标就可以返回角度。

这次我们制作3个种类的子弹的运动。

由于只要稍微改变一下速度、角度等参数就能够形成各种各样的角度,我们来试着这样子做一下吧。

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

//从四面八方往中央发射
void boss_shot_bulletH006(){
#define TM006 300
//横竖方向放置的子弹的个数
#define DNUMX 15
    int i,j,k,t=boss_shot.cnt%TM006,t2=boss_shot.cnt;
    double xlen=FMX/DNUMX;//要在画面上横向放置DNUM个子弹需要xlen的间隔
    int dnumy=FMY/xlen;/以xlen为间隔的话再竖直方向需要多少个子弹
    int cnum;
    if(dnumy==0){printfDx("boss_shot_bulletH006除以0\n"); return ;}
    double ylen=FMY/dnumy;//需要ylen的放置区间
    double x,y,angle;
    static int num;
    if(t2==0)num=0;
    if(t==0){
        x=0,y=0,angle=0,cnum=0;
    //从画面左上角开始右→下→左→上 四个方向移动
        for(j=0;j<4;j++){
            //dnumy 水平方向DNUMX 竖直方向dnumy
            int to = j%2 ? dnumy: DNUMX ;
            //由于水平、竖直方向放置的个数不一样,进行to次子弹放置
            for(i=0;i<=to;i++){
                if((k=search_boss_shot())!=-1){
                    boss_shot.bullet[k].x     = x;//坐标
                    boss_shot.bullet[k].y     = y;
                    boss_shot.bullet[k].knd   = 4;//子弹的种类
                    boss_shot.bullet[k].flag  = 1;
                    boss_shot.bullet[k].cnt   = 0;
                    switch(num){
                        case 0://发射种类1
                    boss_shot.bullet[k].col   = 0;//子弹的颜色
                    boss_shot.bullet[k].angle = bossatan3(k,FMX/2,FMY/2);//角度
                    boss_shot.bullet[k].spd   = 1.3;//速度
                    boss_shot.bullet[k].state = 0;//状态
                        break;
                        case 1://发射种类2
                    boss_shot.bullet[k].col   = 3;//子弹的颜色
                    boss_shot.bullet[k].angle = bossatan3(k,FMX/2,FMY/2);//角度
                    boss_shot.bullet[k].spd   
                        = 1.4+ ((j%2 ? -1 : 1) * ((cos(PI2/to*i-PI)+1)/2))*0.4;//速度
                    boss_shot.bullet[k].state = 1;//状态
                        break;
                        case 2://发射种类3
                    boss_shot.bullet[k].col   = 6;//子弹的颜色
                    boss_shot.bullet[k].angle = bossatan3(k,FMX/2,FMY/2);//角度
                    boss_shot.bullet[k].spd   = 1.3;//速度
                    boss_shot.bullet[k].state = 2;//状态
                    boss_shot.bullet[k].base_angle[0] 
                        = PI/1000 * (j%2 ? -1 : 1) * ((cos(PI2/to*i-PI)+1)/2);//合计角度
                        break;
                    }
                    se_flag[0]=1;
                    cnum++;
                }
                x+=cos(angle)*xlen;
                y+=sin(angle)*ylen;
            }
            angle+=PI/2;
        }
    }
    for(i=0;i<BOSS_BULLET_MAX;i++){
        if(boss_shot.bullet[i].flag>0){
            int cnt=boss_shot.bullet[i].cnt;
            switch(boss_shot.bullet[i].state){
                case 2://如果是发射种类3
                                        //角度加和
                    boss_shot.bullet[i].angle+=boss_shot.bullet[i].base_angle[0];
                    break;
                default:
                    break;
            }
        }
    }
    if(t==TM006-1)
        num=(++num)%3;
}

也请确认变更了的func.h。

由于还有固定放置的子弹,因此有必要调整一下。

>>点此回到教程目录

results matching ""

    No results matching ""