第三十章 制作弹幕——小小青蛙不畏风雨

>>点此回到教程目录

弾幕名:小小青蛙不畏风雨(ケロちゃん風雨に負けず)

(译者注:这是风神录EX诹访子的SC,Dixq这是多爱诹访子啊……)

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


运行结果


第四回弹幕制作讲座我们将制作弹幕——“小小青蛙不畏风雨”。

首先,如果仔细观察这个弹幕的话,可以发现这个弹幕往上方发射8路子弹。

只要让这8路子弹慢慢下落并加速就行了。

8路子弹的中心以PI/6为振幅左右摇摆。

为了让变化看起来美观,我们使用sin。由于sin能够漂亮地产生0→1→0→-1→0这样子的循环,所以我们来使用它吧。

angle=PI*1.5+PI/6*sin(PI2/tm*t2);

以tm为基准,以递增的计数器t2来进行角度的变化。

由于角度的中心是正上方,所以我们设置为PI*1.5.

振幅为PI/6。只要从把-1到1分别乘以这个值,那么就可以让最终值

PI1.5-PI/6~PI1.5+PI/6

之间变化。

只要以这个为中心射出8路子弹就行了。

这一次,如果使用angle来移动的话会很麻烦,因此我们利用x和y方向的速度来移动。

所以我们不使用spd。

vx是水平方向的速度而vy是竖直方向的速度。

这个计算在函数中进行。

此外,这样一来为了让显示的图像的角度不稳定(译者注:作者在这里的表述有些不清楚,这里我多说一句,其实这里就是让落下的子弹的旋转角度与速度的夹角角度相同,您可以把atan2函数改成一个定值看看效果),为了决定显示的图像的角度,对vx和vy使用atan2来计算角度。

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

void boss_shot_bulletH004(){
#define TM004 200
    int i,j,k,n,t=boss_shot.cnt%TM004,t2=boss_shot.cnt;
    static int tm;
    double angle;
    //周期的最开始设置tm
    if(t==0)
        tm=190+rang(30);
    angle=PI*1.5+PI/6*sin(PI2/tm*t2);
    //每4次计数往8路射出子弹
    if(t2%4==0){
        for(n=0;n<8;n++){
            if((k=search_boss_shot())!=-1){
                boss_shot.bullet[k].flag=1;
                boss_shot.bullet[k].state=0;
                boss_shot.bullet[k].cnt=0;
                boss_shot.bullet[k].knd=4;
                boss_shot.bullet[k].col=0;
                boss_shot.bullet[k].angle=0;
                boss_shot.bullet[k].eff_detail=1;
                boss_shot.bullet[k].x=boss.x;
                boss_shot.bullet[k].y=boss.y;
                boss_shot.bullet[k].vx = cos(angle-PI/8*4+PI/8*n+PI/16)*3;
                boss_shot.bullet[k].vy = sin(angle-PI/8*4+PI/8*n+PI/16)*3;
            }
        }
        se_flag[0]=1;
    }
    if(t%1==0 && t2>80){
        int num=1;
        if(t%2)
            num=2;
        for(n=0;n<num;n++){
            if((k=search_boss_shot())!=-1){
                angle=PI*1.5-PI/2+PI/12*(t2%13)+rang(PI/15);
                boss_shot.bullet[k].flag=1;
                boss_shot.bullet[k].state=1;
                boss_shot.bullet[k].cnt=0;
                boss_shot.bullet[k].knd=8;
                boss_shot.bullet[k].eff_detail=0;
                boss_shot.bullet[k].col=4;
                boss_shot.bullet[k].angle=0;
                boss_shot.bullet[k].x=boss.x;
                boss_shot.bullet[k].y=boss.y;
                boss_shot.bullet[k].vx = cos(angle)*1.4*1.2;
                boss_shot.bullet[k].vy = sin(angle)*1.4;
            }
        }
        se_flag[7]=1;
    }
    for(i=0;i<BOSS_BULLET_MAX;i++){
        if(boss_shot.bullet[i].flag>0){
            if(boss_shot.bullet[i].state==0){
                if(boss_shot.bullet[i].cnt<150)
                    boss_shot.bullet[i].vy+=0.03;
                boss_shot.bullet[i].x+=boss_shot.bullet[i].vx;
                boss_shot.bullet[i].y+=boss_shot.bullet[i].vy;
            }
            if(boss_shot.bullet[i].state==1){
                if(boss_shot.bullet[i].cnt<160)
                    boss_shot.bullet[i].vy+=0.03;
                boss_shot.bullet[i].x+=boss_shot.bullet[i].vx;
                boss_shot.bullet[i].y+=boss_shot.bullet[i].vy;
                boss_shot.bullet[i].angle=atan2(boss_shot.bullet[i].vy,boss_shot.bullet[i].vx);
            }
        }
    }
}

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

>>点此回到教程目录

results matching ""

    No results matching ""