public void FindRotationAdjustmentTest() { Assert.AreEqual(3 * MathHelper.PiOver4, VectorHelpers.FindRotationAdjustment(new Vector2(1, 0), new Vector2(0, 1), MathHelper.ToRadians(0)), 0.01); Assert.AreEqual(1 * MathHelper.PiOver4, VectorHelpers.FindRotationAdjustment(new Vector2(1, 0), new Vector2(0, 1), MathHelper.ToRadians(90)), 0.01); Assert.AreEqual(-1 * MathHelper.PiOver4, VectorHelpers.FindRotationAdjustment(new Vector2(1, 0), new Vector2(0, 1), MathHelper.ToRadians(180)), 0.01); Assert.AreEqual(-3 * MathHelper.PiOver4, VectorHelpers.FindRotationAdjustment(new Vector2(1, 0), new Vector2(0, 1), MathHelper.ToRadians(270)), 0.01); Assert.AreEqual(-1 * MathHelper.PiOver4, VectorHelpers.FindRotationAdjustment(new Vector2(0, 1), new Vector2(1, 0), MathHelper.ToRadians(0)), 0.01); }
public override void Update() { Point target = TargetEntity != null ? TargetEntity.Position : Target; Vector2 targetPositionVector = new Vector2(target.X, target.Y); float rotationDiff = VectorHelpers.FindRotationAdjustment(PositionVector, targetPositionVector, Rotation); float turnFactor = Math.Min(TurnRate / Math.Abs(rotationDiff), 1); float amountToTurn = rotationDiff * turnFactor; Rotation += amountToTurn; float distanceToTarget = Vector2.Distance(targetPositionVector, PositionVector); float distanceToFly = Math.Min(distanceToTarget, MovementSpeed); PositionVector = VectorHelpers.MoveInDirection(PositionVector, Rotation, distanceToFly); if (Vector2.Distance(targetPositionVector, PositionVector) < ExplosionRadius) { Explode(); } }