27. 全方向ショット。
このショットはこのようなショットです。
プレイヤーがいる場所を基準に、等角度ずつ、全方向発射します。
2πを20個に分割してそのレール上を発射させています。
これは10カウントごとに発射しています。
このショットのアルゴリズムは、
毎回よばれるごとに、
・ 発射フラグをたてて
・ 敵の座標をショットの初期座標に代入します。
・ atan2関数をもちいて、プレイヤーと敵とのy、x座標からどの方向にいるかラジアンを求めます。
・ 2πを20個に分割して、順番に角度を格納していきます。。
・ 斜辺 * cosでx座標が、斜辺 * sinでy座標が求まります。斜辺はPATTERN1SPEEDでしたね。この値を座標に増やします。
・ いつものようにスピードを三角関数で求めます。
この事をプログラムで書くとこうなります。
このアルゴリズムをプログラムでかくとこうなります。以前と同じ部分は注釈を書きません。
void EnemyShotPattern7(int i){ static int lv = 0;//静的変数。 for(int s=0;s<10;s++){//全10組発射する if(EnemyShot[i].counter==10*s){//10カウントに1回 lv=s+1;//レベルを上げる for(int j=20*s;j<20*(s+1);j++){//jは各弾の配列要素番号 //1回目に処理がきたときは0〜19の配列要素、2回目に処理がきたときは20〜39の配列要素を使う 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==0)//最初の1つはプレイヤーの方向を計算 EnemyShot[i].Angle[0] = atan2(EnemyShot[i].mem_py-EnemyShot[i].mem_ey,EnemyShot[i].mem_px-EnemyShot[i].mem_ex); else//それを元に全方向を20に分割して、順々に格納。 EnemyShot[i].Angle[j] = EnemyShot[i].Angle[0] + 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++){//全200個のうち 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.