216 lines
5.9 KiB
C#
216 lines
5.9 KiB
C#
using System.Diagnostics.CodeAnalysis;
|
|
using System.Numerics;
|
|
using Voile.Utils;
|
|
|
|
namespace Voile
|
|
{
|
|
/// <summary>
|
|
/// A system providing means for collecting user input, as well as defining custom <see cref="InputAction"/> list.
|
|
/// </summary>
|
|
public abstract class InputSystem : IStartableSystem, IDisposable
|
|
{
|
|
/// <summary>
|
|
/// The list of all available input mappings, custom and built-in.
|
|
/// </summary>
|
|
public static IReadOnlyDictionary<string, List<InputAction>> InputMappings => inputMappings;
|
|
|
|
public void Start()
|
|
{
|
|
inputMappings = new Dictionary<string, List<InputAction>>();
|
|
CreateDefaultMappings();
|
|
}
|
|
|
|
public void Shutdown() => Dispose();
|
|
|
|
public void Dispose() => GC.SuppressFinalize(this);
|
|
|
|
public bool Handled { get => _handled; set => _handled = value; }
|
|
public abstract bool IsKeyboardKeyDown(KeyboardKey key);
|
|
public abstract bool KeyboardKeyJustPressed(KeyboardKey key);
|
|
public abstract bool KeyboardKeyJustReleased(KeyboardKey key);
|
|
public abstract Vector2 GetInputDirection(KeyboardKey leftKey, KeyboardKey rightKey, KeyboardKey upKey, KeyboardKey downKey);
|
|
public abstract Vector2 GetInputDirection(string leftAction, string rightAction, string upAction, string downAction);
|
|
public abstract int GetCharPressed();
|
|
|
|
public abstract bool IsActionDown(string action);
|
|
public abstract bool IsActionPressed(string action);
|
|
public abstract bool IsActionReleased(string action);
|
|
|
|
public abstract bool IsMouseButtonDown(MouseButton button);
|
|
public abstract float GetMouseWheelMovement();
|
|
public abstract void SetMousePosition(Vector2 position);
|
|
public abstract Vector2 GetMousePosition();
|
|
public abstract void HideCursor();
|
|
public abstract void ShowCursor();
|
|
public abstract bool IsCursorHidden();
|
|
|
|
public void SetAsHandled() => _handled = true;
|
|
|
|
public void AddInputMapping(string actionName, IEnumerable<InputAction> inputActions)
|
|
{
|
|
inputMappings.Add(actionName, inputActions.ToList());
|
|
}
|
|
|
|
private void CreateDefaultMappings()
|
|
{
|
|
AddInputMapping("up", new InputAction[] {
|
|
new KeyInputAction(KeyboardKey.W),
|
|
new KeyInputAction(KeyboardKey.Up),
|
|
});
|
|
AddInputMapping("down", new InputAction[] {
|
|
new KeyInputAction(KeyboardKey.S),
|
|
new KeyInputAction(KeyboardKey.Down),
|
|
});
|
|
AddInputMapping("left", new InputAction[] {
|
|
new KeyInputAction(KeyboardKey.A),
|
|
new KeyInputAction(KeyboardKey.Left),
|
|
});
|
|
AddInputMapping("right", new InputAction[] {
|
|
new KeyInputAction(KeyboardKey.D),
|
|
new KeyInputAction(KeyboardKey.Right),
|
|
});
|
|
}
|
|
|
|
protected bool TryGetInputMappings(string forAction, [NotNullWhen(true)] out IEnumerable<InputAction>? inputActions)
|
|
{
|
|
var contains = inputMappings.ContainsKey(forAction);
|
|
inputActions = null;
|
|
|
|
if (!contains)
|
|
{
|
|
_logger.Error($"The action \"{forAction}\" is not present in the input mappings!");
|
|
return false;
|
|
}
|
|
|
|
inputActions = inputMappings[forAction];
|
|
|
|
return true;
|
|
}
|
|
|
|
protected static Dictionary<string, List<InputAction>> inputMappings = new();
|
|
private bool _handled;
|
|
private Logger _logger = new(nameof(InputSystem));
|
|
}
|
|
|
|
public enum KeyboardKey
|
|
{
|
|
Null = 0,
|
|
Back = 4,
|
|
VolumeUp = 24,
|
|
VolumeDown = 25,
|
|
Spacebar = 32,
|
|
Apostrophe = 39,
|
|
Comma = 44,
|
|
Minus = 45,
|
|
Period = 46,
|
|
Slash = 47,
|
|
Zero = 48,
|
|
One = 49,
|
|
Two = 50,
|
|
Three = 51,
|
|
Four = 52,
|
|
Five = 53,
|
|
Six = 54,
|
|
Seven = 55,
|
|
Eight = 56,
|
|
Nine = 57,
|
|
Semicolon = 59,
|
|
Equal = 61,
|
|
A = 65,
|
|
B = 66,
|
|
C = 67,
|
|
D = 68,
|
|
E = 69,
|
|
F = 70,
|
|
G = 71,
|
|
H = 72,
|
|
I = 73,
|
|
J = 74,
|
|
K = 75,
|
|
L = 76,
|
|
M = 77,
|
|
N = 78,
|
|
O = 79,
|
|
P = 80,
|
|
Q = 81,
|
|
R = 82,
|
|
Menu = 82,
|
|
S = 83,
|
|
T = 84,
|
|
U = 85,
|
|
V = 86,
|
|
W = 87,
|
|
X = 88,
|
|
Y = 89,
|
|
Z = 90,
|
|
LeftBracket = 91,
|
|
Backslash = 92,
|
|
RightBracket = 93,
|
|
Grave = 96,
|
|
Escape = 256,
|
|
Enter = 257,
|
|
Tab = 258,
|
|
Backspace = 259,
|
|
Insert = 260,
|
|
Delete = 261,
|
|
Right = 262,
|
|
Left = 263,
|
|
Down = 264,
|
|
Up = 265,
|
|
PageUp = 266,
|
|
PageDown = 267,
|
|
Home = 268,
|
|
End = 269,
|
|
CapsLock = 280,
|
|
ScrollLock = 281,
|
|
NumLock = 282,
|
|
PrintScreen = 283,
|
|
Pause = 284,
|
|
F1 = 290,
|
|
F2 = 291,
|
|
F3 = 292,
|
|
F4 = 293,
|
|
F5 = 294,
|
|
F6 = 295,
|
|
F7 = 296,
|
|
F8 = 297,
|
|
F9 = 298,
|
|
F10 = 299,
|
|
F11 = 300,
|
|
F12 = 301,
|
|
KP0 = 320,
|
|
KP1 = 321,
|
|
KP2 = 322,
|
|
KP3 = 323,
|
|
KP4 = 324,
|
|
KP5 = 325,
|
|
KP6 = 326,
|
|
KP7 = 327,
|
|
KP8 = 328,
|
|
KP9 = 329,
|
|
KPDecimal = 330,
|
|
KPDivide = 331,
|
|
KPMultiply = 332,
|
|
KPSubstract = 333,
|
|
KPAdd = 334,
|
|
KPEnter = 335,
|
|
KPEqual = 336,
|
|
LeftShift = 340,
|
|
LeftControl = 341,
|
|
LeftAlt = 342,
|
|
LeftSuper = 343,
|
|
RightShift = 344,
|
|
RightControl = 345,
|
|
RightAlt = 346,
|
|
RightSuper = 347,
|
|
KBMenu = 348
|
|
}
|
|
|
|
[Flags]
|
|
public enum MouseButton
|
|
{
|
|
Left = 0,
|
|
Right = 1,
|
|
Middle = 2,
|
|
}
|
|
} |