private void shootAtPlayer(Player player, Bullet[] enemyBullet, int difficulty)
{
rotation = turnToFaceO(toRotationVector2(position), toRotationVector2(player.position), rotation, 0.025f);
elevation = turnToFaceE(toElevationVector2(position), toElevationVector2(player.position), elevation, 0.025f);
if (!(rotation == playerOrientation && elevation == playerElevation))
{
rotation = turnToFaceO(toRotationVector2(position), toRotationVector2(player.position), rotation, 0.025f);
elevation = turnToFaceE(toElevationVector2(position), toElevationVector2(player.position), elevation, 0.025f);
}
else
{
for (int i = 0; i < GameConstants.enemyClip; i++)
if (!enemyBullet
.isActive)
{
Matrix orientationMatrix = Matrix.CreateRotationY(rotation);
Matrix elevationMatrix = Matrix.CreateRotationX(elevation);
Matrix trans = Matrix.CreateTranslation(player.position) * elevationMatrix * orientationMatrix;
enemyBullet
.direction = trans.Translation;
enemyBullet
.position = position + (trans.Right * 2f) + (trans.Forward * 2f);
enemyBullet
.isActive = true;
break;
}
for (int i = 0; i < GameConstants.enemyClip; i++)
if (!enemyBullet
.isActive)
{
Matrix orientationMatrix = Matrix.CreateRotationY(rotation);
Matrix elevationMatrix = Matrix.CreateRotationX(elevation);
Matrix trans = Matrix.CreateTranslation(position) * elevationMatrix * orientationMatrix;
enemyBullet
.direction = trans.Translation;
enemyBullet
.position = position + (trans.Left * 2f) + (trans.Forward * 2f);
enemyBullet
.isActive = true;
break;
}
//soundBank.PlayCue("EnemyShoot");
}
}
private Vector2 toRotationVector2(Vector3 v) { return new Vector2(v.X, v.Z); }
private Vector2 toElevationVector2(Vector3 v) { return new Vector2((float)Math.Sqrt(Math.Pow(v.X, 2) + Math.Pow(v.Z, 2)), v.Y); }
private float turnToFaceO(Vector2 position, Vector2 faceThis, float currentAngle, float turnSpeed)
{
float x = faceThis.X - position.X;
float y = faceThis.Y - position.Y;
playerOrientation = (float)Math.Atan2(y, x);
float difference = wrapAngle(playerOrientation - currentAngle);
difference = MathHelper.Clamp(difference, -turnSpeed, turnSpeed);
return wrapAngle(currentAngle + difference);
}
private float turnToFaceE(Vector2 position, Vector2 faceThis, float currentAngle, float turnSpeed)
{
float x = faceThis.X - position.X;
float y = faceThis.Y - position.Y;
playerElevation = (float)Math.Atan2(y, x);
float difference = wrapAngle(playerElevation - currentAngle);
difference = MathHelper.Clamp(difference, -turnSpeed, turnSpeed);
return wrapAngle(currentAngle + difference);
}
private float wrapAngle(float radians)
{
while (radians < -MathHelper.Pi)
radians += MathHelper.TwoPi;
while (radians > MathHelper.Pi)
radians -= MathHelper.TwoPi;
return radians;
}