


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.