Example #1
0
        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();
                }
            }
        }