Пример #1
0
        /// <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;
        }
Пример #2
0
        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;
            }
        }