forked from MoonsideGames/MoonWorks
blittable button identifiers
parent
27e0404ec0
commit
810f270a41
|
@ -0,0 +1,31 @@
|
|||
namespace MoonWorks.Input
|
||||
{
|
||||
// Blittable identifier that can be used for button state lookups.
|
||||
public struct ButtonIdentifier
|
||||
{
|
||||
public DeviceKind DeviceKind { get; }
|
||||
public int Index { get; } // 1-4 for gamepads, 0 otherwise
|
||||
public int Code { get; }
|
||||
|
||||
public ButtonIdentifier(Gamepad gamepad, ButtonCode buttonCode)
|
||||
{
|
||||
DeviceKind = DeviceKind.Gamepad;
|
||||
Index = gamepad.Index;
|
||||
Code = (int) buttonCode;
|
||||
}
|
||||
|
||||
public ButtonIdentifier(KeyCode keyCode)
|
||||
{
|
||||
DeviceKind = DeviceKind.Keyboard;
|
||||
Index = 0;
|
||||
Code = (int) keyCode;
|
||||
}
|
||||
|
||||
public ButtonIdentifier(MouseButtonCode mouseCode)
|
||||
{
|
||||
DeviceKind = DeviceKind.Mouse;
|
||||
Index = 0;
|
||||
Code = (int) mouseCode;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
namespace MoonWorks.Input
|
||||
{
|
||||
public enum DeviceKind
|
||||
{
|
||||
Keyboard,
|
||||
Mouse,
|
||||
Gamepad
|
||||
}
|
||||
}
|
|
@ -8,6 +8,7 @@ namespace MoonWorks.Input
|
|||
public class Gamepad
|
||||
{
|
||||
internal IntPtr Handle;
|
||||
internal int Index;
|
||||
|
||||
public Button A { get; } = new Button();
|
||||
public Button B { get; } = new Button();
|
||||
|
@ -39,9 +40,10 @@ namespace MoonWorks.Input
|
|||
private Dictionary<SDL.SDL_GameControllerAxis, Axis> EnumToAxis;
|
||||
private Dictionary<SDL.SDL_GameControllerAxis, Trigger> EnumToTrigger;
|
||||
|
||||
internal Gamepad(IntPtr handle)
|
||||
internal Gamepad(IntPtr handle, int index)
|
||||
{
|
||||
Handle = handle;
|
||||
Index = index;
|
||||
|
||||
EnumToButton = new Dictionary<SDL.SDL_GameControllerButton, Button>
|
||||
{
|
||||
|
|
|
@ -25,11 +25,11 @@ namespace MoonWorks.Input
|
|||
{
|
||||
if (SDL.SDL_IsGameController(i) == SDL.SDL_bool.SDL_TRUE)
|
||||
{
|
||||
gamepads[i] = new Gamepad(SDL.SDL_GameControllerOpen(i));
|
||||
gamepads[i] = new Gamepad(SDL.SDL_GameControllerOpen(i), i);
|
||||
}
|
||||
else
|
||||
{
|
||||
gamepads[i] = new Gamepad(IntPtr.Zero);
|
||||
gamepads[i] = new Gamepad(IntPtr.Zero, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -56,6 +56,27 @@ namespace MoonWorks.Input
|
|||
return gamepads[slot];
|
||||
}
|
||||
|
||||
public ButtonState ButtonState(ButtonIdentifier identifier)
|
||||
{
|
||||
if (identifier.DeviceKind == DeviceKind.Gamepad)
|
||||
{
|
||||
var gamepad = GetGamepad(identifier.Index);
|
||||
return gamepad.ButtonState((ButtonCode) identifier.Code);
|
||||
}
|
||||
else if (identifier.DeviceKind == DeviceKind.Keyboard)
|
||||
{
|
||||
return Keyboard.ButtonState((KeyCode) identifier.Code);
|
||||
}
|
||||
else if (identifier.DeviceKind == DeviceKind.Mouse)
|
||||
{
|
||||
return Mouse.ButtonState((MouseButtonCode) identifier.Code);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new System.ArgumentException("Invalid button identifier!");
|
||||
}
|
||||
}
|
||||
|
||||
internal static void OnTextInput(char c)
|
||||
{
|
||||
if (TextInput != null)
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
using SDL2;
|
||||
using System.Collections.Generic;
|
||||
using SDL2;
|
||||
|
||||
namespace MoonWorks.Input
|
||||
{
|
||||
public class Mouse
|
||||
{
|
||||
public ButtonState LeftButton { get; private set; } = new ButtonState();
|
||||
public ButtonState MiddleButton { get; private set; } = new ButtonState();
|
||||
public ButtonState RightButton { get; private set; } = new ButtonState();
|
||||
public Button LeftButton { get; } = new Button();
|
||||
public Button MiddleButton { get; } = new Button();
|
||||
public Button RightButton { get; } = new Button();
|
||||
|
||||
public int X { get; private set; }
|
||||
public int Y { get; private set; }
|
||||
|
@ -30,6 +31,18 @@ namespace MoonWorks.Input
|
|||
}
|
||||
}
|
||||
|
||||
private readonly Dictionary<MouseButtonCode, Button> CodeToButton;
|
||||
|
||||
public Mouse()
|
||||
{
|
||||
CodeToButton = new Dictionary<MouseButtonCode, Button>
|
||||
{
|
||||
{ MouseButtonCode.Left, LeftButton },
|
||||
{ MouseButtonCode.Right, RightButton },
|
||||
{ MouseButtonCode.Middle, MiddleButton }
|
||||
};
|
||||
}
|
||||
|
||||
internal void Update()
|
||||
{
|
||||
var buttonMask = SDL.SDL_GetMouseState(out var x, out var y);
|
||||
|
@ -40,9 +53,14 @@ namespace MoonWorks.Input
|
|||
DeltaX = deltaX;
|
||||
DeltaY = deltaY;
|
||||
|
||||
LeftButton = LeftButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_LMASK));
|
||||
MiddleButton = MiddleButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_MMASK));
|
||||
RightButton = RightButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_RMASK));
|
||||
LeftButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_LMASK));
|
||||
MiddleButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_MMASK));
|
||||
RightButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_RMASK));
|
||||
}
|
||||
|
||||
public ButtonState ButtonState(MouseButtonCode buttonCode)
|
||||
{
|
||||
return CodeToButton[buttonCode].State;
|
||||
}
|
||||
|
||||
private bool IsPressed(uint buttonMask, uint buttonFlag)
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
namespace MoonWorks.Input
|
||||
{
|
||||
public enum MouseButtonCode
|
||||
{
|
||||
Left,
|
||||
Right,
|
||||
Middle
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue