using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; namespace ProjectZ.Base { #region InputCharacter internal class InputCharacter { private readonly string _upper; private readonly string _lower; private readonly string _alt; private readonly Keys _code; public InputCharacter(string upper, string lower, string alt, Keys code) { _upper = upper; _lower = lower; _alt = alt; _code = code; } public InputCharacter(string upper, string lower, Keys code) : this(upper, lower, lower, code) { } public string ReturnCharacter(bool shiftDown, bool altDown) { return altDown ? _alt : shiftDown ? _upper : _lower; } public Keys ReturnKey() { return _code; } } #endregion internal class InputHandler : GameComponent { private static List _alphabet; public static KeyboardState KeyboardState => _keyboardState; public static KeyboardState LastKeyboardState => _lastKeyboardState; public static MouseState MouseState => _mouseState; public static MouseState LastMousState => _lastMouseState; private static KeyboardState _keyboardState; private static KeyboardState _lastKeyboardState; private static MouseState _mouseState; private static MouseState _lastMouseState; private static GamePadState _gamePadState; private static GamePadState _lastGamePadState; private static float _gamePadAccuracy = 0.2f; #region Constructor Region public InputHandler(Game game) : base(game) { _keyboardState = Keyboard.GetState(); _mouseState = Mouse.GetState(); _alphabet = new List(); // TODO_End: Important! Replace this method to support different keyboard layouts /* Alphabet. */ _alphabet.Add(new InputCharacter("A", "a", Keys.A)); _alphabet.Add(new InputCharacter("B", "b", Keys.B)); _alphabet.Add(new InputCharacter("C", "c", Keys.C)); _alphabet.Add(new InputCharacter("D", "d", Keys.D)); _alphabet.Add(new InputCharacter("E", "e", "€", Keys.E)); _alphabet.Add(new InputCharacter("F", "f", Keys.F)); _alphabet.Add(new InputCharacter("G", "g", Keys.G)); _alphabet.Add(new InputCharacter("H", "h", Keys.H)); _alphabet.Add(new InputCharacter("I", "i", Keys.I)); _alphabet.Add(new InputCharacter("J", "j", Keys.J)); _alphabet.Add(new InputCharacter("K", "k", Keys.K)); _alphabet.Add(new InputCharacter("L", "l", Keys.L)); _alphabet.Add(new InputCharacter("M", "m", "µ", Keys.M)); _alphabet.Add(new InputCharacter("N", "n", Keys.N)); _alphabet.Add(new InputCharacter("O", "o", Keys.O)); _alphabet.Add(new InputCharacter("P", "p", Keys.P)); _alphabet.Add(new InputCharacter("Q", "q", "@", Keys.Q)); _alphabet.Add(new InputCharacter("R", "r", Keys.R)); _alphabet.Add(new InputCharacter("S", "s", Keys.S)); _alphabet.Add(new InputCharacter("T", "t", Keys.T)); _alphabet.Add(new InputCharacter("U", "u", Keys.U)); _alphabet.Add(new InputCharacter("V", "v", Keys.V)); _alphabet.Add(new InputCharacter("W", "w", Keys.W)); _alphabet.Add(new InputCharacter("X", "x", Keys.X)); _alphabet.Add(new InputCharacter("Y", "y", Keys.Y)); _alphabet.Add(new InputCharacter("Z", "z", Keys.Z)); /* Dezimalzahlen. */ _alphabet.Add(new InputCharacter("!", "1", Keys.D1)); _alphabet.Add(new InputCharacter("\"", "2", "²", Keys.D2)); _alphabet.Add(new InputCharacter("§", "3", "³", Keys.D3)); _alphabet.Add(new InputCharacter("$", "4", Keys.D4)); _alphabet.Add(new InputCharacter("%", "5", Keys.D5)); _alphabet.Add(new InputCharacter("&", "6", "|", Keys.D6)); _alphabet.Add(new InputCharacter("/", "7", "{", Keys.D7)); _alphabet.Add(new InputCharacter("(", "8", "[", Keys.D8)); _alphabet.Add(new InputCharacter(")", "9", "]", Keys.D9)); _alphabet.Add(new InputCharacter("=", "0", "}", Keys.D0)); /* Sonderelemente. */ _alphabet.Add(new InputCharacter(" ", " ", Keys.Space)); //InputHandler.alphabet.Add(new InputCharacter("Ü", "ü", Keys.OemSemicolon)); //InputHandler.alphabet.Add(new InputCharacter("Ö", "ö", Keys.OemTilde)); //InputHandler.alphabet.Add(new InputCharacter("Ä", "ä", Keys.OemQuotes)); _alphabet.Add(new InputCharacter(";", ",", Keys.OemComma)); _alphabet.Add(new InputCharacter("*", "+", "~", Keys.OemPlus)); _alphabet.Add(new InputCharacter("'", "#", Keys.OemQuestion)); _alphabet.Add(new InputCharacter(":", ".", Keys.OemPeriod)); _alphabet.Add(new InputCharacter("_", "-", Keys.OemMinus)); _alphabet.Add(new InputCharacter("?", "", Keys.OemOpenBrackets)); _alphabet.Add(new InputCharacter(">", "<", "|", Keys.OemBackslash)); //InputHandler.alphabet.Add(new InputCharacter("`", "´", Keys.OemCloseBrackets)); //InputHandler.alphabet.Add(new InputCharacter("°", "^", Keys.OemPipe)); } #endregion public override void Update(GameTime gameTime) { _lastKeyboardState = _keyboardState; _keyboardState = Keyboard.GetState(); _lastMouseState = _mouseState; _mouseState = Mouse.GetState(); _lastGamePadState = _gamePadState; _gamePadState = GamePad.GetState(0); // if the game was not active the last mousestate is uninteresting if (!Game1.WasActive) ResetInputState(); } /// /// set the last input state to the current state /// public static void ResetInputState() { _lastKeyboardState = _keyboardState; _lastMouseState = _mouseState; _lastGamePadState = _gamePadState; } public static bool LastKeyDown(Keys key) { return _lastKeyboardState.IsKeyDown(key); } public static bool KeyDown(Keys key) { return _keyboardState.IsKeyDown(key); } public static bool KeyPressed(Keys key) { return _keyboardState.IsKeyDown(key) && _lastKeyboardState.IsKeyUp(key); } public static bool KeyReleased(Keys key) { return _keyboardState.IsKeyUp(key) && _lastKeyboardState.IsKeyDown(key); } public static List GetPressedKeys() { var pressedKeys = new List(); var downKeys = _keyboardState.GetPressedKeys(); for (var i = 0; i < downKeys.Length; i++) { if (KeyPressed(downKeys[i])) pressedKeys.Add(downKeys[i]); } return pressedKeys; } public static List GetPressedButtons() { var pressedKeys = new List(); foreach (Buttons button in Enum.GetValues(typeof(Buttons))) { if (GamePadPressed(button)) pressedKeys.Add(button); } return pressedKeys; } public static bool LastGamePadDown(Buttons button) { return _lastGamePadState.IsButtonDown(button); } public static bool GamePadDown(Buttons button) { return _gamePadState.IsButtonDown(button); } public static bool GamePadPressed(Buttons button) { return _gamePadState.IsButtonDown(button) && _lastGamePadState.IsButtonUp(button); } public static bool GamePadReleased(Buttons button) { return _gamePadState.IsButtonUp(button) && _lastGamePadState.IsButtonDown(button); } public static bool GamePadLeftStick(Vector2 dir) { return ((dir.X < 0 && _gamePadState.ThumbSticks.Left.X < -_gamePadAccuracy) || (dir.X > 0 && _gamePadState.ThumbSticks.Left.X > _gamePadAccuracy) || (dir.Y < 0 && _gamePadState.ThumbSticks.Left.Y < -_gamePadAccuracy) || (dir.Y > 0 && _gamePadState.ThumbSticks.Left.Y > _gamePadAccuracy)); } public static bool LastGamePadLeftStick(Vector2 dir) { return ((dir.X < 0 && _lastGamePadState.ThumbSticks.Left.X < -_gamePadAccuracy) || (dir.X > 0 && _lastGamePadState.ThumbSticks.Left.X > _gamePadAccuracy) || (dir.Y < 0 && _lastGamePadState.ThumbSticks.Left.Y < -_gamePadAccuracy) || (dir.Y > 0 && _lastGamePadState.ThumbSticks.Left.Y > _gamePadAccuracy)); } public static bool GamePadRightStick(Vector2 dir) { return ((dir.X < 0 && _gamePadState.ThumbSticks.Right.X < -_gamePadAccuracy) || (dir.X > 0 && _gamePadState.ThumbSticks.Right.X > _gamePadAccuracy) || (dir.Y < 0 && _gamePadState.ThumbSticks.Right.Y < -_gamePadAccuracy) || (dir.Y > 0 && _gamePadState.ThumbSticks.Right.Y > _gamePadAccuracy)); } #region Mouse Region //scroll public static bool MouseWheelUp() { return _mouseState.ScrollWheelValue > _lastMouseState.ScrollWheelValue; } public static bool MouseWheelDown() { return _mouseState.ScrollWheelValue < _lastMouseState.ScrollWheelValue; } //down public static bool MouseLeftDown() { return _mouseState.LeftButton == ButtonState.Pressed; } public static bool MouseLeftDown(Rectangle rectangle) { return MouseIntersect(rectangle) && MouseLeftDown(); } public static bool MouseRightDown() { return _mouseState.RightButton == ButtonState.Pressed; } public static bool MouseMiddleDown() { return _mouseState.MiddleButton == ButtonState.Pressed; } //start public static bool MouseLeftStart() { return _mouseState.LeftButton == ButtonState.Pressed && _lastMouseState.LeftButton == ButtonState.Released; } public static bool MouseRightStart() { return _mouseState.RightButton == ButtonState.Pressed && _lastMouseState.RightButton == ButtonState.Released; } public static bool MouseMiddleStart() { return _mouseState.MiddleButton == ButtonState.Pressed && _lastMouseState.MiddleButton == ButtonState.Released; } //released public static bool MouseLeftReleased() { return _mouseState.LeftButton == ButtonState.Released && _lastMouseState.LeftButton == ButtonState.Pressed; } public static bool MouseRightReleased() { return _mouseState.RightButton == ButtonState.Released && _lastMouseState.RightButton == ButtonState.Pressed; } //pressed public static bool MouseLeftPressed() { return _mouseState.LeftButton == ButtonState.Pressed && _lastMouseState.LeftButton == ButtonState.Released; } public static bool MouseLeftPressed(Rectangle rectangle) { return rectangle.Contains(MousePosition()) && MouseLeftPressed(); } public static bool MouseRightPressed() { return _mouseState.RightButton == ButtonState.Pressed && _lastMouseState.RightButton == ButtonState.Released; } public static bool MouseRightPressed(Rectangle rectangle) { return MouseIntersect(rectangle) && MouseRightPressed(); } public static bool MouseIntersect(Rectangle rectangle) { return rectangle.Contains(MousePosition()); } public static Point MousePosition() { return _mouseState.Position; } public static Point LastMousePosition() { return _lastMouseState.Position; } #endregion #region return text + return number /// /// returns the pressed keys if they are in the InputHandler.alphabet /// only returns one key at a time /// /// public static string ReturnCharacter() { var shiftDown = _keyboardState.IsKeyDown(Keys.LeftShift) || _keyboardState.IsKeyDown(Keys.RightShift); var altDown = _keyboardState.IsKeyDown(Keys.LeftAlt) || _keyboardState.IsKeyDown(Keys.RightAlt); //var pressedKeys = _keyboardState.GetPressedKeys(); foreach (var character in _alphabet) { if (KeyPressed(character.ReturnKey())) return character.ReturnCharacter(shiftDown, altDown); } return ""; } /// /// returns pressed number from d0-d9 and numpad0-numpad9 /// /// public static int ReturnNumber() { for (var i = 0; i < 10; i++) if (KeyPressed(Keys.D0 + i) || KeyPressed(Keys.NumPad0 + i)) return i; return -1; } #endregion } }