>>点此回到教程目录
弾幕名:小小青蛙不畏风雨(ケロちゃん風雨に負けず)
(译者注:这是风神录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。