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

今日 昨日


27. 全方向ショット。


このショットはこのようなショットです。



プレイヤーがいる場所を基準に、等角度ずつ、全方向発射します。

2πを20個に分割してそのレール上を発射させています。

これは10カウントごとに発射しています。

このショットのアルゴリズムは、

毎回よばれるごとに、

 ・ 発射フラグをたてて

 ・ 敵の座標をショットの初期座標に代入します。

 ・ atan2関数をもちいて、プレイヤーと敵とのy、x座標からどの方向にいるかラジアンを求めます。

 ・ 2πを20個に分割して、順番に角度を格納していきます。。

 ・ 斜辺 * cosでx座標が、斜辺 * sinでy座標が求まります。斜辺はPATTERN1SPEEDでしたね。この値を座標に増やします。

 ・ いつものようにスピードを三角関数で求めます。

この事をプログラムで書くとこうなります。


このアルゴリズムをプログラムでかくとこうなります。以前と同じ部分は注釈を書きません。

void EnemyShotPattern7(int i){
        static int lv = 0;//静的変数。
        for(int s=0;s<10;s++){//全10組発射する
                if(EnemyShot[i].counter==10*s){//10カウントに1回
                        lv=s+1;//レベルを上げる
                        for(int j=20*s;j<20*(s+1);j++){//jは各弾の配列要素番号
//1回目に処理がきたときは0〜19の配列要素、2回目に処理がきたときは20〜39の配列要素を使う
                                EnemyShot[i].EnemyShots[j].x=EnemyShot[i].mem_ex;
                                EnemyShot[i].EnemyShots[j].y=EnemyShot[i].mem_ey;
                                EnemyShot[i].EnemyShots[j].flag=1;
                                if(j==0)//最初の1つはプレイヤーの方向を計算
                                        EnemyShot[i].Angle[0] = atan2(EnemyShot[i].mem_py-EnemyShot[i].mem_ey,EnemyShot[i].mem_px-EnemyShot[i].mem_ex);
                                else//それを元に全方向を20に分割して、順々に格納。
                                        EnemyShot[i].Angle[j] = EnemyShot[i].Angle[0] + 2.0f*PI * (double)j / 20.0f;
                        }
                        StopSoundMem(sound_enemy_shot[0]);
                        PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);
                }       
        }
        for(int j=0;j<200;j++){//全200個のうち
                if(EnemyShot[i].EnemyShots[j].flag==1){//発射されているものなら
                        EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].Angle[j])*2.0f;
                        EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].Angle[j])*2.0f;
                }
        }
}

戻る                                  次へ
メニューへ戻る


トップページへ

DXライブラリ著作権表示
DX Library Copyright (C) 2001-2006 Takumi Yamada.