57 lines
1.3 KiB
C#
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
|
|
};
|
|
}
|
|
} |