>>点此回到教程目录
弹幕名:无 (早苗风格☆状弹幕的样板)
制作难易度:★★★★ (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。
不过有一个可怕的问题,那就是全部的弹都是在固定的地方安置的,如果在意这个问题的话,可以适当地用随机数调整一下角度。