feat: added basic window, input & drawing
This commit is contained in:
134
Platforms/Desktop/Engine.Integration.SDL3/Sdl3GameInputs.cs
Normal file
134
Platforms/Desktop/Engine.Integration.SDL3/Sdl3GameInputs.cs
Normal file
@@ -0,0 +1,134 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Engine.Core;
|
||||
using Engine.Systems.Input;
|
||||
|
||||
using MyUniverse.Shared.Behaviours.Abstract;
|
||||
|
||||
using SDL3;
|
||||
|
||||
namespace Engine.Integration.SDL3;
|
||||
|
||||
public class Sdl3GameInputs : Behaviour, IGameInputs, IFirstFrameUpdate
|
||||
{
|
||||
public IButtonInputs<IGameInputs.Button>.InputEvent OnAnyButtonPressed { get; } = new();
|
||||
public IButtonInputs<IGameInputs.Button>.InputEvent OnAnyButtonReleased { get; } = new();
|
||||
|
||||
private readonly Dictionary<IGameInputs.Button, IButtonInputs<IGameInputs.Button>.InputEvent> OnPressed = new(256);
|
||||
private readonly Dictionary<IGameInputs.Button, IButtonInputs<IGameInputs.Button>.InputEvent> OnReleased = new(256);
|
||||
|
||||
private readonly Dictionary<IGameInputs.Button, SDL.Keycode> keyMappingReversed = [];
|
||||
private readonly Dictionary<SDL.Keycode, IGameInputs.Button> keyMapping = new() {
|
||||
{ SDL.Keycode.Space, IGameInputs.Button.Interact }
|
||||
};
|
||||
|
||||
private Sdl3KeyboardInputs keyboardInputs = null!;
|
||||
|
||||
public void FirstActiveFrame()
|
||||
{
|
||||
keyboardInputs = BehaviourController.GetOrAddBehaviour<Sdl3KeyboardInputs>();
|
||||
keyboardInputs.OnAnyButtonPressed.AddListener(AnyPressCallback);
|
||||
keyboardInputs.OnAnyButtonReleased.AddListener(AnyReleaseCallback);
|
||||
|
||||
foreach ((SDL.Keycode key, IGameInputs.Button button) in keyMapping)
|
||||
keyboardInputs.RegisterOnPress(key, PressCallback);
|
||||
|
||||
foreach ((SDL.Keycode key, IGameInputs.Button button) in keyMapping)
|
||||
keyboardInputs.RegisterOnRelease(key, ReleaseCallback);
|
||||
}
|
||||
|
||||
public void ExitUniverse(IUniverse universe)
|
||||
{
|
||||
keyboardInputs.OnAnyButtonPressed.RemoveListener(AnyPressCallback);
|
||||
keyboardInputs.OnAnyButtonReleased.RemoveListener(AnyReleaseCallback);
|
||||
|
||||
foreach ((SDL.Keycode key, IGameInputs.Button button) in keyMapping)
|
||||
keyboardInputs.UnregisterOnPress(key, PressCallback);
|
||||
|
||||
foreach ((SDL.Keycode key, IGameInputs.Button button) in keyMapping)
|
||||
keyboardInputs.UnregisterOnRelease(key, ReleaseCallback);
|
||||
}
|
||||
|
||||
private void PressCallback(IButtonInputs<SDL.Keycode> sender, IButtonInputs<SDL.Keycode>.ButtonCallbackArguments args)
|
||||
{
|
||||
if (!keyMapping.TryGetValue(args.Button, out IGameInputs.Button button))
|
||||
return;
|
||||
|
||||
if (!OnPressed.TryGetValue(button, out IButtonInputs<IGameInputs.Button>.InputEvent? @event))
|
||||
return;
|
||||
|
||||
@event.Invoke(this, new(button));
|
||||
}
|
||||
|
||||
private void ReleaseCallback(IButtonInputs<SDL.Keycode> sender, IButtonInputs<SDL.Keycode>.ButtonCallbackArguments args)
|
||||
{
|
||||
if (!keyMapping.TryGetValue(args.Button, out IGameInputs.Button button))
|
||||
return;
|
||||
|
||||
if (!OnReleased.TryGetValue(button, out IButtonInputs<IGameInputs.Button>.InputEvent? @event))
|
||||
return;
|
||||
|
||||
@event.Invoke(this, new(button));
|
||||
}
|
||||
|
||||
private void AnyReleaseCallback(IButtonInputs<SDL.Keycode> sender, IButtonInputs<SDL.Keycode>.ButtonCallbackArguments args)
|
||||
{
|
||||
if (keyMapping.TryGetValue(args.Button, out IGameInputs.Button button))
|
||||
OnAnyButtonPressed?.Invoke(this, new(button));
|
||||
}
|
||||
|
||||
private void AnyPressCallback(IButtonInputs<SDL.Keycode> sender, IButtonInputs<SDL.Keycode>.ButtonCallbackArguments args)
|
||||
{
|
||||
if (keyMapping.TryGetValue(args.Button, out IGameInputs.Button button))
|
||||
OnAnyButtonPressed?.Invoke(this, new(button));
|
||||
}
|
||||
|
||||
public void RegisterOnPress(IGameInputs.Button button, IButtonInputs<IGameInputs.Button>.InputEvent.EventHandler callback)
|
||||
{
|
||||
if (!OnPressed.TryGetValue(button, out IButtonInputs<IGameInputs.Button>.InputEvent? @event))
|
||||
{
|
||||
@event = new();
|
||||
OnPressed.Add(button, @event);
|
||||
}
|
||||
|
||||
@event.AddListener(callback);
|
||||
}
|
||||
|
||||
public void UnregisterOnPress(IGameInputs.Button button, IButtonInputs<IGameInputs.Button>.InputEvent.EventHandler callback)
|
||||
{
|
||||
if (OnPressed.TryGetValue(button, out IButtonInputs<IGameInputs.Button>.InputEvent? @event))
|
||||
@event.RemoveListener(callback);
|
||||
}
|
||||
|
||||
public void RegisterOnRelease(IGameInputs.Button button, IButtonInputs<IGameInputs.Button>.InputEvent.EventHandler callback)
|
||||
{
|
||||
if (!OnReleased.TryGetValue(button, out IButtonInputs<IGameInputs.Button>.InputEvent? @event))
|
||||
{
|
||||
@event = new();
|
||||
OnReleased.Add(button, @event);
|
||||
}
|
||||
|
||||
@event.AddListener(callback);
|
||||
}
|
||||
|
||||
public void UnregisterOnRelease(IGameInputs.Button button, IButtonInputs<IGameInputs.Button>.InputEvent.EventHandler callback)
|
||||
{
|
||||
if (OnReleased.TryGetValue(button, out IButtonInputs<IGameInputs.Button>.InputEvent? @event))
|
||||
@event.RemoveListener(callback);
|
||||
}
|
||||
|
||||
public bool IsPressed(IGameInputs.Button button)
|
||||
{
|
||||
if (!keyMappingReversed.TryGetValue(button, out SDL.Keycode key))
|
||||
throw new($"{Enum.GetName(button)} is not mapped correctly");
|
||||
|
||||
return keyboardInputs.IsPressed(key);
|
||||
}
|
||||
|
||||
public Sdl3GameInputs()
|
||||
{
|
||||
foreach ((SDL.Keycode key, IGameInputs.Button button) in keyMapping)
|
||||
keyMappingReversed.Add(button, key);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user