111 lines
4.3 KiB
C#
111 lines
4.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
using Microsoft.Xna.Framework.Input;
|
|
|
|
using Syntriax.Engine.Core;
|
|
using Syntriax.Engine.Systems.Input;
|
|
|
|
namespace Syntriax.Engine.Integration.MonoGame;
|
|
|
|
public class KeyboardInputsBehaviour : Behaviour, IButtonInputs<Keys>, IUpdate
|
|
{
|
|
public Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments> OnAnyButtonPressed { get; } = new();
|
|
public Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments> OnAnyButtonReleased { get; } = new();
|
|
|
|
private readonly Dictionary<Keys, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>> OnPressed = new(256);
|
|
private readonly Dictionary<Keys, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>> OnReleased = new(256);
|
|
|
|
private int cachePressedCurrentlyCount = 0;
|
|
private readonly Keys[] cachePressedCurrently = new Keys[256];
|
|
|
|
private int cachePressedPreviouslyCount = 0;
|
|
private readonly Keys[] cachePressedPreviously = new Keys[256];
|
|
|
|
public void RegisterOnPress(Keys key, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>.EventHandler callback)
|
|
{
|
|
if (!OnPressed.TryGetValue(key, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? delegateCallback))
|
|
{
|
|
delegateCallback = new();
|
|
OnPressed.Add(key, delegateCallback);
|
|
}
|
|
|
|
delegateCallback.AddListener(callback);
|
|
}
|
|
|
|
public void UnregisterOnPress(Keys key, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>.EventHandler callback)
|
|
{
|
|
if (OnPressed.TryGetValue(key, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? delegateCallback))
|
|
delegateCallback.RemoveListener(callback);
|
|
}
|
|
|
|
public void RegisterOnRelease(Keys key, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>.EventHandler callback)
|
|
{
|
|
if (!OnReleased.TryGetValue(key, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? delegateCallback))
|
|
{
|
|
delegateCallback = new();
|
|
OnReleased.Add(key, delegateCallback);
|
|
}
|
|
|
|
delegateCallback.AddListener(callback);
|
|
}
|
|
|
|
public void UnregisterOnRelease(Keys key, Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>.EventHandler callback)
|
|
{
|
|
if (OnReleased.TryGetValue(key, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? delegateCallback))
|
|
delegateCallback.RemoveListener(callback);
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
KeyboardState keyboardState = Keyboard.GetState();
|
|
keyboardState.GetPressedKeys(cachePressedCurrently);
|
|
cachePressedCurrentlyCount = keyboardState.GetPressedKeyCount();
|
|
|
|
for (int i = 0; i < cachePressedCurrentlyCount; i++)
|
|
{
|
|
Keys currentlyPressedKey = cachePressedCurrently[i];
|
|
|
|
if (WasPressed(currentlyPressedKey))
|
|
continue;
|
|
|
|
if (OnPressed.TryGetValue(currentlyPressedKey, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? callback))
|
|
callback?.Invoke(this, new(currentlyPressedKey));
|
|
|
|
OnAnyButtonPressed?.Invoke(this, new(currentlyPressedKey));
|
|
}
|
|
|
|
for (int i = 0; i < cachePressedPreviouslyCount; i++)
|
|
{
|
|
Keys previouslyPressedKey = cachePressedPreviously[i];
|
|
|
|
if (IsPressed(previouslyPressedKey))
|
|
continue;
|
|
|
|
if (OnReleased.TryGetValue(previouslyPressedKey, out Event<IButtonInputs<Keys>, IButtonInputs<Keys>.ButtonCallbackArguments>? callback))
|
|
callback?.Invoke(this, new(previouslyPressedKey));
|
|
|
|
OnAnyButtonReleased?.Invoke(this, new(previouslyPressedKey));
|
|
}
|
|
|
|
Array.Copy(cachePressedCurrently, cachePressedPreviously, cachePressedCurrentlyCount);
|
|
cachePressedPreviouslyCount = cachePressedCurrentlyCount;
|
|
}
|
|
|
|
public bool IsPressed(Keys key)
|
|
{
|
|
for (int i = 0; i < cachePressedCurrentlyCount; i++)
|
|
if (cachePressedCurrently[i] == key)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
private bool WasPressed(Keys key)
|
|
{
|
|
for (int i = 0; i < cachePressedPreviouslyCount; i++)
|
|
if (cachePressedPreviously[i] == key)
|
|
return true;
|
|
return false;
|
|
}
|
|
}
|