protected override void HandleInput(GameTime gameTime) { base.HandleInput(gameTime); var mouseX = (int)(MouseState.X * ClientWidth); var mouseY = (int)(MouseState.Y * ClientHeight); _ui.MouseMove(mouseX, mouseY); //_dummy = string.Format("MouseMove X:{0} Y:{1}", mouseX, mouseY); //_dummy = MouseState.X.ToString(); if (MouseState.LeftButton == ButtonState.Pressed) { _ui.MouseDown(mouseX, mouseY); //_dummy = string.Format("MouseDownLeft X:{0} Y:{1}", mouseX, mouseY); } if (MouseState.LeftButton == ButtonState.Released) { _ui.MouseUp(mouseX, mouseY); //_dummy = string.Format("MouseUpLeft X:{0} Y:{1}", mouseX, mouseY); } var playerWantsToMove = false; var targetDirection = Vector2.Zero; if (KeyboardState.IsKeyUp(Keys.NumPad8) || (GamepadState.DPad.Up == ButtonState.Pressed && OldGamepadState.DPad.Up == ButtonState.Released)) { targetDirection += new Vector2(0, -1); playerWantsToMove = true; } if (KeyboardState.IsKeyUp(Keys.NumPad2) || (GamepadState.DPad.Down == ButtonState.Pressed && OldGamepadState.DPad.Down == ButtonState.Released)) { targetDirection += new Vector2(0, 1); playerWantsToMove = true; } if (KeyboardState.IsKeyUp(Keys.NumPad4) || (GamepadState.DPad.Left == ButtonState.Pressed && OldGamepadState.DPad.Left == ButtonState.Released)) { targetDirection += new Vector2(-1, 0); playerWantsToMove = true; } if (KeyboardState.IsKeyUp(Keys.NumPad6) || (GamepadState.DPad.Right == ButtonState.Pressed && OldGamepadState.DPad.Right == ButtonState.Released)) { targetDirection += new Vector2(1, 0); playerWantsToMove = true; } if (KeyboardState.IsKeyUp(Keys.NumPad7)) { targetDirection += new Vector2(-1, -1); playerWantsToMove = true; } if (KeyboardState.IsKeyUp(Keys.NumPad9)) { targetDirection += new Vector2(1, -1); playerWantsToMove = true; } if (KeyboardState.IsKeyUp(Keys.NumPad1)) { targetDirection += new Vector2(-1, 1); playerWantsToMove = true; } if (KeyboardState.IsKeyUp(Keys.NumPad3)) { targetDirection += new Vector2(1, 1); playerWantsToMove = true; } var leftThumb = new Vector2(GamepadState.ThumbSticks.Left.X / 32768f, -GamepadState.ThumbSticks.Left.Y / 32768f); // X[-1..0..1] Y[-1..0..1] Vector2 compassDir = Vector2.Zero; if (leftThumb.Length() >= 0.5f) { targetDirection = leftThumb.ToCompassDirection(); playerWantsToMove = (gameTime.TotalGameTime.TotalMilliseconds > (_previousMilliseconds + 250)); //TODO(philipp): add option for speedruns ;) } if (!playerWantsToMove) { return; } else { _previousMilliseconds = gameTime.TotalGameTime.TotalMilliseconds; } var targetPosition = _world.Player.Position.ToVector2() + targetDirection; if (targetPosition.X >= 0 && targetPosition.Y >= 0 && targetPosition.X < _world.CurrentMap.Width && targetPosition.Y < _world.CurrentMap.Height) { var targetPositionPoint = new Point((int)targetPosition.X, (int)targetPosition.Y); var targetTile = _world.CurrentMap.Tiles.ElementAt(_world.CurrentMap.PointToIndex(targetPositionPoint)); if (!targetTile.IsSolid) { _world.Player.Position = targetPositionPoint; if (targetTile.IsTeleporter) { targetTile.DoStepOn(targetPositionPoint, _world.CurrentMap); } _world.Player.Step(); } } }