31. 進行方向に画像が向くショット
このショットはこのようなショットです。
これは、円運動、くるくるまわりながら広がっている様子です。
今までは、方向性のない弾だったので、現在弾がどちらの方向をむいているか気にする必要がありませんでしたが
写真のように方向を持った弾の場合、計算する必要があります。
これと似た動きをするモーションのムービーが次の章にあるので参考にしてください。
これはカウンターが0のとき、つまり最初に処理が行われたときだけ、弾を発射します。
カウンターが0の時、
5個弾を発射します。
まず、フラグを上げ
1個目の弾のとき(if(j==0))発射角度を敵とプレイヤーの角度にします。
他の弾の場合、これを基準に5方向に向けます。
発射された弾が、現在どちらの方向に向いているかを判定するには、
前回の座標と今回の座標から角度を求めたらいいですね。
この5つの方向の過去の座標を格納するためにold_x[5],old_y[5]という変数を設けます。
今回は別に配列じゃなくてもいい気がしますが、これからの拡張性をもたせるために、一応配列で宣言しておきます。
最後のループ内を見てください。
まず、各old変数に現在の座標を代入します。
EnemyShot[i].EnemyShots[j].angleつまり計算する角度の変数に2.0f*PI/500.0fをたします。
これは360度 / 500分角度を増やします。くるくるまわってみせるためです。
ここで、計算された角度を次で使用します。
EnemyShot[i].counter*cos(EnemyShot[i].EnemyShots[j].angle)
これは現在のカウンター値を斜辺として、cosつまりx方向の移動距離を計算しています。
cosに使われているラジアンが先ほど計算した角度です。
これで計算された値を、敵の座標にたす事で、座標を計算しています。
void EnemyShotPattern11(int i){ if(EnemyShot[i].counter==0){ for(int j=0;j<5;j++){ EnemyShot[i].EnemyShots[j].flag=1; if(j==0) EnemyShot[i].EnemyShots[j].angle= atan2(EnemyShot[i].mem_py-EnemyShot[i].mem_ey,EnemyShot[i].mem_px-EnemyShot[i].mem_ex); else EnemyShot[i].EnemyShots[j].angle = EnemyShot[i].EnemyShots[0].angle+2.0f*PI*(double)j/5.0f; } PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK); } double old_x[5],old_y[5]; for(int j=0;j<5;j++){ old_x[j]=EnemyShot[i].EnemyShots[j].x; old_y[j]=EnemyShot[i].EnemyShots[j].y; EnemyShot[i].EnemyShots[j].angle += 2.0f*PI/500.0f; EnemyShot[i].EnemyShots[j].x=EnemyShot[i].mem_ex+(double)EnemyShot[i].counter*cos(EnemyShot[i].EnemyShots[j].angle); EnemyShot[i].EnemyShots[j].y=EnemyShot[i].mem_ey+(double)EnemyShot[i].counter*sin(EnemyShot[i].EnemyShots[j].angle); EnemyShot[i].EnemyShots[j].disp_angle=atan2(EnemyShot[i].EnemyShots[j].y-old_y[j],EnemyShot[i].EnemyShots[j].x-old_x[j]); } }
DXライブラリ著作権表示
DX Library Copyright (C) 2001-2006 Takumi
Yamada.