feat: Networked Keyboard Inputs
This commit is contained in:
		| @@ -1,6 +1,5 @@ | |||||||
| using System; | using System; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
|  |  | ||||||
| using Microsoft.Xna.Framework.Input; | using Microsoft.Xna.Framework.Input; | ||||||
|  |  | ||||||
| using Syntriax.Engine.Core; | using Syntriax.Engine.Core; | ||||||
|   | |||||||
							
								
								
									
										122
									
								
								Game/Behaviours/NetworkedKeyboardInputs.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								Game/Behaviours/NetworkedKeyboardInputs.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | |||||||
|  | using System; | ||||||
|  | using System.Collections.Generic; | ||||||
|  | using LiteNetLib; | ||||||
|  | using Microsoft.Xna.Framework.Input; | ||||||
|  | using Syntriax.Engine.Input; | ||||||
|  | using Syntriax.Engine.Network; | ||||||
|  |  | ||||||
|  | namespace Pong.Behaviours; | ||||||
|  |  | ||||||
|  | public class NetworkedKeyboardInputs : NetworkBehaviour, IButtonInputs<Keys> | ||||||
|  | { | ||||||
|  |     private readonly Dictionary<Keys, Action<IButtonInputs<Keys>, Keys>> OnPressed = new(256); | ||||||
|  |     private readonly Dictionary<Keys, Action<IButtonInputs<Keys>, Keys>> 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, Action<IButtonInputs<Keys>, Keys> callback) | ||||||
|  |     { | ||||||
|  |         if (OnPressed.TryGetValue(key, out var action)) | ||||||
|  |         { | ||||||
|  |             action += callback; | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         OnPressed.Add(key, callback); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void UnregisterOnPress(Keys key, Action<IButtonInputs<Keys>, Keys> callback) | ||||||
|  |     { | ||||||
|  |         if (OnPressed.TryGetValue(key, out var action)) | ||||||
|  |             action -= callback; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void RegisterOnRelease(Keys key, Action<IButtonInputs<Keys>, Keys> callback) | ||||||
|  |     { | ||||||
|  |         if (OnReleased.TryGetValue(key, out var action)) | ||||||
|  |         { | ||||||
|  |             action += callback; | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         OnReleased.Add(key, callback); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public void UnregisterOnRelease(Keys key, Action<IButtonInputs<Keys>, Keys> callback) | ||||||
|  |     { | ||||||
|  |         if (OnReleased.TryGetValue(key, out var action)) | ||||||
|  |             action -= callback; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected override void OnUpdate() | ||||||
|  |     { | ||||||
|  |         if (!IsServer && !LocalAssigned) | ||||||
|  |             return; | ||||||
|  |  | ||||||
|  |         KeyboardState keyboardState = Keyboard.GetState(); | ||||||
|  |         keyboardState.GetPressedKeys(cachePressedCurrently); | ||||||
|  |         cachePressedCurrentlyCount = keyboardState.GetPressedKeyCount(); | ||||||
|  |  | ||||||
|  |         for (int i = 0; i < cachePressedCurrentlyCount; i++) | ||||||
|  |         { | ||||||
|  |             Keys currentlyPressedKey = cachePressedCurrently[i]; | ||||||
|  |  | ||||||
|  |             if (!OnPressed.TryGetValue(currentlyPressedKey, out var action)) | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             if (WasPressed(currentlyPressedKey)) | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             action.Invoke(this, currentlyPressedKey); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         for (int i = 0; i < cachePressedPreviouslyCount; i++) | ||||||
|  |         { | ||||||
|  |             Keys previouslyPressedKey = cachePressedPreviously[i]; | ||||||
|  |  | ||||||
|  |             if (!OnReleased.TryGetValue(previouslyPressedKey, out var action)) | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             if (IsPressed(previouslyPressedKey)) | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             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; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected override void OnMessageReceived(NetPacketReader reader, NetPeer peer) | ||||||
|  |     { | ||||||
|  |         bool isPressed = reader.GetBool(); | ||||||
|  |         Keys key = (Keys)reader.GetInt(); | ||||||
|  |  | ||||||
|  |         if (isPressed) | ||||||
|  |             if (OnPressed.TryGetValue(key, out var action)) | ||||||
|  |                 action.Invoke(this, key); | ||||||
|  |         if (!isPressed) | ||||||
|  |             if (OnReleased.TryGetValue(key, out var action)) | ||||||
|  |                 action.Invoke(this, key); | ||||||
|  |     } | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user