第三十一章 制作弹幕——早苗风格☆状弹幕

>>点此回到教程目录

弹幕名:无 (早苗风格☆状弹幕的样板)

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


运行结果


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

我们来模仿早苗风格那样绘制☆形状的漂亮曲线吧。

首先我们学习一下☆这个形状有什么性质吧。(译者注:前方数学高能,平面几何不好的速速退散)

α+β=γ(译者注:三角形的一个外角等于其不相邻的两个内角和)这个定理我们在中学的时候就已经学过了呢。

同样地,a+b=c。

这样考虑的话,把α、β、a……五个角加起来就是180°了呢。(转载者注:五角星内角和,假设右上内角为x,α+β+a+b+x= γ + c +x =三角形内角和=180°)

既然这样,我们也就知道α的角度是π/5了。

下图中以描绘“始点”的位置开始为最初的点,向stt0速度的方向引一条线。

星星的中心是Boos的坐标。从那里开始到始点位置的距离以红色的线标识。

sst在0的时候一直前进直到与圆相交。我们可以这样判断:如果从中心点开始到当前位置的距离超过半径r的话那就相交了。如果判定相交的话,就把sst设置为1然后把角度变成-(PI-PI/5)然后继续前进。

然后沿着sst1的速度方向前进,并且同样地一直到与圆相交为止。

一直到4为止都前进,到5的话就停止。

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

//☆弾
void boss_shot_bulletH005(){
#define TM005 820
#define RANGE005 100.0
#define LEM005 4
    int i,j,k,n,t=boss_shot.cnt%TM005,t2=boss_shot.cnt;
    static int sst,bnum;
    static double sx,sy,sangle;
        //1个周期的最开始的话
    if(t==0){
        sst=0;
        sx=boss.x;
        sy=boss.y-RANGE005;
        sangle=PI/5/2+PI/2;
        bnum=0;
    }
        //绘制星星
    if(sst<=4){
        for(i=0;i<2;i++){
            sx+=cos(sangle)*LEM005;//计算坐标
            sy+=sin(sangle)*LEM005;
                        //如果与圆相交的话
            if((sx-boss.x)*(sx-boss.x)+(sy-boss.y)*(sy-boss.y)>RANGE005*RANGE005){
                sangle-=(PI-PI/5);//变换方向
                sst++;//状态变换
                if(sst==5)break;//如果到5的话停止
            }
            for(j=0;j<5;j++){//绘制5个星星
                if((k=search_boss_shot())!=-1){
                    boss_shot.bullet[k].flag=1;
                    boss_shot.bullet[k].state=j;
                    boss_shot.bullet[k].cnt=0;
                    boss_shot.bullet[k].spd=0;
                    boss_shot.bullet[k].knd=10;
                    boss_shot.bullet[k].col=j;
                    boss_shot.bullet[k].angle=-PI/2+PI2/5*j;
                    boss_shot.bullet[k].x=sx;
                    boss_shot.bullet[k].y=sy;
                    boss_shot.bullet[k].vx = cos(sangle)*1.4*1.2;
                    boss_shot.bullet[k].vy = sin(sangle)*1.4;
                    boss_shot.bullet[k].base_angle[0]=sangle-PI+PI/20*bnum;
                }
            }
            bnum++;
        }
        se_flag[0]=1;
    }
   for(i=0;i<BOSS_BULLET_MAX;i++){
        if(boss_shot.bullet[i].flag>0){
            int cnt=boss_shot.bullet[i].cnt;
                        //如果状态不满10
            if(boss_shot.bullet[i].state<10){
                if(t==150){//如果是150的话把星星往五个方向发射
                    boss_shot.bullet[i].spd=4;//速度
                    boss_shot.bullet[i].cnt=0;//设置计数器
                    boss_shot.bullet[i].state+=10;//状态编号变更
                }
            }
            else if(boss_shot.bullet[i].state<20){//10~19なら
                if(cnt<=80){//减速
                    boss_shot.bullet[i].spd-=0.05;
                }
                if(cnt==100){//从设置好的基准角度出发绘制漂亮的曲线
                    boss_shot.bullet[i].angle=boss_shot.bullet[i].base_angle[0];
                }
                if(cnt>=100 && cnt<160){//加速
                    boss_shot.bullet[i].spd+=0.015;
                }
            }
        }
    }
}

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

不过有一个可怕的问题,那就是全部的弹都是在固定的地方安置的,如果在意这个问题的话,可以适当地用随机数调整一下角度。

>>点此回到教程目录

results matching ""

    No results matching ""