public override void CheckAndApplyCollision(PhysicalUnit unit, TimeSpan time)
        {
            if (!_firing || !unit.Collides)
            {
                return;     //don't check collisions if not firing
            }
            float fireAngle = XnaHelper.RadiansFromVector(_fireDirection);

            if (XnaHelper.RectangleIntersectsArc(unit.HitRect, _owner.Center, _range, fireAngle, _hitArc))
            {
                _tempVector = unit.Center - _owner.Center;
                _tempVector.Normalize();
                unit.ApplyImpact(_force * _tempVector, 1);
                unit.ApplyDamage(_damage);
            }
        }
Exemplo n.º 2
0
        public void CheckAndApplyCollision(PhysicalUnit u, TimeSpan time)
        {
            if (!u.Collides)
            {
                return;
            }

            switch (_state)
            {
            case State.Dormant:
                break;

            case State.Moving:
                if (u.HitRect.Intersects(_hitRect))
                {
                    if (_penetration != -1)
                    {
                        _penetration -= 1;
                        if (_penetration <= 0)
                        {
                            _state = State.JustHit;
                        }
                    }
                    u.ApplyImpact(_velocity, _mass);
                }
                _proximityEffect.TryApply(_position, u, time);
                break;

            case State.JustHit:
                break;

            case State.ApplyContactEffect:
                _contactEffect.TryApply(_position, u, time);
                break;

            case State.ReachedDestination:
                _destinationEffect.TryApply(_position, u, time);
                break;

            default:
                break;
            }
        }