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.