/// <summary>Sets the target of the tower.</summary> /// <param name="target">The Target.</param> private void SetTarget(BGameObject target) { mTarget = target; if (mTarget == null) { return; } var targetPosition = new Vector2(target.Position.X + target.Width / 2.0f / 32 + target.TextureOffset.X, target.Position.Y + target.Height / 2.0f / 32 + target.TextureOffset.Y); var centerPosition = new Vector2(Position.X + Width / 2.0f / 32, Position.Y); var targetDistance = Vector2.Distance(centerPosition, targetPosition); mTargetPosition = targetPosition; mTargetToFar = targetDistance > Radius; }
public void SetTargets(IEnumerable <BGameObject> objects, bool force = false) { if (force) { mForceTargets = true; mForcedTargets = (List <BGameObject>)objects; if (mForcedTargets.Count == 0) { mForceTargets = false; } } IEnumerable <BGameObject> enemies; var anyForcedInRange = false; foreach (var obj in mForcedTargets) { if (Vector2.Distance(new Vector2(obj.Position.X + obj.Width / 2.0f / 32 + obj.TextureOffset.X, obj.Position.Y + obj.Height / 2.0f / 32 + obj.TextureOffset.Y), new Vector2(Position.X + Width / 2.0f / 32, Position.Y)) <= Radius) { anyForcedInRange = true; break; } } if (mForceTargets && anyForcedInRange) { enemies = mForcedTargets; } else { enemies = objects; } switch (Mode) { case FireMode.Closest: BGameObject closestObject = null; var closestDistance = float.PositiveInfinity; foreach (var obj in enemies) { var position = new Vector2(obj.Position.X + obj.Width / 2.0f / 32 + obj.TextureOffset.X, obj.Position.Y + obj.Height / 2.0f / 32 + obj.TextureOffset.Y); var centerPosition = new Vector2(Position.X + Width / 2.0f / 32, Position.Y); var distance = Vector2.Distance(centerPosition, position); if (distance < closestDistance && obj.Health > 0) { closestObject = obj; closestDistance = distance; } } SetTarget(closestObject); break; case FireMode.Weakest: BGameObject weakestObject = null; var weakestHealth = float.PositiveInfinity; foreach (var obj in enemies) { if (obj.Health < weakestHealth && obj.Health > 0) { weakestObject = obj; weakestHealth = obj.Health; } } SetTarget(weakestObject); break; case FireMode.Strongest: BGameObject strongestObject = null; var strongestHealth = float.NegativeInfinity; foreach (var obj in enemies) { if (obj.Health > strongestHealth && obj.Health > 0) { strongestObject = obj; strongestHealth = obj.Health; } } SetTarget(strongestObject); break; } }