private void handleInput(InputManager input)
        {
            if (input.Exit)
            {
                this.PopState = true;
            }

            if (_blackHole.State == BlackHole.BlackHoleState.Exhausted)
            {
                return;
            }

            _player.MoveDirection = input.MoveDirection;
            _player.LookDirection = XnaHelper.DirectionBetween(_player.Center, input.MouseLocation);

            if (input.FirePrimary && _player.UnitLifeState == PhysicalUnit.LifeState.Living)
            {
                _primaryWeapon.Trigger(_player.Position, input.MouseLocation);
            }
            if (input.FireSecondary && _player.UnitLifeState == PhysicalUnit.LifeState.Living)
            {
                _secondaryWeapon.Trigger(_player.Position, input.MouseLocation);
            }

            if (input.TriggerGadget1)
            {
                _primaryGadget.Trigger();
            }

            if (input.DebugKey)
            {
                _blackHole.Explode();
            }
        }
        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;
            }
            }
        }
示例#3
0
        /// <summary>
        /// Attempt to fire a weapon.
        /// Only fires if enough time has passed since the last fire and enough ammo is available
        /// </summary>
        /// <param name="firePosition"></param>
        /// <param name="targetPosition"></param>
        public void Trigger(Vector2 firePosition, Vector2 targetPosition)
        {
            if (_currentAmmo >= _ammoConsumption && _tillNextFire.TotalSeconds <= 0)
            {
                _firing            = true;
                _fireDirection     = XnaHelper.DirectionBetween(firePosition, targetPosition);
                _targetDestination = targetPosition;

                _currentAmmo -= _ammoConsumption;
                _tillNextFire = _fireDelay;
            }
        }
示例#4
0
文件: Weapon.cs 项目: rcorre/MSH-win8
        /// <summary>
        /// Attempt to fire a weapon. Return true if successfull
        /// Only fires if enough time has passed since the last fire
        /// </summary>
        /// <param name="firePosition"></param>
        /// <param name="targetPosition"></param>
        public bool Trigger(Vector2 firePosition, Vector2 targetPosition)
        {
            if (_tillNextFire.TotalSeconds <= 0)
            {
                _firing            = true;
                _fireDirection     = XnaHelper.DirectionBetween(firePosition, targetPosition);
                _targetDestination = targetPosition;

                _tillNextFire = _fireDelay;
                return(true);
            }
            return(false);
        }
示例#5
0
        public void Update(GameTime gameTime, Rectangle levelBounds, Vector2 blackHolePosition)
        {
            if (_lifeState == LifeState.Dormant)
            {
                _startTime -= gameTime.ElapsedGameTime;
                if (_startTime <= TimeSpan.Zero)
                {
                    _lifeState  = LifeState.Living;
                    CanInteract = true;
                    setWaypoint(blackHolePosition, levelBounds.Width, levelBounds.Height);
                    setPosition(blackHolePosition, levelBounds.Width, levelBounds.Height);
                }
            }
            else if (_lifeState == LifeState.Living)
            {
                _duration -= gameTime.ElapsedGameTime;
                if (_duration < TimeSpan.Zero)
                {
                    _lifeState  = LifeState.Ghost;
                    CanInteract = false;
                }
                if (Vector2.Distance(_nextWaypoint, Position) < MIN_WAYPOINT_DISTANCE)
                {
                    setWaypoint(blackHolePosition, levelBounds.Width, levelBounds.Height);
                }

                MoveDirection = XnaHelper.DirectionBetween(Position, _nextWaypoint);
            }
            else if (_lifeState == LifeState.Ghost)
            {
                MoveDirection       = XnaHelper.DirectionBetween(Position, _nextWaypoint);
                _leaveTimer        -= gameTime.ElapsedGameTime;
                _sprite.ScaleFactor = MathHelper.Lerp(0.0f, 1.0f, (float)_leaveTimer.TotalSeconds / LEAVE_LEVEL_TIME);
                _sprite.Shade       = Color.Lerp(Color.Transparent, Color.White, (float)_leaveTimer.TotalSeconds / LEAVE_LEVEL_TIME);
                if (_leaveTimer < TimeSpan.Zero)
                {
                    _lifeState = LifeState.Destroyed;
                }
            }


            if (Vector2.Distance(_nextWaypoint, Position) < MIN_WAYPOINT_DISTANCE)
            {
                setWaypoint(blackHolePosition, levelBounds.Width, levelBounds.Height);
            }

            base.Update(gameTime, levelBounds);
        }
示例#6
0
文件: Enemy.cs 项目: rcorre/MSH-win8
        public virtual void Update(GameTime gameTime, Vector2 playerPosition, Vector2 blackHolePosition, Rectangle levelBounds)
        {
            Vector2 directionToPlayer = XnaHelper.DirectionBetween(Position, playerPosition);

            MoveDirection = directionToPlayer;
            LookDirection = directionToPlayer;
            if (_meleeWeapon != null)
            {
                _meleeWeapon.Update(gameTime);

                if ((playerPosition - Position).Length() <= _meleeWeapon.Range && _lifeState == LifeState.Living)
                {
                    _meleeWeapon.Trigger(Center, playerPosition);
                }
            }
            base.Update(gameTime, levelBounds);
        }