You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input;
namespace SemiColinGames { public readonly struct Input { public readonly Vector2 Motion; // If true, the player's x-motion should be treated as an absolute number of pixels in a given
// direction, regardless of modeled time. This is only enabled in DEBUG builds.
public readonly bool IsAbsoluteMotion; public readonly bool Jump; public readonly bool Attack;
public readonly bool Pause; public readonly bool Debug; // Button combos for Exit / Restart / FullScreen only work in DEBUG builds.
// Keyboard controls always work for these actions.
public readonly bool Exit; public readonly bool Restart; public readonly bool FullScreen;
public Input(GamePadState gamePad, KeyboardState keyboard) { Motion = new Vector2(); IsAbsoluteMotion = false;
// We check for debugging buttons first. If any are pressed, we suppress normal input;
// other button-presses correspond to special debugging things.
Exit = keyboard.IsKeyDown(Keys.Escape); Restart = keyboard.IsKeyDown(Keys.F5); FullScreen = keyboard.IsKeyDown(Keys.F12);
#if DEBUG
if (gamePad.IsButtonDown(Buttons.LeftShoulder) && gamePad.IsButtonDown(Buttons.RightShoulder)) { IsAbsoluteMotion = true; Exit |= gamePad.IsButtonDown(Buttons.Start); Restart |= gamePad.IsButtonDown(Buttons.Back); FullScreen |= gamePad.IsButtonDown(Buttons.Y); } #endif
if (Exit || Restart || FullScreen) { Jump = false; Attack = false; Pause = false; Debug = false; return; }
// Then 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);
Debug = gamePad.IsButtonDown(Buttons.Back) || keyboard.IsKeyDown(Keys.OemMinus); Pause = gamePad.IsButtonDown(Buttons.Start) || keyboard.IsKeyDown(Keys.P);
// 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.
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; }
} } }
|