mine2d/Mine2d/game/state/InputState.cs

57 lines
1.3 KiB
C#

using System.Runtime.InteropServices;
using Mine2d.engine.system.annotations;
using Mine2d.game.backend.network.packets;
namespace Mine2d.game.state;
public enum InputAxis
{
Horizontal,
Vertical
}
public enum KeyEventType
{
KeyPressed,
KeyReleased
}
[Interactor]
public class InputState
{
[Interaction(InteractorKind.Client, PacketType.Tick)]
public static void OnTick()
{
Context.Get()
.FrontendGameState
.InputState
.UpdateInput();
}
private readonly byte[] keys;
public InputState()
{
var keysPtr = SDL_GetKeyboardState(out var keyCount);
this.keys = new byte[keyCount];
Marshal.Copy(keysPtr, this.keys, 0, keyCount);
}
public void UpdateInput()
{
var keysPtr = SDL_GetKeyboardState(out var keyCount);
Marshal.Copy(keysPtr, this.keys, 0, keyCount);
}
public float GetAxis(InputAxis axis)
{
return axis switch
{
InputAxis.Horizontal
=> this.keys[(int)SDL_Scancode.SDL_SCANCODE_D] - this.keys[(int)SDL_Scancode.SDL_SCANCODE_A],
InputAxis.Vertical
=> this.keys[(int)SDL_Scancode.SDL_SCANCODE_S] - this.keys[(int)SDL_Scancode.SDL_SCANCODE_W],
_ => 0
};
}
}