sneak/Shared/Input.cs

85 lines
3.0 KiB
C#
Raw Permalink Normal View History

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;
}
}
}
}