>>点此回到教程目录
弹幕名:无 (“之后就一个人都没有了吗?”(「そして誰もいなくなるか?」)的样板)
制作难易度:★★★★ (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。
由于还有固定放置的子弹,因此有必要调整一下。