using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; using Syntriax.Engine.Core; namespace Syntriax.Engine.Input; public class KeyboardInputsBehaviour : BehaviourOverride, IKeyboardInputs { private IDictionary> OnPressed = new Dictionary>(256); private IDictionary> OnReleased = new Dictionary>(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 callback) { if (OnPressed.TryGetValue(key, out var action)) { action += callback; return; } OnPressed.Add(key, callback); } public void UnregisterOnPress(Keys key, Action callback) { if (OnPressed.TryGetValue(key, out var action)) action -= callback; } public void RegisterOnRelease(Keys key, Action callback) { if (OnReleased.TryGetValue(key, out var action)) { action += callback; return; } OnReleased.Add(key, callback); } public void UnregisterOnRelease(Keys key, Action 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; } }