protected override void UpdateWeapon(GameTime gameTime)
        {
            switch (_hookState)
            {
            case (HookState.Idle):
            {
                if (_firing)
                {
                    _hookState    = HookState.Fired;
                    _hookPosition = _owner.Position;
                    _hookAngle    = XnaHelper.RadiansFromVector(_fireDirection);
                    _hookVelocity = _fireDirection * HOOK_SPEED;
                }
                break;
            }

            case (HookState.Fired):
            {
                if (!(_firing) &&
                    Vector2.Distance(_hookPosition, _owner.Position) < MAX_RANGE)
                {
                    _hookPosition += _hookVelocity;
                    _hookHitRect.X = (int)_hookPosition.X;
                    _hookHitRect.Y = (int)_hookPosition.Y;
                }
                else
                {
                    _hookState = HookState.Retracting;
                }

                break;
            }

            case (HookState.Retracting):
            {
                _hookPosition -= HOOK_SPEED * Vector2.Normalize(_hookPosition - _owner.Center);
                if (XnaHelper.PointInRect(_hookPosition, _owner.HitRect))
                {
                    _hookState = HookState.Idle;
                }
                break;
            }

            case (HookState.Attached):
            {
                _hookPosition = _hookedUnit.Center;
                Vector2 pullForce = HOOK_FORCE * XnaHelper.DirectionBetween(_owner.Position, _hookedUnit.Position);
                _owner.ApplyForce(pullForce);
                _hookedUnit.ApplyForce(Vector2.Negate(pullForce));

                if (_firing)
                {
                    _hookState = HookState.Idle;
                }
                break;
            }
            }
        }
Esempio n. 2
0
 /// <summary>
 /// Check if target unit is in range. If so, apply force and damage
 /// </summary>
 /// <param name="effectPos">origin of effect</param>
 /// <param name="target">target unit</param>
 public void TryApply(Vector2 effectPos, PhysicalUnit target, TimeSpan time)
 {
     if (utility.XnaHelper.RectangleIntersectsCircle(target.HitRect, effectPos, _radius))
     {
         tempVec.X = target.Position.X - effectPos.X;
         tempVec.Y = target.Position.Y - effectPos.Y;
         Vector2.Normalize(tempVec);
         float factor = Duration == TimeSpan.Zero ? 1 : (float)time.TotalSeconds / (float)Duration.TotalSeconds;
         target.ApplyForce(_force * factor * tempVec);
         target.ApplyDamage((_damage * factor));
         target.ApplyStatus(_statEffects);
     }
 }