26. 螺旋ショット。
このショットはこのようなショットです。
弾は一度に最高200発まで出せますが、今回はその最大数を使用します。
これは毎カウントごとに発射しています。
このショットのアルゴリズムは、
毎回よばれるごとに、
・ 発射フラグをたてて
・ 敵の座標をショットの初期座標に代入します。
・ atan2関数をもちいて、プレイヤーと敵とのy、x座標からどの方向にいるかラジアンを求めます。
・ 前のラジアンより2.0ラジアン増やします。
・ 斜辺 * cosでx座標が、斜辺 * sinでy座標が求まります。斜辺はPATTERN1SPEEDでしたね。この値を座標に増やします。
・ いつものようにスピードを三角関数で求めます。
毎回2.0ラジアンほど増やしていくことで、徐々に弾が回転して発射されているように見えます。
この事をプログラムで書くとこうなります。
このアルゴリズムをプログラムでかくとこうなります。以前と同じ部分は注釈を書きません。
void EnemyShotPattern6(int i){ for(int j=0;j<200;j++){ if(EnemyShot[i].counter==j){ EnemyShot[i].EnemyShots[j].flag=1; EnemyShot[i].EnemyShots[j].x=EnemyShot[i].mem_ex; EnemyShot[i].EnemyShots[j].y=EnemyShot[i].mem_ey; if(j==0)//最初だけ、プレイヤーの方向に角度をきめます。 EnemyShot[i].Angle[j] = atan2(EnemyShot[i].mem_py-EnemyShot[i].mem_ey,EnemyShot[i].mem_px-EnemyShot[i].mem_ex); else //それいこうは2.0ラジアンずつ増やしていきます。 EnemyShot[i].Angle[j] = EnemyShot[i].Angle[j-1]+0.2f; StopSoundMem(sound_enemy_shot[0]); PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK); } EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].Angle[j]); EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].Angle[j]); } }
DXライブラリ著作権表示
DX Library Copyright (C) 2001-2006 Takumi
Yamada.