95 lines
3.1 KiB
C#
95 lines
3.1 KiB
C#
|
using Microsoft.Xna.Framework;
|
|||
|
using Microsoft.Xna.Framework.Input;
|
|||
|
|
|||
|
using Syntriax.Engine.Core;
|
|||
|
|
|||
|
namespace Syntriax.Engine.Input;
|
|||
|
|
|||
|
public class KeyboardInputsBehaviour : BehaviourOverride, IKeyboardInputs
|
|||
|
{
|
|||
|
private IDictionary<Keys, Action<IKeyboardInputs, Keys>> OnPressed = new Dictionary<Keys, Action<IKeyboardInputs, Keys>>(256);
|
|||
|
private IDictionary<Keys, Action<IKeyboardInputs, Keys>> OnReleased = new Dictionary<Keys, Action<IKeyboardInputs, Keys>>(256);
|
|||
|
|
|||
|
private int cachePressedCurrentlyCount = 0;
|
|||
|
private Keys[] cachePressedCurrently = new Keys[256];
|
|||
|
|
|||
|
private int cachePressedPreviouslyCount = 0;
|
|||
|
private Keys[] cachePressedPreviously = new Keys[256];
|
|||
|
|
|||
|
public void RegisterOnPress(Keys key, Action<IKeyboardInputs, Keys> callback)
|
|||
|
{
|
|||
|
if (OnPressed.TryGetValue(key, out var action))
|
|||
|
{
|
|||
|
action += callback;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
OnPressed.Add(key, callback);
|
|||
|
}
|
|||
|
|
|||
|
public void UnregisterOnPress(Keys key, Action<IKeyboardInputs, Keys> callback)
|
|||
|
{
|
|||
|
if (OnPressed.TryGetValue(key, out var action))
|
|||
|
action -= callback;
|
|||
|
}
|
|||
|
|
|||
|
public void RegisterOnRelease(Keys key, Action<IKeyboardInputs, Keys> callback)
|
|||
|
{
|
|||
|
if (OnReleased.TryGetValue(key, out var action))
|
|||
|
{
|
|||
|
action += callback;
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
OnReleased.Add(key, callback);
|
|||
|
}
|
|||
|
|
|||
|
public void UnregisterOnRelease(Keys key, Action<IKeyboardInputs, Keys> callback)
|
|||
|
{
|
|||
|
if (OnReleased.TryGetValue(key, out var action))
|
|||
|
action -= callback;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnUpdate(GameTime time)
|
|||
|
{
|
|||
|
KeyboardState keyboardState = Keyboard.GetState();
|
|||
|
keyboardState.GetPressedKeys(cachePressedCurrently);
|
|||
|
cachePressedCurrentlyCount = keyboardState.GetPressedKeyCount();
|
|||
|
|
|||
|
for (int i = 0; i < cachePressedCurrentlyCount; i++)
|
|||
|
{
|
|||
|
Keys currentlyPressedKey = cachePressedCurrently[i];
|
|||
|
if (!WasPressed(currentlyPressedKey))
|
|||
|
if (OnPressed.TryGetValue(currentlyPressedKey, out var action))
|
|||
|
action.Invoke(this, currentlyPressedKey);
|
|||
|
}
|
|||
|
|
|||
|
for (int i = 0; i < cachePressedPreviouslyCount; i++)
|
|||
|
{
|
|||
|
Keys previouslyPressedKey = cachePressedPreviously[i];
|
|||
|
if (!IsPressed(previouslyPressedKey))
|
|||
|
if (OnReleased.TryGetValue(previouslyPressedKey, out var action))
|
|||
|
action.Invoke(this, 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;
|
|||
|
}
|
|||
|
|
|||
|
public bool WasPressed(Keys key)
|
|||
|
{
|
|||
|
for (int i = 0; i < cachePressedPreviouslyCount; i++)
|
|||
|
if (cachePressedPreviously[i] == key)
|
|||
|
return true;
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|