引き続き、C# + XNA4.0で弾幕シューティングを製作中なのですが、今度は自機狙いの処理で行き詰まりました。
敵の動作において、「ある場所まで移動後、しばらく待ってから自機に向かって突進し、ぶつからなかった場合は画面外へ消える(一般的な自機狙い弾と同様)」という動作をするようにしたいのですが、現在の状態では、画面外へ消えることなく、延々と自機を追いかけ続けてしまいます。
自機と敵のなす角度の計算が、自機が移動している間もずっと行われているのが原因と考え、自機追尾開始直前に、敵と自機の座標を(switch文を使っている都合上、ローカル変数の共有ができないため仕方なく・・・)グローバル変数へ保存して次のcase文に移り、そこでグローバル変数に保存した座標を読み出して、角度の計算および移動処理を行うようにもしてみたのですが、それでも正常な動作にはなりませんでした。
何か良い解決策がありましたら、教えていただけると助かります。
// Y = 200まで下降し、設定された時間(enemy[i].wait)留まってから自機へ突撃
switch (enemy[i].pointFlag) // 軌道切り替えフラグにより制御
{
case 0:
enemy[i].enemyPosY += enemy[i].enemySpeed;
if (enemy[i].enemyPosY >= 200)
{
enemy[i].pointFlag = 1;
enemy[i].timerFlag = true; // 待機タイマーカウントアップ開始
}
break;
case 1:
float X_Dist; // X座標の距離差
float Y_Dist; // Y座標の距離差
enemy[i].enemyPosY += 0; // その場で待つ
if (enemy[i].timer >= enemy[i].wait) // 設定待機時間を超えたら
{
// 距離差 = 目標座標 - 現在座標
X_Dist = (Player.playerPos.X + Player.playerSize / 2) - (enemy[i].enemyPosX + (enemySize / 4));
Y_Dist = (Player.playerPos.Y + Player.playerSize / 2) - (enemy[i].enemyPosY + (enemySize / 4));
enemy[i].enemyDeg = (float)(Math.Atan2(Y_Dist, X_Dist) * (180 / Math.PI)); // 角度計算
enemy[i].enemyPosX += enemy[i].enemySpeed * (float)Math.Cos(MathHelper.ToRadians(enemy[i].enemyDeg));
enemy[i].enemyPosY += enemy[i].enemySpeed * (float)Math.Sin(MathHelper.ToRadians(enemy[i].enemyDeg));
}
break;
}