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; } } }
/// <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; } }
/// <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); }
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); }
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); }