From ef21cdf2138a2f5107a628c0fe970b88bc03dcfd Mon Sep 17 00:00:00 2001 From: Syntriax Date: Mon, 15 Jul 2024 01:13:39 +0300 Subject: [PATCH] refactor: Actions to Delegates --- .../Abstract/Assignable/IAssignable.cs | 6 +++--- .../IAssignableBehaviourController.cs | 6 +++--- .../Abstract/Assignable/IAssignableEntity.cs | 6 +++--- .../Assignable/IAssignableGameManager.cs | 6 +++--- .../Assignable/IAssignableGameObject.cs | 6 +++--- .../Assignable/IAssignableStateEnable.cs | 6 +++--- .../Assignable/IAssignableTransform.cs | 6 +++--- Engine.Core/Abstract/BaseEntity.cs | 10 ++++----- Engine.Core/Abstract/IBehaviour.cs | 6 +++--- Engine.Core/Abstract/IBehaviourController.cs | 18 ++++++++++------ Engine.Core/Abstract/IEntity.cs | 6 +++--- Engine.Core/Abstract/IGameManager.cs | 8 ++++--- Engine.Core/Abstract/IGameObject.cs | 6 +++--- Engine.Core/Abstract/IInitialize.cs | 9 ++++---- Engine.Core/Abstract/INameable.cs | 6 +++--- Engine.Core/Abstract/IStateEnable.cs | 6 +++--- Engine.Core/Abstract/ITransform.cs | 19 +++++++++++------ Engine.Core/Behaviour.cs | 10 ++++----- Engine.Core/BehaviourCollector.cs | 12 +++++++---- Engine.Core/BehaviourController.cs | 21 ++++++++++--------- Engine.Core/GameManager.cs | 4 ++-- Engine.Core/GameObject.cs | 16 +++++++------- Engine.Core/StateEnable.cs | 11 +++++----- Engine.Core/Transform.cs | 21 +++++++++---------- Engine.Physics2D/Abstract/ICollider2D.cs | 16 +++++++++----- Engine.Physics2D/Collider2DBehaviourBase.cs | 14 +++++++------ Engine.Physics2D/CollisionResolver2D.cs | 4 ++-- Engine.Physics2D/PhysicsEngine2D.cs | 8 +++---- Engine.Physics2D/PhysicsEngine2DCollector.cs | 14 ++++++------- Engine.Physics2D/RigidBody2D.cs | 4 +--- 30 files changed, 157 insertions(+), 134 deletions(-) diff --git a/Engine.Core/Abstract/Assignable/IAssignable.cs b/Engine.Core/Abstract/Assignable/IAssignable.cs index d238e51..a7be526 100644 --- a/Engine.Core/Abstract/Assignable/IAssignable.cs +++ b/Engine.Core/Abstract/Assignable/IAssignable.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,7 +8,7 @@ public interface IAssignable /// /// Event triggered when the 's fields are unassigned and completely ready to recycle. /// - Action? OnUnassigned { get; set; } + event OnUnassignedDelegate? OnUnassigned; /// /// Unassign 's all fields and make it ready to recycle. @@ -19,4 +17,6 @@ public interface IAssignable /// , if the fields are unsigned successfully, if not. /// bool Unassign(); + + delegate void OnUnassignedDelegate(IAssignable sender); } diff --git a/Engine.Core/Abstract/Assignable/IAssignableBehaviourController.cs b/Engine.Core/Abstract/Assignable/IAssignableBehaviourController.cs index 7e31a50..7c58146 100644 --- a/Engine.Core/Abstract/Assignable/IAssignableBehaviourController.cs +++ b/Engine.Core/Abstract/Assignable/IAssignableBehaviourController.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,7 +8,7 @@ public interface IAssignableBehaviourController : IAssignable /// /// Event triggered when the value has has been assigned a new value. /// - Action? OnBehaviourControllerAssigned { get; set; } + event OnBehaviourControllerAssignedDelegate? OnBehaviourControllerAssigned; /// IBehaviourController BehaviourController { get; } @@ -23,4 +21,6 @@ public interface IAssignableBehaviourController : IAssignable /// , if the value given assigned successfully assigned, if not. /// bool Assign(IBehaviourController behaviourController); + + delegate void OnBehaviourControllerAssignedDelegate(IAssignableBehaviourController sender); } diff --git a/Engine.Core/Abstract/Assignable/IAssignableEntity.cs b/Engine.Core/Abstract/Assignable/IAssignableEntity.cs index 7fdf229..b6a472a 100644 --- a/Engine.Core/Abstract/Assignable/IAssignableEntity.cs +++ b/Engine.Core/Abstract/Assignable/IAssignableEntity.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,7 +8,7 @@ public interface IAssignableEntity : IAssignable /// /// Event triggered when the value has has been assigned a new value. /// - Action? OnEntityAssigned { get; set; } + event OnEntityAssignedDelegate? OnEntityAssigned; /// IEntity Entity { get; } @@ -23,4 +21,6 @@ public interface IAssignableEntity : IAssignable /// , if the value given assigned successfully assigned, if not. /// bool Assign(IEntity entity); + + delegate void OnEntityAssignedDelegate(IAssignableEntity sender); } diff --git a/Engine.Core/Abstract/Assignable/IAssignableGameManager.cs b/Engine.Core/Abstract/Assignable/IAssignableGameManager.cs index 763cab7..ebd21cc 100644 --- a/Engine.Core/Abstract/Assignable/IAssignableGameManager.cs +++ b/Engine.Core/Abstract/Assignable/IAssignableGameManager.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,7 +8,7 @@ public interface IAssignableGameManager : IAssignable /// /// Event triggered when the value has has been assigned a new value. /// - Action? OnGameManagerAssigned { get; set; } + event OnGameManagerAssignedDelegate? OnGameManagerAssigned; /// IGameManager GameManager { get; } @@ -23,4 +21,6 @@ public interface IAssignableGameManager : IAssignable /// , if the value given assigned successfully assigned, if not. /// bool Assign(IGameManager gameManager); + + delegate void OnGameManagerAssignedDelegate(IAssignableGameManager sender); } diff --git a/Engine.Core/Abstract/Assignable/IAssignableGameObject.cs b/Engine.Core/Abstract/Assignable/IAssignableGameObject.cs index 9f3b80d..b6c30f6 100644 --- a/Engine.Core/Abstract/Assignable/IAssignableGameObject.cs +++ b/Engine.Core/Abstract/Assignable/IAssignableGameObject.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,7 +8,7 @@ public interface IAssignableGameObject : IAssignable /// /// Event triggered when the value has has been assigned a new value. /// - Action? OnGameObjectAssigned { get; set; } + event OnGameObjectAssignedDelegate? OnGameObjectAssigned; /// IGameObject GameObject { get; } @@ -23,4 +21,6 @@ public interface IAssignableGameObject : IAssignable /// , if the value given assigned successfully assigned, if not. /// bool Assign(IGameObject gameObject); + + delegate void OnGameObjectAssignedDelegate(IAssignableGameObject sender); } diff --git a/Engine.Core/Abstract/Assignable/IAssignableStateEnable.cs b/Engine.Core/Abstract/Assignable/IAssignableStateEnable.cs index ac56b14..32cc090 100644 --- a/Engine.Core/Abstract/Assignable/IAssignableStateEnable.cs +++ b/Engine.Core/Abstract/Assignable/IAssignableStateEnable.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,7 +8,7 @@ public interface IAssignableStateEnable : IAssignable /// /// Event triggered when the value has has been assigned a new value. /// - Action? OnStateEnableAssigned { get; set; } + event OnStateEnableAssignedDelegate? OnStateEnableAssigned; /// IStateEnable StateEnable { get; } @@ -23,4 +21,6 @@ public interface IAssignableStateEnable : IAssignable /// , if the value given assigned successfully assigned, if not. /// bool Assign(IStateEnable stateEnable); + + delegate void OnStateEnableAssignedDelegate(IAssignableStateEnable sender); } diff --git a/Engine.Core/Abstract/Assignable/IAssignableTransform.cs b/Engine.Core/Abstract/Assignable/IAssignableTransform.cs index 5b8c39b..a769408 100644 --- a/Engine.Core/Abstract/Assignable/IAssignableTransform.cs +++ b/Engine.Core/Abstract/Assignable/IAssignableTransform.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,7 +8,7 @@ public interface IAssignableTransform : IAssignable /// /// Event triggered when the value has has been assigned a new value. /// - Action? OnTransformAssigned { get; set; } + event OnTransformAssignedDelegate? OnTransformAssigned; /// ITransform Transform { get; } @@ -23,4 +21,6 @@ public interface IAssignableTransform : IAssignable /// , if the value given assigned successfully assigned, if not. /// bool Assign(ITransform transform); + + delegate void OnTransformAssignedDelegate(IAssignableTransform sender); } diff --git a/Engine.Core/Abstract/BaseEntity.cs b/Engine.Core/Abstract/BaseEntity.cs index b1c30a1..0bcf7ae 100644 --- a/Engine.Core/Abstract/BaseEntity.cs +++ b/Engine.Core/Abstract/BaseEntity.cs @@ -4,13 +4,13 @@ namespace Syntriax.Engine.Core.Abstract; public abstract class BaseEntity : IEntity { - public Action? OnIdChanged { get; set; } = null; + public event IEntity.OnIdChangedDelegate? OnIdChanged = null; - public Action? OnUnassigned { get; set; } = null; - public Action? OnStateEnableAssigned { get; set; } = null; + public event IInitialize.OnInitializedDelegate? OnInitialized = null; + public event IInitialize.OnFinalizedDelegate? OnFinalized = null; - public Action? OnInitialized { get; set; } = null; - public Action? OnFinalized { get; set; } = null; + public event IAssignableStateEnable.OnStateEnableAssignedDelegate? OnStateEnableAssigned = null; + public event IAssignable.OnUnassignedDelegate? OnUnassigned = null; private IStateEnable _stateEnable = null!; diff --git a/Engine.Core/Abstract/IBehaviour.cs b/Engine.Core/Abstract/IBehaviour.cs index f113694..c0cf599 100644 --- a/Engine.Core/Abstract/IBehaviour.cs +++ b/Engine.Core/Abstract/IBehaviour.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,7 +8,7 @@ public interface IBehaviour : IEntity, IAssignableBehaviourController, IAssignab /// /// Event triggered when the priority of the changes. /// - Action? OnPriorityChanged { get; set; } + event OnPriorityChangedDelegate? OnPriorityChanged; /// /// The priority of the . @@ -21,4 +19,6 @@ public interface IBehaviour : IEntity, IAssignableBehaviourController, IAssignab /// The value indicating whether the is active. /// bool IsActive { get; } + + delegate void OnPriorityChangedDelegate(IBehaviour sender, int previousPriority); } diff --git a/Engine.Core/Abstract/IBehaviourController.cs b/Engine.Core/Abstract/IBehaviourController.cs index a9c560a..9c4bc1f 100644 --- a/Engine.Core/Abstract/IBehaviourController.cs +++ b/Engine.Core/Abstract/IBehaviourController.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; @@ -12,27 +11,27 @@ public interface IBehaviourController : IAssignableGameObject, IEnumerable /// Event triggered before the update of s. /// - Action? OnPreUpdate { get; set; } + event OnPreUpdateDelegate? OnPreUpdate; /// /// Event triggered during the update of s. /// - Action? OnUpdate { get; set; } + event OnUpdateDelegate? OnUpdate; /// /// Event triggered before the drawing phase. /// - Action? OnPreDraw { get; set; } + event OnPreDrawDelegate? OnPreDraw; /// /// Event triggered when a is added to the . /// - Action? OnBehaviourAdded { get; set; } + event OnBehaviourAddedDelegate? OnBehaviourAdded; /// /// Event triggered when a is removed from the . /// - Action? OnBehaviourRemoved { get; set; } + event OnBehaviourRemovedDelegate? OnBehaviourRemoved; /// /// Adds a to the . @@ -102,4 +101,11 @@ public interface IBehaviourController : IAssignableGameObject, IEnumerable void UpdatePreDraw(); + + delegate void OnPreUpdateDelegate(IBehaviourController sender); + delegate void OnUpdateDelegate(IBehaviourController sender); + delegate void OnPreDrawDelegate(IBehaviourController sender); + delegate void OnBehaviourAddedDelegate(IBehaviourController sender, IBehaviour behaviourAdded); + delegate void OnBehaviourRemovedDelegate(IBehaviourController sender, IBehaviour behaviourRemoved); + } diff --git a/Engine.Core/Abstract/IEntity.cs b/Engine.Core/Abstract/IEntity.cs index 11a824d..640dd6e 100644 --- a/Engine.Core/Abstract/IEntity.cs +++ b/Engine.Core/Abstract/IEntity.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -11,10 +9,12 @@ public interface IEntity : IInitialize, IAssignableStateEnable /// Event triggered when the of the changes. /// The string action parameter is the previous of the . /// - Action? OnIdChanged { get; set; } + event OnIdChangedDelegate? OnIdChanged; /// /// The ID of the . /// string Id { get; set; } + + delegate void OnIdChangedDelegate(IEntity sender, string previousId); } diff --git a/Engine.Core/Abstract/IGameManager.cs b/Engine.Core/Abstract/IGameManager.cs index 35a2755..9835dfb 100644 --- a/Engine.Core/Abstract/IGameManager.cs +++ b/Engine.Core/Abstract/IGameManager.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; namespace Syntriax.Engine.Core.Abstract; @@ -11,12 +10,12 @@ public interface IGameManager : IEntity, IEnumerable /// /// Event triggered when a is registered to the . /// - Action? OnGameObjectRegistered { get; set; } + event OnGameObjectRegisteredDelegate? OnGameObjectRegistered; /// /// Event triggered when a is unregistered from the . /// - Action? OnGameObjectUnRegistered { get; set; } + event OnGameObjectUnRegisteredDelegate? OnGameObjectUnRegistered; /// /// Gets a read-only list of s managed by the . @@ -54,4 +53,7 @@ public interface IGameManager : IEntity, IEnumerable /// Performs operations that should be done before the draw calls. /// void PreDraw(); + + delegate void OnGameObjectRegisteredDelegate(IGameManager sender, IGameObject gameObjectRegistered); + delegate void OnGameObjectUnRegisteredDelegate(IGameManager sender, IGameObject gameObjectUnregistered); } diff --git a/Engine.Core/Abstract/IGameObject.cs b/Engine.Core/Abstract/IGameObject.cs index f01de33..971f3a8 100644 --- a/Engine.Core/Abstract/IGameObject.cs +++ b/Engine.Core/Abstract/IGameObject.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,10 +8,12 @@ public interface IGameObject : IEntity, IAssignableGameManager, IAssignableTrans /// /// Event triggered when the method is called. /// - Action? OnUpdated { get; set; } + event OnUpdatedDelegate? OnUpdated; /// /// Updates the game object. /// void Update(); + + delegate void OnUpdatedDelegate(IGameObject sender); } diff --git a/Engine.Core/Abstract/IInitialize.cs b/Engine.Core/Abstract/IInitialize.cs index 8ba8b26..c0473c5 100644 --- a/Engine.Core/Abstract/IInitialize.cs +++ b/Engine.Core/Abstract/IInitialize.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,12 +8,12 @@ public interface IInitialize /// /// Event triggered when the method is called successfully. /// - Action? OnInitialized { get; set; } + event OnInitializedDelegate? OnInitialized; /// /// Event triggered when the method is called successfully. /// - Action? OnFinalized { get; set; } + event OnFinalizedDelegate? OnFinalized; /// /// The value indicating whether the entity has been initialized. @@ -33,4 +31,7 @@ public interface IInitialize /// /// if finalization is successful, otherwise . bool Finalize(); + + delegate void OnInitializedDelegate(IInitialize sender); + delegate void OnFinalizedDelegate(IInitialize sender); } diff --git a/Engine.Core/Abstract/INameable.cs b/Engine.Core/Abstract/INameable.cs index df585c5..2405b0d 100644 --- a/Engine.Core/Abstract/INameable.cs +++ b/Engine.Core/Abstract/INameable.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,10 +8,12 @@ public interface INameable /// /// Event triggered when the name of the entity changes. /// - Action? OnNameChanged { get; set; } + event OnNameChangedDelegate? OnNameChanged; /// /// The name of the entity. /// string Name { get; set; } + + delegate void OnNameChangedDelegate(INameable sender, string previousName); } diff --git a/Engine.Core/Abstract/IStateEnable.cs b/Engine.Core/Abstract/IStateEnable.cs index cfa6f45..3de5a0c 100644 --- a/Engine.Core/Abstract/IStateEnable.cs +++ b/Engine.Core/Abstract/IStateEnable.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core.Abstract; /// @@ -10,10 +8,12 @@ public interface IStateEnable : IAssignableEntity /// /// Event triggered when the state of the changes. /// - Action? OnEnabledChanged { get; set; } + event OnNameChangedDelegate? OnEnabledChanged; /// /// The value indicating whether the is enabled. /// bool Enabled { get; set; } + + delegate void OnNameChangedDelegate(IStateEnable sender, bool previousState); } diff --git a/Engine.Core/Abstract/ITransform.cs b/Engine.Core/Abstract/ITransform.cs index a64522b..8511f34 100644 --- a/Engine.Core/Abstract/ITransform.cs +++ b/Engine.Core/Abstract/ITransform.cs @@ -11,32 +11,32 @@ public interface ITransform : IAssignableGameObject, IEnumerable /// /// Event triggered when the of the changes. /// - Action? OnPositionChanged { get; set; } + event OnPositionChangedDelegate? OnPositionChanged; /// /// Event triggered when the of the changes. /// - Action? OnScaleChanged { get; set; } + event OnScaleChangedDelegate? OnScaleChanged; /// /// Event triggered when the of the changes. /// - Action? OnRotationChanged { get; set; } + event OnRotationChangedDelegate? OnRotationChanged; /// /// Event triggered when the of the changes. The second parameter is the old . /// - Action? OnParentChanged { get; set; } + event OnParentChangedDelegate? OnParentChanged; /// /// Event triggered when a new is added to the . /// - Action? OnChildrenAdded { get; set; } + event OnChildrenAddedDelegate? OnChildrenAdded; /// /// Event triggered when an is removed from the . /// - Action? OnChildrenRemoved { get; set; } + event OnChildrenRemovedDelegate? OnChildrenRemoved; /// /// The world position of the in 2D space. @@ -95,4 +95,11 @@ public interface ITransform : IAssignableGameObject, IEnumerable /// /// The child to remove. void RemoveChild(ITransform transform); + + delegate void OnPositionChangedDelegate(ITransform sender); + delegate void OnScaleChangedDelegate(ITransform sender); + delegate void OnRotationChangedDelegate(ITransform sender); + delegate void OnParentChangedDelegate(ITransform sender, ITransform? newParent); + delegate void OnChildrenAddedDelegate(ITransform sender, ITransform childrenAdded); + delegate void OnChildrenRemovedDelegate(ITransform sender, ITransform childrenRemoved); } diff --git a/Engine.Core/Behaviour.cs b/Engine.Core/Behaviour.cs index 12376a8..4bbe173 100644 --- a/Engine.Core/Behaviour.cs +++ b/Engine.Core/Behaviour.cs @@ -1,5 +1,3 @@ -using System; - using Syntriax.Engine.Core.Abstract; using Syntriax.Engine.Core.Exceptions; @@ -8,15 +6,16 @@ namespace Syntriax.Engine.Core; [System.Diagnostics.DebuggerDisplay("{GetType().Name, nq}, Priority: {Priority}, Initialized: {Initialized}")] public abstract class Behaviour : BaseEntity, IBehaviour { - public Action? OnBehaviourControllerAssigned { get; set; } = null; + public event IAssignableBehaviourController.OnBehaviourControllerAssignedDelegate? OnBehaviourControllerAssigned = null; - public Action? OnPriorityChanged { get; set; } = null; + public event IBehaviour.OnPriorityChangedDelegate? OnPriorityChanged = null; private IBehaviourController _behaviourController = null!; private int _priority = 0; + public IBehaviourController BehaviourController => _behaviourController; public override bool IsActive => base.IsActive && BehaviourController.GameObject.StateEnable.Enabled; @@ -29,8 +28,9 @@ public abstract class Behaviour : BaseEntity, IBehaviour if (value == _priority) return; + int previousPriority = _priority; _priority = value; - OnPriorityChanged?.Invoke(this); + OnPriorityChanged?.Invoke(this, previousPriority); } } diff --git a/Engine.Core/BehaviourCollector.cs b/Engine.Core/BehaviourCollector.cs index 597ba73..512b0cc 100644 --- a/Engine.Core/BehaviourCollector.cs +++ b/Engine.Core/BehaviourCollector.cs @@ -8,11 +8,11 @@ namespace Syntriax.Engine.Core; public class BehaviourCollector : IAssignableGameManager, IEnumerable { - public Action? OnUnassigned { get; set; } = null; - public Action? OnGameManagerAssigned { get; set; } = null; + public event IAssignable.OnUnassignedDelegate? OnUnassigned = null; + public event IAssignableGameManager.OnGameManagerAssignedDelegate? OnGameManagerAssigned = null; - public Action, T>? OnCollected { get; set; } = null; - public Action, T>? OnRemoved { get; set; } = null; + public event OnCollectedDelegate? OnCollected = null; + public event OnRemovedDelegate? OnRemoved = null; private readonly List _behaviours = new(32); @@ -99,4 +99,8 @@ public class BehaviourCollector : IAssignableGameManager, IEnumerable public IEnumerator GetEnumerator() => _behaviours.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => _behaviours.GetEnumerator(); + + + public delegate void OnCollectedDelegate(BehaviourCollector sender, T behaviourCollected); + public delegate void OnRemovedDelegate(BehaviourCollector sender, T behaviourRemoved); } diff --git a/Engine.Core/BehaviourController.cs b/Engine.Core/BehaviourController.cs index 887b9f2..efda6d7 100644 --- a/Engine.Core/BehaviourController.cs +++ b/Engine.Core/BehaviourController.cs @@ -11,14 +11,14 @@ namespace Syntriax.Engine.Core; [System.Diagnostics.DebuggerDisplay("Behaviour Count: {behaviours.Count}")] public class BehaviourController : IBehaviourController { - public Action? OnPreUpdate { get; set; } - public Action? OnUpdate { get; set; } = null; - public Action? OnPreDraw { get; set; } = null; + public event IBehaviourController.OnPreUpdateDelegate? OnPreUpdate = null; + public event IBehaviourController.OnUpdateDelegate? OnUpdate = null; + public event IBehaviourController.OnPreDrawDelegate? OnPreDraw = null; - public Action? OnBehaviourAdded { get; set; } = null; - public Action? OnBehaviourRemoved { get; set; } = null; - public Action? OnUnassigned { get; set; } = null; - public Action? OnGameObjectAssigned { get; set; } = null; + public event IBehaviourController.OnBehaviourAddedDelegate? OnBehaviourAdded = null; + public event IBehaviourController.OnBehaviourRemovedDelegate? OnBehaviourRemoved = null; + public event IAssignable.OnUnassignedDelegate? OnUnassigned; + public event IAssignableGameObject.OnGameObjectAssignedDelegate? OnGameObjectAssigned = null; private readonly IList behaviours = new List(Constants.BEHAVIOURS_SIZE_INITIAL); @@ -165,10 +165,11 @@ public class BehaviourController : IBehaviourController behaviours.Add(behaviour); } - private void OnPriorityChange(IBehaviour behaviour) + + private void OnPriorityChange(IBehaviour sender, int previousPriority) { - behaviours.Remove(behaviour); - InsertBehaviourByPriority(behaviour); + behaviours.Remove(sender); + InsertBehaviourByPriority(sender); } public IEnumerator GetEnumerator() => behaviours.GetEnumerator(); diff --git a/Engine.Core/GameManager.cs b/Engine.Core/GameManager.cs index cd0ad07..811abd0 100644 --- a/Engine.Core/GameManager.cs +++ b/Engine.Core/GameManager.cs @@ -11,8 +11,8 @@ namespace Syntriax.Engine.Core; [System.Diagnostics.DebuggerDisplay("GameObject Count: {_gameObjects.Count}")] public class GameManager : BaseEntity, IGameManager { - public Action? OnGameObjectRegistered { get; set; } = null; - public Action? OnGameObjectUnRegistered { get; set; } = null; + public event IGameManager.OnGameObjectRegisteredDelegate? OnGameObjectRegistered = null; + public event IGameManager.OnGameObjectUnRegisteredDelegate? OnGameObjectUnRegistered = null; private readonly List _gameObjects = new(Constants.GAME_OBJECTS_SIZE_INITIAL); diff --git a/Engine.Core/GameObject.cs b/Engine.Core/GameObject.cs index 8efb2fb..b3e237a 100644 --- a/Engine.Core/GameObject.cs +++ b/Engine.Core/GameObject.cs @@ -1,5 +1,3 @@ -using System; - using Syntriax.Engine.Core.Abstract; using Syntriax.Engine.Core.Exceptions; @@ -8,13 +6,13 @@ namespace Syntriax.Engine.Core; [System.Diagnostics.DebuggerDisplay("Name: {Name}, Initialized: {Initialized}")] public class GameObject : BaseEntity, IGameObject { - public Action? OnTransformAssigned { get; set; } = null; - public Action? OnBehaviourControllerAssigned { get; set; } = null; - public Action? OnGameManagerAssigned { get; set; } = null; + public event IAssignableTransform.OnTransformAssignedDelegate? OnTransformAssigned = null; + public event IAssignableGameManager.OnGameManagerAssignedDelegate? OnGameManagerAssigned = null; + public event IAssignableBehaviourController.OnBehaviourControllerAssignedDelegate? OnBehaviourControllerAssigned = null; - public Action? OnNameChanged { get; set; } = null; + public event INameable.OnNameChangedDelegate? OnNameChanged = null; - public Action? OnUpdated { get; set; } = null; + public event IGameObject.OnUpdatedDelegate? OnUpdated = null; private ITransform _transform = null!; @@ -35,8 +33,9 @@ public class GameObject : BaseEntity, IGameObject { if (value == _name) return; + string previousName = _name; _name = value; - OnNameChanged?.Invoke(this); + OnNameChanged?.Invoke(this, previousName); } } @@ -107,6 +106,7 @@ public class GameObject : BaseEntity, IGameObject } public GameObject() { OnBehaviourControllerAssigned += ConnectBehaviourController; } + private void ConnectBehaviourController(IAssignableBehaviourController controller) { controller.BehaviourController.OnBehaviourAdded += OnBehaviourAdded; diff --git a/Engine.Core/StateEnable.cs b/Engine.Core/StateEnable.cs index 70256ca..a934ef7 100644 --- a/Engine.Core/StateEnable.cs +++ b/Engine.Core/StateEnable.cs @@ -1,14 +1,12 @@ -using System; - using Syntriax.Engine.Core.Abstract; namespace Syntriax.Engine.Core; public class StateEnable : IStateEnable { - public Action? OnUnassigned { get; set; } = null; - public Action? OnEntityAssigned { get; set; } = null; - public Action? OnEnabledChanged { get; set; } = null; + public event IAssignable.OnUnassignedDelegate? OnUnassigned = null; + public event IAssignableEntity.OnEntityAssignedDelegate? OnEntityAssigned = null; + public event IStateEnable.OnNameChangedDelegate? OnEnabledChanged = null; private bool _enabled = true; private IEntity _entity = null!; @@ -23,8 +21,9 @@ public class StateEnable : IStateEnable if (value == _enabled) return; + bool previousState = _enabled; _enabled = value; - OnEnabledChanged?.Invoke(this); + OnEnabledChanged?.Invoke(this, previousState); } } diff --git a/Engine.Core/Transform.cs b/Engine.Core/Transform.cs index fff0636..30b33aa 100644 --- a/Engine.Core/Transform.cs +++ b/Engine.Core/Transform.cs @@ -1,4 +1,3 @@ -using System; using System.Collections; using System.Collections.Generic; @@ -9,17 +8,17 @@ namespace Syntriax.Engine.Core; [System.Diagnostics.DebuggerDisplay("Name: {GameObject.Name, nq} Position: {Position.ToString(), nq}, Scale: {Scale.ToString(), nq}, Rotation: {Rotation}")] public class Transform : ITransform { - public Action? OnGameObjectAssigned { get; set; } = null; + public event IAssignableGameObject.OnGameObjectAssignedDelegate? OnGameObjectAssigned = null; - public Action? OnUnassigned { get; set; } = null; + public event IAssignable.OnUnassignedDelegate? OnUnassigned = null; - public Action? OnPositionChanged { get; set; } = null; - public Action? OnScaleChanged { get; set; } = null; - public Action? OnRotationChanged { get; set; } = null; + public event ITransform.OnPositionChangedDelegate? OnPositionChanged = null; + public event ITransform.OnScaleChangedDelegate? OnScaleChanged = null; + public event ITransform.OnRotationChangedDelegate? OnRotationChanged = null; - public Action? OnParentChanged { get; set; } = null; - public Action? OnChildrenAdded { get; set; } = null; - public Action? OnChildrenRemoved { get; set; } = null; + public event ITransform.OnParentChangedDelegate? OnParentChanged = null; + public event ITransform.OnChildrenAddedDelegate? OnChildrenAdded = null; + public event ITransform.OnChildrenRemovedDelegate? OnChildrenRemoved = null; private Vector2D _position = Vector2D.Zero; @@ -180,8 +179,8 @@ public class Transform : ITransform { // TODO No idea how logical this is to propagate this to the children the way I'm doing right now. // I was originally gonna just call `child.OnParentChanged?.Invoke(child, child.Parent);` but seems an unnecessary call too? - foreach (var child in Children) - child.OnParentChanged?.Invoke(transform, previousParent); + foreach (var child in Children) // TODO CHECK ERRORS + child.SetParent(this); } private void RecalculatePosition(ITransform _) diff --git a/Engine.Physics2D/Abstract/ICollider2D.cs b/Engine.Physics2D/Abstract/ICollider2D.cs index 8663860..d989f0e 100644 --- a/Engine.Physics2D/Abstract/ICollider2D.cs +++ b/Engine.Physics2D/Abstract/ICollider2D.cs @@ -1,5 +1,3 @@ -using System; - using Syntriax.Engine.Core.Abstract; namespace Syntriax.Engine.Physics2D.Abstract; @@ -12,17 +10,17 @@ public interface ICollider2D : IBehaviour, IAssignableTransform /// /// Event triggered when a collision is detected. /// - Action? OnCollisionDetected { get; set; } + event OnCollisionDetectedDelegate? OnCollisionDetected; /// /// Event triggered when a collision is resolved. /// - Action? OnCollisionResolved { get; set; } + event OnCollisionResolvedDelegate? OnCollisionResolved; /// /// Event triggered when another triggers this . /// - Action? OnTriggered { get; set; } + event OnTriggeredDelegate? OnTriggered; /// /// The associated with the . @@ -38,4 +36,12 @@ public interface ICollider2D : IBehaviour, IAssignableTransform /// Recalculates properties. /// void Recalculate(); + + void Detect(CollisionDetectionInformation collisionDetectionInformation); + void Resolve(CollisionDetectionInformation collisionDetectionInformation); + void Trigger(ICollider2D initiator); + + delegate void OnCollisionDetectedDelegate(ICollider2D sender, CollisionDetectionInformation collisionDetectionInformation); + delegate void OnCollisionResolvedDelegate(ICollider2D sender, CollisionDetectionInformation collisionDetectionInformation); + delegate void OnTriggeredDelegate(ICollider2D sender, ICollider2D initiatorCollider); } diff --git a/Engine.Physics2D/Collider2DBehaviourBase.cs b/Engine.Physics2D/Collider2DBehaviourBase.cs index 3912812..64a69cd 100644 --- a/Engine.Physics2D/Collider2DBehaviourBase.cs +++ b/Engine.Physics2D/Collider2DBehaviourBase.cs @@ -1,5 +1,3 @@ -using System; - using Syntriax.Engine.Core; using Syntriax.Engine.Core.Abstract; using Syntriax.Engine.Physics2D.Abstract; @@ -8,9 +6,9 @@ namespace Syntriax.Engine.Physics2D; public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D { - public Action? OnCollisionDetected { get; set; } = null; - public Action? OnCollisionResolved { get; set; } = null; - public Action? OnTriggered { get; set; } = null; + public event ICollider2D.OnCollisionDetectedDelegate? OnCollisionDetected = null; + public event ICollider2D.OnCollisionResolvedDelegate? OnCollisionResolved = null; + public event ICollider2D.OnTriggeredDelegate? OnTriggered = null; protected bool NeedsRecalculation { get; private set; } = true; @@ -20,7 +18,7 @@ public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D public bool IsTrigger { get; set; } = false; ITransform IAssignableTransform.Transform => Transform; - Action? IAssignableTransform.OnTransformAssigned { get => GameObject.OnTransformAssigned; set => GameObject.OnTransformAssigned = value; } + public event IAssignableTransform.OnTransformAssignedDelegate? OnTransformAssigned { add => GameObject.OnTransformAssigned += value; remove => GameObject.OnTransformAssigned -= value; } bool IAssignableTransform.Assign(ITransform transform) => GameObject.Assign(transform); @@ -76,4 +74,8 @@ public abstract class Collider2DBehaviourBase : BehaviourOverride, ICollider2D Transform.OnPositionChanged -= SetNeedsRecalculation; Transform.OnRotationChanged -= SetNeedsRecalculation; } + + public void Detect(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionDetected?.Invoke(this, collisionDetectionInformation); + public void Resolve(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionResolved?.Invoke(this, collisionDetectionInformation); + public void Trigger(ICollider2D initiator) => OnTriggered?.Invoke(this, initiator); } diff --git a/Engine.Physics2D/CollisionResolver2D.cs b/Engine.Physics2D/CollisionResolver2D.cs index 4cb6c04..a55b7d5 100644 --- a/Engine.Physics2D/CollisionResolver2D.cs +++ b/Engine.Physics2D/CollisionResolver2D.cs @@ -38,7 +38,7 @@ public class CollisionResolver2D : ICollisionResolver2D left.Recalculate(); right.Recalculate(); - left.OnCollisionResolved?.Invoke(collisionInformation.Left, collisionInformation); - right.OnCollisionResolved?.Invoke(right, collisionInformation); + left.Resolve(collisionInformation); + right.Resolve(collisionInformation); } } diff --git a/Engine.Physics2D/PhysicsEngine2D.cs b/Engine.Physics2D/PhysicsEngine2D.cs index 9b5332f..e333cbe 100644 --- a/Engine.Physics2D/PhysicsEngine2D.cs +++ b/Engine.Physics2D/PhysicsEngine2D.cs @@ -80,17 +80,17 @@ public class PhysicsEngine2D : IPhysicsEngine2D { if (colliderX.IsTrigger) { - colliderX.OnTriggered?.Invoke(colliderX, colliderY); + colliderX.Trigger(colliderY); continue; } else if (colliderY.IsTrigger) { - colliderY.OnTriggered?.Invoke(colliderY, colliderY); + colliderY.Trigger(colliderY); continue; } - colliderX.OnCollisionDetected?.Invoke(colliderX, information); - colliderY.OnCollisionDetected?.Invoke(colliderY, information); + colliderX.Detect(information); + colliderY.Detect(information); collisionResolver?.Resolve(information); } diff --git a/Engine.Physics2D/PhysicsEngine2DCollector.cs b/Engine.Physics2D/PhysicsEngine2DCollector.cs index fbab5c7..0cc60ab 100644 --- a/Engine.Physics2D/PhysicsEngine2DCollector.cs +++ b/Engine.Physics2D/PhysicsEngine2DCollector.cs @@ -1,5 +1,3 @@ -using System; - using Syntriax.Engine.Core; using Syntriax.Engine.Core.Abstract; using Syntriax.Engine.Physics2D.Abstract; @@ -8,8 +6,8 @@ namespace Syntriax.Engine.Physics2D; public class PhysicsEngine2DCollector : IPhysicsEngine2D, IAssignableGameManager { - public Action? OnUnassigned { get; set; } = null; - public Action? OnGameManagerAssigned { get; set; } = null; + public event IAssignable.OnUnassignedDelegate? OnUnassigned = null; + public event IAssignableGameManager.OnGameManagerAssignedDelegate? OnGameManagerAssigned = null; private int _iterationPerStep = 1; @@ -67,17 +65,17 @@ public class PhysicsEngine2DCollector : IPhysicsEngine2D, IAssignableGameManager { if (colliderX.IsTrigger) { - colliderX.OnTriggered?.Invoke(colliderX, colliderY); + colliderX.Trigger(colliderY); continue; } else if (colliderY.IsTrigger) { - colliderY.OnTriggered?.Invoke(colliderY, colliderY); + colliderY.Trigger(colliderY); continue; } - colliderX.OnCollisionDetected?.Invoke(colliderX, information); - colliderY.OnCollisionDetected?.Invoke(colliderY, information); + colliderX.Detect(information); + colliderY.Detect(information); collisionResolver?.Resolve(information); } diff --git a/Engine.Physics2D/RigidBody2D.cs b/Engine.Physics2D/RigidBody2D.cs index 3820170..87f7409 100644 --- a/Engine.Physics2D/RigidBody2D.cs +++ b/Engine.Physics2D/RigidBody2D.cs @@ -1,5 +1,3 @@ -using System; - using Syntriax.Engine.Core; using Syntriax.Engine.Core.Abstract; using Syntriax.Engine.Physics2D.Abstract; @@ -8,7 +6,7 @@ namespace Syntriax.Engine.Physics2D; public class RigidBody2D : BehaviourOverride, IRigidBody2D { - public Action? OnTransformAssigned { get => GameObject.OnTransformAssigned; set => GameObject.OnTransformAssigned = value; } + event IAssignableTransform.OnTransformAssignedDelegate? IAssignableTransform.OnTransformAssigned { add => GameObject.OnTransformAssigned += value; remove => GameObject.OnTransformAssigned -= value; } private const float LOWEST_ALLOWED_MASS = 0.00001f; private float _mass = 1f;