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

今日 昨日


28. 全方向ショット(常にプレイヤーの方向へ)。


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



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

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

角度は毎回プレイヤーのいるほうに計算されます。

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

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

毎回よばれるごとに、

 ・ 発射フラグをたてて

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

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

 ・ 毎回計算したプレイヤーとの角度を元に2πを20個に分割して、順番に角度を格納していきます。

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

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

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

void EnemyShotPattern8(int i){
        static int lv = 0;
        for(int s=0;s<10;s++){
                if(EnemyShot[i].counter==10*s){
                        lv=s+1;
                        for(int j=20*s;j<20*(s+1);j++){
                                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==20*s)
                                        EnemyShot[i].Angle[20*s] = atan2(Player.y-EnemyShot[i].mem_ey,Player.x-EnemyShot[i].mem_ex);
                                else//そのつど計算した最初のラジアンをもとに、20方向
                                        EnemyShot[i].Angle[j] = EnemyShot[i].Angle[20*s] + 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++){
                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.