23. 連続直線ショット(常に自分の方に向かう)。
このショットはこのようなショットです。
常に自分の方に向かって直線的に飛んできます。
このショットは、途中で移動すると、弾の角度がかわってきます。
前章のショットとは、角度の計算がかわっただけです。他は全ておなじことをしています。
写真を見ると、等間隔で弾があいています。
これは20カウントごとに発射しているのでこのようになっています。
このショットのアルゴリズムは、
カウントが20の倍数になった時、
・ 発射フラグをたてて
・ 敵の座標をショットの初期座標に代入します。
・ atan2関数をもちいて、プレイヤーと敵とのy、x座標からどの方向にいるかラジアンを求めます。EnemyShot[i].Angle[0]に格納します。※1
・ 斜辺 * cosでx座標が、斜辺 * sinでy座標が求まります。斜辺はPATTERN1SPEEDでしたね。この値を座標に増やします。
この事をプログラムで書くとこうなります。
※1:角度は発射する弾ごとに全て異なる値となるため、EnemyShot[i].Angle[j]に格納します。
現在のプレイヤーの座標と、弾の初期値とから角度を計算します。
このアルゴリズムをプログラムでかくとこうなります。
void EnemyShotPattern3(int i){ for(int j=0;j<10;j++){//計10発撃つ if(EnemyShot[i].counter==20*j){//20カウントごとに撃つ EnemyShot[i].EnemyShots[j].flag=1;//発射フラグをたてる EnemyShot[i].EnemyShots[j].x=EnemyShot[i].mem_ex;//初期座標を敵の値に EnemyShot[i].EnemyShots[j].y=EnemyShot[i].mem_ey; //現在のプレイヤーの座標と、弾の初期座標からそれぞれ角度を計算する。 EnemyShot[i].Angle[j] = atan2(Player.y-EnemyShot[i].mem_ey,Player.x-EnemyShot[i].mem_ex); 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.