MoonWorks/src/Input/Input.cs

118 lines
2.3 KiB
C#
Raw Normal View History

2022-02-23 05:14:32 +00:00
using SDL2;
2021-03-25 22:57:26 +00:00
using System;
2021-01-19 07:29:07 +00:00
namespace MoonWorks.Input
2021-01-19 07:29:07 +00:00
{
2022-02-23 05:14:32 +00:00
public class Inputs
{
public const int MAX_GAMEPADS = 4;
2022-02-23 05:14:32 +00:00
public Keyboard Keyboard { get; }
public Mouse Mouse { get; }
Gamepad[] gamepads;
2022-02-23 05:14:32 +00:00
public static event Action<char> TextInput;
2022-07-08 23:47:12 +00:00
public bool AnyPressed { get; private set; }
public ButtonIdentifier AnyPressedButton { get; private set; }
2022-02-23 05:14:32 +00:00
internal Inputs()
{
Keyboard = new Keyboard();
Mouse = new Mouse();
gamepads = new Gamepad[MAX_GAMEPADS];
for (var i = 0; i < 4; i += 1)
2022-02-23 05:14:32 +00:00
{
if (SDL.SDL_IsGameController(i) == SDL.SDL_bool.SDL_TRUE)
{
2022-04-27 18:37:35 +00:00
gamepads[i] = new Gamepad(SDL.SDL_GameControllerOpen(i), i);
}
else
{
2022-04-27 18:37:35 +00:00
gamepads[i] = new Gamepad(IntPtr.Zero, -1);
2022-02-23 05:14:32 +00:00
}
}
}
// Assumes that SDL_PumpEvents has been called!
internal void Update()
{
2022-07-08 23:47:12 +00:00
AnyPressed = false;
Mouse.Wheel = 0;
2022-02-23 05:14:32 +00:00
Keyboard.Update();
2022-07-08 23:47:12 +00:00
if (Keyboard.AnyPressed)
{
AnyPressed = true;
AnyPressedButton = new ButtonIdentifier(Keyboard.AnyPressedKeyCode);
}
2022-02-23 05:14:32 +00:00
Mouse.Update();
2022-07-08 23:47:12 +00:00
if (Mouse.AnyPressed)
{
AnyPressed = true;
AnyPressedButton = new ButtonIdentifier(Mouse.AnyPressedButtonCode);
}
2022-02-23 05:14:32 +00:00
foreach (var gamepad in gamepads)
{
gamepad.Update();
2022-07-08 23:47:12 +00:00
if (gamepad.AnyPressed)
{
AnyPressed = true;
AnyPressedButton = new ButtonIdentifier(gamepad, gamepad.AnyPressedButtonCode);
}
2022-02-23 05:14:32 +00:00
}
}
public bool GamepadExists(int slot)
{
return !gamepads[slot].IsDummy;
2022-02-23 05:14:32 +00:00
}
public Gamepad GetGamepad(int slot)
{
return gamepads[slot];
}
2022-04-27 18:37:35 +00:00
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);
}
2022-07-08 23:47:12 +00:00
else if (identifier.DeviceKind == DeviceKind.None)
{
return new ButtonState(ButtonStatus.Released);
}
2022-04-27 18:37:35 +00:00
else
{
throw new System.ArgumentException("Invalid button identifier!");
}
}
2022-02-23 05:14:32 +00:00
internal static void OnTextInput(char c)
{
if (TextInput != null)
{
TextInput(c);
}
}
}
2021-01-19 07:29:07 +00:00
}