forked from MoonsideGames/MoonWorks
Inputs.AnyPressed implementation
parent
db5ca97726
commit
1cf3a13541
|
@ -1,7 +1,7 @@
|
||||||
namespace MoonWorks.Input
|
namespace MoonWorks.Input
|
||||||
{
|
{
|
||||||
// Blittable identifier that can be used for button state lookups.
|
// Blittable identifier that can be used for button state lookups.
|
||||||
public struct ButtonIdentifier
|
public struct ButtonIdentifier : System.IEquatable<ButtonIdentifier>
|
||||||
{
|
{
|
||||||
public DeviceKind DeviceKind { get; }
|
public DeviceKind DeviceKind { get; }
|
||||||
public int Index { get; } // 1-4 for gamepads, 0 otherwise
|
public int Index { get; } // 1-4 for gamepads, 0 otherwise
|
||||||
|
@ -27,5 +27,33 @@ namespace MoonWorks.Input
|
||||||
Index = 0;
|
Index = 0;
|
||||||
Code = (int) mouseCode;
|
Code = (int) mouseCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return System.HashCode.Combine(DeviceKind, Index, Code);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool Equals(object obj)
|
||||||
|
{
|
||||||
|
return obj is ButtonIdentifier identifier && Equals(identifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Equals(ButtonIdentifier identifier)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
DeviceKind == identifier.DeviceKind &&
|
||||||
|
Index == identifier.Index &&
|
||||||
|
Code == identifier.Code;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool operator ==(ButtonIdentifier a, ButtonIdentifier b)
|
||||||
|
{
|
||||||
|
return a.Equals(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool operator !=(ButtonIdentifier a, ButtonIdentifier b)
|
||||||
|
{
|
||||||
|
return !(a == b);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,8 +2,9 @@ namespace MoonWorks.Input
|
||||||
{
|
{
|
||||||
public enum DeviceKind
|
public enum DeviceKind
|
||||||
{
|
{
|
||||||
|
None,
|
||||||
Keyboard,
|
Keyboard,
|
||||||
Mouse,
|
Mouse,
|
||||||
Gamepad
|
Gamepad,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,9 @@ namespace MoonWorks.Input
|
||||||
|
|
||||||
public bool IsDummy => Handle == IntPtr.Zero;
|
public bool IsDummy => Handle == IntPtr.Zero;
|
||||||
|
|
||||||
|
public bool AnyPressed { get; private set; }
|
||||||
|
public ButtonCode AnyPressedButtonCode { get; private set; }
|
||||||
|
|
||||||
private Dictionary<SDL.SDL_GameControllerButton, Button> EnumToButton;
|
private Dictionary<SDL.SDL_GameControllerButton, Button> EnumToButton;
|
||||||
private Dictionary<SDL.SDL_GameControllerAxis, Axis> EnumToAxis;
|
private Dictionary<SDL.SDL_GameControllerAxis, Axis> EnumToAxis;
|
||||||
private Dictionary<SDL.SDL_GameControllerAxis, Trigger> EnumToTrigger;
|
private Dictionary<SDL.SDL_GameControllerAxis, Trigger> EnumToTrigger;
|
||||||
|
@ -45,6 +48,8 @@ namespace MoonWorks.Input
|
||||||
Handle = handle;
|
Handle = handle;
|
||||||
Index = index;
|
Index = index;
|
||||||
|
|
||||||
|
AnyPressed = false;
|
||||||
|
|
||||||
EnumToButton = new Dictionary<SDL.SDL_GameControllerButton, Button>
|
EnumToButton = new Dictionary<SDL.SDL_GameControllerButton, Button>
|
||||||
{
|
{
|
||||||
{ SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_A, A },
|
{ SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_A, A },
|
||||||
|
@ -81,11 +86,20 @@ namespace MoonWorks.Input
|
||||||
|
|
||||||
internal void Update()
|
internal void Update()
|
||||||
{
|
{
|
||||||
|
AnyPressed = false;
|
||||||
|
|
||||||
if (!IsDummy)
|
if (!IsDummy)
|
||||||
{
|
{
|
||||||
foreach (var (sdlEnum, button) in EnumToButton)
|
foreach (var (sdlEnum, button) in EnumToButton)
|
||||||
{
|
{
|
||||||
button.Update(CheckPressed(sdlEnum));
|
var pressed = CheckPressed(sdlEnum);
|
||||||
|
button.Update(pressed);
|
||||||
|
|
||||||
|
if (button.IsPressed)
|
||||||
|
{
|
||||||
|
AnyPressed = true;
|
||||||
|
AnyPressedButtonCode = (ButtonCode) sdlEnum;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var (sdlEnum, axis) in EnumToAxis)
|
foreach (var (sdlEnum, axis) in EnumToAxis)
|
||||||
|
|
|
@ -14,6 +14,9 @@ namespace MoonWorks.Input
|
||||||
|
|
||||||
public static event Action<char> TextInput;
|
public static event Action<char> TextInput;
|
||||||
|
|
||||||
|
public bool AnyPressed { get; private set; }
|
||||||
|
public ButtonIdentifier AnyPressedButton { get; private set; }
|
||||||
|
|
||||||
internal Inputs()
|
internal Inputs()
|
||||||
{
|
{
|
||||||
Keyboard = new Keyboard();
|
Keyboard = new Keyboard();
|
||||||
|
@ -37,13 +40,34 @@ namespace MoonWorks.Input
|
||||||
// Assumes that SDL_PumpEvents has been called!
|
// Assumes that SDL_PumpEvents has been called!
|
||||||
internal void Update()
|
internal void Update()
|
||||||
{
|
{
|
||||||
|
AnyPressed = false;
|
||||||
|
|
||||||
Mouse.Wheel = 0;
|
Mouse.Wheel = 0;
|
||||||
Keyboard.Update();
|
Keyboard.Update();
|
||||||
|
|
||||||
|
if (Keyboard.AnyPressed)
|
||||||
|
{
|
||||||
|
AnyPressed = true;
|
||||||
|
AnyPressedButton = new ButtonIdentifier(Keyboard.AnyPressedKeyCode);
|
||||||
|
}
|
||||||
|
|
||||||
Mouse.Update();
|
Mouse.Update();
|
||||||
|
|
||||||
|
if (Mouse.AnyPressed)
|
||||||
|
{
|
||||||
|
AnyPressed = true;
|
||||||
|
AnyPressedButton = new ButtonIdentifier(Mouse.AnyPressedButtonCode);
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var gamepad in gamepads)
|
foreach (var gamepad in gamepads)
|
||||||
{
|
{
|
||||||
gamepad.Update();
|
gamepad.Update();
|
||||||
|
|
||||||
|
if (gamepad.AnyPressed)
|
||||||
|
{
|
||||||
|
AnyPressed = true;
|
||||||
|
AnyPressedButton = new ButtonIdentifier(gamepad, gamepad.AnyPressedButtonCode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,6 +96,10 @@ namespace MoonWorks.Input
|
||||||
{
|
{
|
||||||
return Mouse.ButtonState((MouseButtonCode) identifier.Code);
|
return Mouse.ButtonState((MouseButtonCode) identifier.Code);
|
||||||
}
|
}
|
||||||
|
else if (identifier.DeviceKind == DeviceKind.None)
|
||||||
|
{
|
||||||
|
return new ButtonState(ButtonStatus.Released);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new System.ArgumentException("Invalid button identifier!");
|
throw new System.ArgumentException("Invalid button identifier!");
|
||||||
|
|
|
@ -7,6 +7,9 @@ namespace MoonWorks.Input
|
||||||
{
|
{
|
||||||
public class Keyboard
|
public class Keyboard
|
||||||
{
|
{
|
||||||
|
public bool AnyPressed { get; private set; }
|
||||||
|
public KeyCode AnyPressedKeyCode { get; private set; }
|
||||||
|
|
||||||
private Button[] Keys { get; }
|
private Button[] Keys { get; }
|
||||||
private int numKeys;
|
private int numKeys;
|
||||||
|
|
||||||
|
@ -45,14 +48,16 @@ namespace MoonWorks.Input
|
||||||
|
|
||||||
internal void Update()
|
internal void Update()
|
||||||
{
|
{
|
||||||
|
AnyPressed = false;
|
||||||
|
|
||||||
IntPtr keyboardState = SDL.SDL_GetKeyboardState(out _);
|
IntPtr keyboardState = SDL.SDL_GetKeyboardState(out _);
|
||||||
|
|
||||||
foreach (int keycode in Enum.GetValues(typeof(KeyCode)))
|
foreach (int keycode in Enum.GetValues(typeof(KeyCode)))
|
||||||
{
|
{
|
||||||
var keyDown = Marshal.ReadByte(keyboardState, keycode);
|
var keyDown = Conversions.ByteToBool(Marshal.ReadByte(keyboardState, keycode));
|
||||||
Keys[keycode].Update(Conversions.ByteToBool(keyDown));
|
Keys[keycode].Update(keyDown);
|
||||||
|
|
||||||
if (Conversions.ByteToBool(keyDown))
|
if (keyDown)
|
||||||
{
|
{
|
||||||
if (TextInputBindings.TryGetValue((KeyCode) keycode, out var textIndex))
|
if (TextInputBindings.TryGetValue((KeyCode) keycode, out var textIndex))
|
||||||
{
|
{
|
||||||
|
@ -63,6 +68,12 @@ namespace MoonWorks.Input
|
||||||
Inputs.OnTextInput(TextInputCharacters[6]);
|
Inputs.OnTextInput(TextInputCharacters[6]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Keys[keycode].IsPressed)
|
||||||
|
{
|
||||||
|
AnyPressed = true;
|
||||||
|
AnyPressedKeyCode = (KeyCode) keycode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,9 @@ namespace MoonWorks.Input
|
||||||
|
|
||||||
public int Wheel { get; internal set; }
|
public int Wheel { get; internal set; }
|
||||||
|
|
||||||
|
public bool AnyPressed { get; private set; }
|
||||||
|
public MouseButtonCode AnyPressedButtonCode { get; private set; }
|
||||||
|
|
||||||
private bool relativeMode;
|
private bool relativeMode;
|
||||||
public bool RelativeMode
|
public bool RelativeMode
|
||||||
{
|
{
|
||||||
|
@ -32,6 +35,7 @@ namespace MoonWorks.Input
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly Dictionary<MouseButtonCode, Button> CodeToButton;
|
private readonly Dictionary<MouseButtonCode, Button> CodeToButton;
|
||||||
|
private readonly Dictionary<uint, MouseButtonCode> MaskToButtonCode;
|
||||||
|
|
||||||
public Mouse()
|
public Mouse()
|
||||||
{
|
{
|
||||||
|
@ -41,10 +45,19 @@ namespace MoonWorks.Input
|
||||||
{ MouseButtonCode.Right, RightButton },
|
{ MouseButtonCode.Right, RightButton },
|
||||||
{ MouseButtonCode.Middle, MiddleButton }
|
{ MouseButtonCode.Middle, MiddleButton }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
MaskToButtonCode = new Dictionary<uint, MouseButtonCode>
|
||||||
|
{
|
||||||
|
{ SDL.SDL_BUTTON_LMASK, MouseButtonCode.Left },
|
||||||
|
{ SDL.SDL_BUTTON_MMASK, MouseButtonCode.Middle },
|
||||||
|
{ SDL.SDL_BUTTON_RMASK, MouseButtonCode.Right }
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Update()
|
internal void Update()
|
||||||
{
|
{
|
||||||
|
AnyPressed = false;
|
||||||
|
|
||||||
var buttonMask = SDL.SDL_GetMouseState(out var x, out var y);
|
var buttonMask = SDL.SDL_GetMouseState(out var x, out var y);
|
||||||
var _ = SDL.SDL_GetRelativeMouseState(out var deltaX, out var deltaY);
|
var _ = SDL.SDL_GetRelativeMouseState(out var deltaX, out var deltaY);
|
||||||
|
|
||||||
|
@ -53,9 +66,18 @@ namespace MoonWorks.Input
|
||||||
DeltaX = deltaX;
|
DeltaX = deltaX;
|
||||||
DeltaY = deltaY;
|
DeltaY = deltaY;
|
||||||
|
|
||||||
LeftButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_LMASK));
|
foreach (var (mask, buttonCode) in MaskToButtonCode)
|
||||||
MiddleButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_MMASK));
|
{
|
||||||
RightButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_RMASK));
|
var pressed = IsPressed(buttonMask, mask);
|
||||||
|
var button = CodeToButton[buttonCode];
|
||||||
|
button.Update(pressed);
|
||||||
|
|
||||||
|
if (button.IsPressed)
|
||||||
|
{
|
||||||
|
AnyPressed = true;
|
||||||
|
AnyPressedButtonCode = buttonCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ButtonState ButtonState(MouseButtonCode buttonCode)
|
public ButtonState ButtonState(MouseButtonCode buttonCode)
|
||||||
|
|
Loading…
Reference in New Issue