シューティングゲームの館

今日 昨日


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.