using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; namespace SemiColinGames { struct Input { public bool Jump; public bool Attack; public Vector2 Motion; public bool Exit; public bool FullScreen; public bool Debug; public Input(GamePadState gamePad, KeyboardState keyboard) { // First we process normal buttons. Jump = gamePad.IsButtonDown(Buttons.A) || gamePad.IsButtonDown(Buttons.B) || keyboard.IsKeyDown(Keys.J); Attack = gamePad.IsButtonDown(Buttons.X) || gamePad.IsButtonDown(Buttons.Y) || keyboard.IsKeyDown(Keys.K); // Then special debugging sorts of buttons. Exit = gamePad.IsButtonDown(Buttons.Start) || keyboard.IsKeyDown(Keys.Escape); FullScreen = gamePad.IsButtonDown(Buttons.Back) || keyboard.IsKeyDown(Keys.F12) || keyboard.IsKeyDown(Keys.OemPlus); Debug = gamePad.IsButtonDown(Buttons.LeftShoulder) || keyboard.IsKeyDown(Keys.OemMinus); // Then potential motion directions. If the player attempts to input opposite directions at // once (up & down or left & right), those inputs cancel out, resulting in no motion. Motion = new Vector2(); Vector2 leftStick = gamePad.ThumbSticks.Left; bool left = leftStick.X < -0.5 || gamePad.IsButtonDown(Buttons.DPadLeft) || keyboard.IsKeyDown(Keys.A); bool right = leftStick.X > 0.5 || gamePad.IsButtonDown(Buttons.DPadRight) || keyboard.IsKeyDown(Keys.D); bool up = leftStick.Y > 0.5 || gamePad.IsButtonDown(Buttons.DPadUp) || keyboard.IsKeyDown(Keys.W); bool down = leftStick.Y < -0.5 || gamePad.IsButtonDown(Buttons.DPadDown) || keyboard.IsKeyDown(Keys.S); if (left && !right) { Motion.X = -1; } if (right && !left) { Motion.X = 1; } if (up && !down) { Motion.Y = 1; } if (down && !up) { Motion.Y = -1; } } } }