32. ボスの弾幕1
このショットはこのようなショットです。最初のショットが32章のショット、2番目のショットが33章のショットです。
説明をしていると難しくなってしまうので、ここでは説明しません。
この章と次の章はわからなくても、全然これからの章に困りません。
こんな感じの弾幕も作れるよという参考程度にムービーを見てください。
弾幕は無限の種類が作れます。
ボスの弾幕は今までの知識から自分で作ってみましょう。
一応、プログラムコードを載せておきますので、どうしても見たい方はご覧ください。
void EnemyShotPattern12(int i){ if(EnemyShot[i].counter==0){ EnemyShot[i].Enx[0]=EnemyShot[i].mem_ex; EnemyShot[i].Eny[0]=EnemyShot[i].mem_ey; for(int j=0;j<6;j++){ EnemyShot[i].EnemyShots[j].x=EnemyShot[i].Enx[0]; EnemyShot[i].EnemyShots[j].y=EnemyShot[i].Eny[0]; EnemyShot[i].EnemyShots[j].flag=1; if(j==0) EnemyShot[i].EnemyShots[j].angle=atan2(EnemyShot[i].mem_py-EnemyShot[i].mem_ey,EnemyShot[i].mem_px-EnemyShot[i].mem_ex); else EnemyShot[i].EnemyShots[j].angle = EnemyShot[i].EnemyShots[0].angle+2.0f*PI*(double)j/6.0f; } PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK); } if(EnemyShot[i].counter==80){ double ang[6]; EnemyShot[i].img=1; for(int s=0;s<6;s++){ ang[s]=EnemyShot[i].EnemyShots[s].disp_angle; EnemyShot[i].Enx[s]=EnemyShot[i].EnemyShots[s].x; EnemyShot[i].Eny[s]=EnemyShot[i].EnemyShots[s].y; } for(int s=0;s<6;s++){ for(int j=7*s;j<7*(s+1);j++){ EnemyShot[i].EnemyShots[j].flag=1; EnemyShot[i].EnemyShots[j].angle=ang[s]+(double)(j%7-3)/6.0f+PI; } } PlaySoundMem(sound_enemy_shot[1],DX_PLAYTYPE_BACK); } if(EnemyShot[i].counter==160){ double ang[6*7]; EnemyShot[i].img=2; for(int s=0;s<6*7;s++){ ang[s]=EnemyShot[i].EnemyShots[s].disp_angle; EnemyShot[i].Enx[s]=EnemyShot[i].EnemyShots[s].x; EnemyShot[i].Eny[s]=EnemyShot[i].EnemyShots[s].y; } for(int s=0;s<6;s++){ for(int j=7*s;j<7*(s+1);j++){ for(int t=9*j;t<9*(j+1);t++){ EnemyShot[i].EnemyShots[t].speed=GetRand(100); EnemyShot[i].EnemyShots[t].flag=1; EnemyShot[i].EnemyShots[t].angle=ang[j]+(double)(t%7-GetRand(7)-10)/6.0f+PI; } } } PlaySoundMem(sound_enemy_shot[1],DX_PLAYTYPE_BACK); } double old_x[400],old_y[400]; if(EnemyShot[i].counter<80){ for(int j=0;j<6;j++){ old_x[j]=EnemyShot[i].EnemyShots[j].x; old_y[j]=EnemyShot[i].EnemyShots[j].y; EnemyShot[i].EnemyShots[j].angle += 2.0f*PI/500.0f; EnemyShot[i].EnemyShots[j].x=EnemyShot[i].Enx[0]+(double)EnemyShot[i].counter*1.5f*cos(EnemyShot[i].EnemyShots[j].angle); EnemyShot[i].EnemyShots[j].y=EnemyShot[i].Eny[0]+(double)EnemyShot[i].counter*1.5f*sin(EnemyShot[i].EnemyShots[j].angle); EnemyShot[i].EnemyShots[j].disp_angle=atan2(EnemyShot[i].EnemyShots[j].y-old_y[j],EnemyShot[i].EnemyShots[j].x-old_x[j]); } } else if(EnemyShot[i].counter<160){ for(int j=0;j<6*7;j++){ old_x[j]=EnemyShot[i].EnemyShots[j].x; old_y[j]=EnemyShot[i].EnemyShots[j].y; EnemyShot[i].EnemyShots[j].x=EnemyShot[i].Enx[j/7]+(double)((1.5f+(double)(j%2)/3.0f)*(EnemyShot[i].counter-80))*cos(EnemyShot[i].EnemyShots[j].angle); EnemyShot[i].EnemyShots[j].y=EnemyShot[i].Eny[j/7]+(double)((1.5f+(double)(j%2)/3.0f)*(EnemyShot[i].counter-80))*sin(EnemyShot[i].EnemyShots[j].angle); EnemyShot[i].EnemyShots[j].disp_angle=atan2(EnemyShot[i].EnemyShots[j].y-old_y[j],EnemyShot[i].EnemyShots[j].x-old_x[j]); } } else { for(int j=0;j<6*7*9;j++){ double s; s=(double)(50+EnemyShot[i].EnemyShots[j].speed)/100.0f; old_x[j]=EnemyShot[i].EnemyShots[j].x; old_y[j]=EnemyShot[i].EnemyShots[j].y; EnemyShot[i].EnemyShots[j].x=EnemyShot[i].Enx[j/9]+(double)((1.0f+(double)(j%3)/20.0f*(EnemyShot[i].counter-160))*s*cos(EnemyShot[i].EnemyShots[j].angle); EnemyShot[i].EnemyShots[j].y=EnemyShot[i].Eny[j/9]+(double)((1.0f+(double)(j%3)/20.0f*(EnemyShot[i].counter-160))*s*sin(EnemyShot[i].EnemyShots[j].angle); EnemyShot[i].EnemyShots[j].disp_angle=atan2(EnemyShot[i].EnemyShots[j].y-old_y[j],EnemyShot[i].EnemyShots[j].x-old_x[j]); } } }
DXライブラリ著作権表示
DX Library Copyright (C) 2001-2006 Takumi
Yamada.