


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.