diff --git a/Engine b/Engine index b0f8b0d..61e2761 160000 --- a/Engine +++ b/Engine @@ -1 +1 @@ -Subproject commit b0f8b0dad6ec3b5c9b0ebff0bcf535ebf0901e30 +Subproject commit 61e276158001cac85dc5758546fa839e091c0299 diff --git a/Platforms/Desktop/KeyboardInputsBehaviour.cs b/Platforms/Desktop/KeyboardInputsBehaviour.cs index 8d94fdb..7cd1c91 100644 --- a/Platforms/Desktop/KeyboardInputsBehaviour.cs +++ b/Platforms/Desktop/KeyboardInputsBehaviour.cs @@ -10,8 +10,11 @@ namespace Pong.Platforms.Desktop; public class KeyboardInputsBehaviour : Behaviour, IButtonInputs { - private readonly Dictionary.ButtonCallbackEventHandler> OnPressed = new(256); - private readonly Dictionary.ButtonCallbackEventHandler> OnReleased = new(256); + public Event, IButtonInputs.ButtonCallbackArguments> OnAnyButtonPressed { get; } = new(); + public Event, IButtonInputs.ButtonCallbackArguments> OnAnyButtonReleased { get; } = new(); + + private readonly Dictionary, IButtonInputs.ButtonCallbackArguments>> OnPressed = new(256); + private readonly Dictionary, IButtonInputs.ButtonCallbackArguments>> OnReleased = new(256); private int cachePressedCurrentlyCount = 0; private readonly Keys[] cachePressedCurrently = new Keys[256]; @@ -19,41 +22,38 @@ public class KeyboardInputsBehaviour : Behaviour, IButtonInputs private int cachePressedPreviouslyCount = 0; private readonly Keys[] cachePressedPreviously = new Keys[256]; - public event IButtonInputs.ButtonCallbackEventHandler? OnAnyButtonPressed = null; - public event IButtonInputs.ButtonCallbackEventHandler? OnAnyButtonReleased = null; - - public void RegisterOnPress(Keys key, IButtonInputs.ButtonCallbackEventHandler callback) + public void RegisterOnPress(Keys key, Event, IButtonInputs.ButtonCallbackArguments>.EventHandler callback) { - if (OnPressed.TryGetValue(key, out var action)) + if (!OnPressed.TryGetValue(key, out Event, IButtonInputs.ButtonCallbackArguments>? delegateCallback)) { - action += callback; - return; + delegateCallback = new(); + OnPressed.Add(key, delegateCallback); } - OnPressed.Add(key, callback); + delegateCallback.AddListener(callback); } - public void UnregisterOnPress(Keys key, IButtonInputs.ButtonCallbackEventHandler callback) + public void UnregisterOnPress(Keys key, Event, IButtonInputs.ButtonCallbackArguments>.EventHandler callback) { - if (OnPressed.TryGetValue(key, out var action)) - action -= callback; + if (OnPressed.TryGetValue(key, out Event, IButtonInputs.ButtonCallbackArguments>? delegateCallback)) + delegateCallback.RemoveListener(callback); } - public void RegisterOnRelease(Keys key, IButtonInputs.ButtonCallbackEventHandler callback) + public void RegisterOnRelease(Keys key, Event, IButtonInputs.ButtonCallbackArguments>.EventHandler callback) { - if (OnReleased.TryGetValue(key, out var action)) + if (!OnReleased.TryGetValue(key, out Event, IButtonInputs.ButtonCallbackArguments>? delegateCallback)) { - action += callback; - return; + delegateCallback = new(); + OnReleased.Add(key, delegateCallback); } - OnReleased.Add(key, callback); + delegateCallback.AddListener(callback); } - public void UnregisterOnRelease(Keys key, IButtonInputs.ButtonCallbackEventHandler callback) + public void UnregisterOnRelease(Keys key, Event, IButtonInputs.ButtonCallbackArguments>.EventHandler callback) { - if (OnReleased.TryGetValue(key, out var action)) - action -= callback; + if (OnReleased.TryGetValue(key, out Event, IButtonInputs.ButtonCallbackArguments>? delegateCallback)) + delegateCallback.RemoveListener(callback); } protected override void OnUpdate() @@ -66,28 +66,26 @@ public class KeyboardInputsBehaviour : Behaviour, IButtonInputs { Keys currentlyPressedKey = cachePressedCurrently[i]; - if (!OnPressed.TryGetValue(currentlyPressedKey, out var action)) - continue; - if (WasPressed(currentlyPressedKey)) continue; - action.Invoke(this, currentlyPressedKey); - OnAnyButtonPressed?.Invoke(this, currentlyPressedKey); + if (OnPressed.TryGetValue(currentlyPressedKey, out Event, IButtonInputs.ButtonCallbackArguments>? callback)) + callback?.Invoke(this, new(currentlyPressedKey)); + + OnAnyButtonPressed?.Invoke(this, new(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); - OnAnyButtonReleased?.Invoke(this, previouslyPressedKey); + if (OnReleased.TryGetValue(previouslyPressedKey, out Event, IButtonInputs.ButtonCallbackArguments>? callback)) + callback?.Invoke(this, new(previouslyPressedKey)); + + OnAnyButtonReleased?.Invoke(this, new(previouslyPressedKey)); } Array.Copy(cachePressedCurrently, cachePressedPreviously, cachePressedCurrentlyCount); @@ -102,7 +100,7 @@ public class KeyboardInputsBehaviour : Behaviour, IButtonInputs return false; } - public bool WasPressed(Keys key) + private bool WasPressed(Keys key) { for (int i = 0; i < cachePressedPreviouslyCount; i++) if (cachePressedPreviously[i] == key) diff --git a/Shared/Behaviours/BallBehaviour.cs b/Shared/Behaviours/BallBehaviour.cs index 894d1f6..46a77fa 100644 --- a/Shared/Behaviours/BallBehaviour.cs +++ b/Shared/Behaviours/BallBehaviour.cs @@ -19,7 +19,7 @@ public class BallBehaviour : Behaviour2D, IPhysicsUpdate, INetworkEntity, protected override void OnFirstActiveFrame() { - BehaviourController.GetRequiredBehaviour().OnCollisionDetected += OnCollisionDetected; + BehaviourController.GetRequiredBehaviour().OnCollisionDetected.AddListener(OnCollisionDetected); physicsEngine2D = Universe.GetRequiredUniverseObject(); tweenManager = Universe.GetRequiredUniverseObject(); RigidBody = BehaviourController.GetRequiredBehaviour(); diff --git a/Shared/Behaviours/CameraController.cs b/Shared/Behaviours/CameraController.cs index aa7f2f4..37fbd9b 100644 --- a/Shared/Behaviours/CameraController.cs +++ b/Shared/Behaviours/CameraController.cs @@ -41,7 +41,7 @@ public class CameraController : Behaviour cameraBehaviour.Transform.Rotation -= Universe.Time.DeltaTime * 45f; } - private void SwitchToFullScreen(IButtonInputs inputs, Keys keys) + private void SwitchToFullScreen(IButtonInputs sender, IButtonInputs.ButtonCallbackArguments args) { if (cameraBehaviour.Graphics.IsFullScreen) return; @@ -59,7 +59,7 @@ public class CameraController : Behaviour cameraBehaviour.Viewport = cameraBehaviour.Graphics.GraphicsDevice.Viewport; } - private void ResetCamera(IButtonInputs inputs, Keys keys) + private void ResetCamera(IButtonInputs sender, IButtonInputs.ButtonCallbackArguments args) { cameraBehaviour.Zoom = defaultZoomLevel; cameraBehaviour.Transform.LocalPosition = Vector2D.Zero; diff --git a/Shared/Behaviours/MovementBallBehaviour.cs b/Shared/Behaviours/MovementBallBehaviour.cs index d3876fa..c986207 100644 --- a/Shared/Behaviours/MovementBallBehaviour.cs +++ b/Shared/Behaviours/MovementBallBehaviour.cs @@ -16,7 +16,7 @@ public class MovementBallBehaviour : Behaviour2D rigidBody = BehaviourController.GetRequiredBehaviour(); rigidBody.Velocity = StartDirection * Speed; - BehaviourController.GetRequiredBehaviour().OnCollisionDetected += OnCollisionDetected; + BehaviourController.GetRequiredBehaviour().OnCollisionDetected.AddListener(OnCollisionDetected); } protected override void OnUpdate() diff --git a/Shared/Behaviours/PaddleBehaviour.cs b/Shared/Behaviours/PaddleBehaviour.cs index aaf7435..be98468 100644 --- a/Shared/Behaviours/PaddleBehaviour.cs +++ b/Shared/Behaviours/PaddleBehaviour.cs @@ -6,7 +6,6 @@ using Syntriax.Engine.Core; using Syntriax.Engine.Network; using Syntriax.Engine.Physics2D; using Syntriax.Engine.Systems.Input; -using Syntriax.Engine.Systems.Tween; namespace Pong.Behaviours; @@ -57,10 +56,10 @@ public class PaddleBehaviour(Keys Up, Keys Down, float High, float Low, float Sp inputs.UnregisterOnRelease(Down, OnDownReleased); } - private void OnUpPressed(IButtonInputs inputs, Keys keys) { isUpPressed = true; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } - private void OnUpReleased(IButtonInputs inputs, Keys keys) { isUpPressed = false; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } - private void OnDownPressed(IButtonInputs inputs, Keys keys) { isDownPressed = true; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } - private void OnDownReleased(IButtonInputs inputs, Keys keys) { isDownPressed = false; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnUpPressed(IButtonInputs sender, IButtonInputs.ButtonCallbackArguments args) { isUpPressed = true; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnUpReleased(IButtonInputs sender, IButtonInputs.ButtonCallbackArguments args) { isUpPressed = false; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnDownPressed(IButtonInputs sender, IButtonInputs.ButtonCallbackArguments args) { isDownPressed = true; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } + private void OnDownReleased(IButtonInputs sender, IButtonInputs.ButtonCallbackArguments args) { isDownPressed = false; UpdateVelocity(); networkClient?.SendToServer(new PaddleKeyStatePacket(this)); } private void UpdateVelocity() { diff --git a/Shared/Behaviours/WallScoreBehaviour.cs b/Shared/Behaviours/WallScoreBehaviour.cs index 4b4cc9f..bb165b2 100644 --- a/Shared/Behaviours/WallScoreBehaviour.cs +++ b/Shared/Behaviours/WallScoreBehaviour.cs @@ -14,6 +14,6 @@ public class WallScoreBehaviour(Action OnCollision) : Behaviour2D if (!BehaviourController.TryGetBehaviour(out ICollider2D? collider2D)) return; - collider2D.OnCollisionDetected += (_, _1) => OnCollision?.Invoke(); + collider2D.OnCollisionDetected.AddListener((_, _1) => OnCollision?.Invoke()); } } diff --git a/Shared/GamePong.cs b/Shared/GamePong.cs index 8f29f76..f17d2bc 100644 --- a/Shared/GamePong.cs +++ b/Shared/GamePong.cs @@ -48,11 +48,12 @@ public class GamePong : Game { // TODO: Add your initialization logic here universe = new(); - displayableCollector = new(universe); - displayableShapeCollector = new(universe); universe.Initialize(); + displayableCollector = new(universe); + displayableShapeCollector = new(universe); + base.Initialize(); } diff --git a/Shared/Network/LiteNetLib/LiteNetLibServer.cs b/Shared/Network/LiteNetLib/LiteNetLibServer.cs index 5216c35..cfe3516 100644 --- a/Shared/Network/LiteNetLib/LiteNetLibServer.cs +++ b/Shared/Network/LiteNetLib/LiteNetLibServer.cs @@ -60,17 +60,17 @@ public class LiteNetLibServer : LiteNetLibCommunicatorBase, INetworkCommunicator return this; } - private void PollEvents(IUniverse sender, UniverseTime engineTime) => Manager.PollEvents(); + private void PollEvents(IUniverse sender, IUniverse.UpdateArguments args) => Manager.PollEvents(); protected override void OnEnteringUniverse(IUniverse universe) { base.OnEnteringUniverse(universe); - universe.OnPostUpdate += PollEvents; + universe.OnPostUpdate.AddListener(PollEvents); } protected override void OnExitingUniverse(IUniverse universe) { base.OnExitingUniverse(universe); - universe.OnPostUpdate -= PollEvents; + universe.OnPostUpdate.RemoveListener(PollEvents); } } diff --git a/Shared/Network/NetworkManager.cs b/Shared/Network/NetworkManager.cs index 9cee79d..03a4e8f 100644 --- a/Shared/Network/NetworkManager.cs +++ b/Shared/Network/NetworkManager.cs @@ -41,10 +41,9 @@ public class NetworkManager : UniverseObject, INetworkManager { CacheDelegates(); - _networkEntityCollector.OnCollected += OnCollected; - _networkEntityCollector.OnRemoved += OnRemoved; + _networkEntityCollector.OnCollected.AddListener(OnCollected); + _networkEntityCollector.OnRemoved.AddListener(OnRemoved); } - private void CacheDelegates() { // Find network packets implementing INetworkPacket @@ -121,12 +120,14 @@ public class NetworkManager : UniverseObject, INetworkManager serverListenerData.ListenerMethod.Invoke(serverListenerData.Object, [entityDataPacket, fromClientId]); } - private void OnCollected(IBehaviourCollector sender, INetworkEntity behaviourCollected) + private void OnCollected(IBehaviourCollector sender, IBehaviourCollector.BehaviourCollectedArguments args) { - if (!_networkEntities.TryAdd(behaviourCollected.Id, behaviourCollected)) - throw new($"Unable to add {behaviourCollected.Id} to {nameof(NetworkManager)}"); + INetworkEntity collectedBehaviour = args.BehaviourCollected; - foreach (Type clientListenerType in behaviourCollected.GetType().GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketListenerClient<>))) + if (!_networkEntities.TryAdd(collectedBehaviour.Id, collectedBehaviour)) + throw new($"Unable to add {collectedBehaviour.Id} to {nameof(NetworkManager)}"); + + foreach (Type clientListenerType in collectedBehaviour.GetType().GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketListenerClient<>))) { Type clientListenerParameterType = clientListenerType.GetGenericArguments().First(); MethodInfo clientListenerReceiveMethod = clientListenerType.GetMethods().First(m => m.Name == nameof(IPacketListenerClient.OnClientPacketArrived)); @@ -137,10 +138,10 @@ public class NetworkManager : UniverseObject, INetworkManager clientPacketListeners.Add(clientListenerParameterType, clientListeners); } - clientListeners.Add(behaviourCollected.Id, new(behaviourCollected, clientListenerReceiveMethod)); + clientListeners.Add(collectedBehaviour.Id, new(collectedBehaviour, clientListenerReceiveMethod)); } - foreach (Type serverListenerType in behaviourCollected.GetType().GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketListenerServer<>))) + foreach (Type serverListenerType in collectedBehaviour.GetType().GetInterfaces().Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IPacketListenerServer<>))) { Type serverListenerParameterType = serverListenerType.GetGenericArguments().First(); MethodInfo serverListenerReceiveMethod = serverListenerType.GetMethods().First(m => m.Name == nameof(IPacketListenerServer.OnServerPacketArrived)); @@ -151,13 +152,13 @@ public class NetworkManager : UniverseObject, INetworkManager serverPacketListeners.Add(serverListenerParameterType, serverListeners); } - serverListeners.Add(behaviourCollected.Id, new(behaviourCollected, serverListenerReceiveMethod)); + serverListeners.Add(collectedBehaviour.Id, new(collectedBehaviour, serverListenerReceiveMethod)); } } - private void OnRemoved(IBehaviourCollector sender, INetworkEntity behaviourRemoved) + private void OnRemoved(IBehaviourCollector sender, IBehaviourCollector.BehaviourRemovedArguments args) { - _networkEntities.Remove(behaviourRemoved.Id); + _networkEntities.Remove(args.BehaviourRemoved.Id); } protected override void OnExitingUniverse(IUniverse universe) => _networkEntityCollector.Unassign();