MoonWorks/src/Input/Keyboard.cs

74 lines
2.0 KiB
C#

using System;
using System.Runtime.InteropServices;
using SDL2;
namespace MoonWorks
{
public class Keyboard
{
private Key[] Keys { get; }
private int numKeys;
internal Keyboard()
{
SDL.SDL_GetKeyboardState(out numKeys);
Keys = new Key[numKeys];
foreach (Keycode keycode in Enum.GetValues(typeof(Keycode)))
{
Keys[(int)keycode] = new Key(keycode);
}
}
internal void Update()
{
IntPtr keyboardState = SDL.SDL_GetKeyboardState(out _);
foreach (int keycode in Enum.GetValues(typeof(Keycode)))
{
var keyDown = Marshal.ReadByte(keyboardState, keycode);
if (keyDown == 1)
{
if (Keys[keycode].InputState == ButtonState.Released)
{
Keys[keycode].InputState = ButtonState.Pressed;
}
else if (Keys[keycode].InputState == ButtonState.Pressed)
{
Keys[keycode].InputState = ButtonState.Held;
}
}
else
{
Keys[keycode].InputState = ButtonState.Released;
}
}
}
public bool IsDown(Keycode keycode)
{
var key = Keys[(int)keycode];
return (key.InputState == ButtonState.Pressed) || (key.InputState == ButtonState.Held);
}
public bool IsPressed(Keycode keycode)
{
var key = Keys[(int)keycode];
return key.InputState == ButtonState.Pressed;
}
public bool IsHeld(Keycode keycode)
{
var key = Keys[(int)keycode];
return key.InputState == ButtonState.Held;
}
public bool IsUp(Keycode keycode)
{
var key = Keys[(int)keycode];
return key.InputState == ButtonState.Released;
}
}
}