diff --git a/Engine.Core/Abstract/Assignable/IAssignable.cs b/Engine.Core/Abstract/Assignable/IAssignable.cs index 3d25cfa..b4cac2a 100644 --- a/Engine.Core/Abstract/Assignable/IAssignable.cs +++ b/Engine.Core/Abstract/Assignable/IAssignable.cs @@ -17,6 +17,4 @@ public interface IAssignable /// , if the fields are unsigned successfully, if not. /// bool Unassign(); - - delegate void UnassignEventHandler(IAssignable sender); } diff --git a/Engine.Core/Abstract/Assignable/IHasBehaviourController.cs b/Engine.Core/Abstract/Assignable/IHasBehaviourController.cs index 6db3d39..6feff7e 100644 --- a/Engine.Core/Abstract/Assignable/IHasBehaviourController.cs +++ b/Engine.Core/Abstract/Assignable/IHasBehaviourController.cs @@ -21,6 +21,4 @@ public interface IHasBehaviourController : IAssignable /// , if the value given assigned successfully assigned, if not. /// bool Assign(IBehaviourController behaviourController); - - delegate void BehaviourControllerAssignedEventHandler(IHasBehaviourController sender); } diff --git a/Engine.Core/Abstract/Assignable/IHasEntity.cs b/Engine.Core/Abstract/Assignable/IHasEntity.cs index 3368919..205ffe5 100644 --- a/Engine.Core/Abstract/Assignable/IHasEntity.cs +++ b/Engine.Core/Abstract/Assignable/IHasEntity.cs @@ -21,6 +21,4 @@ public interface IHasEntity : IAssignable /// , if the value given assigned successfully assigned, if not. /// bool Assign(IEntity entity); - - delegate void EntityAssignedEventHandler(IHasEntity sender); } diff --git a/Engine.Core/Abstract/Assignable/IHasStateEnable.cs b/Engine.Core/Abstract/Assignable/IHasStateEnable.cs index a310b2c..0a5c766 100644 --- a/Engine.Core/Abstract/Assignable/IHasStateEnable.cs +++ b/Engine.Core/Abstract/Assignable/IHasStateEnable.cs @@ -21,6 +21,4 @@ public interface IHasStateEnable : IAssignable /// , if the value given assigned successfully assigned, if not. /// bool Assign(IStateEnable stateEnable); - - delegate void StateEnableAssignedEventHandler(IHasStateEnable sender); } diff --git a/Engine.Core/Abstract/Assignable/IHasUniverse.cs b/Engine.Core/Abstract/Assignable/IHasUniverse.cs index e6681cd..bcf13f2 100644 --- a/Engine.Core/Abstract/Assignable/IHasUniverse.cs +++ b/Engine.Core/Abstract/Assignable/IHasUniverse.cs @@ -21,6 +21,4 @@ public interface IHasUniverse : IAssignable /// , if the value given assigned successfully assigned, if not. /// bool Assign(IUniverse universe); - - delegate void UniverseAssignedEventHandler(IHasUniverse sender); } diff --git a/Engine.Core/Abstract/Assignable/IHasUniverseObject.cs b/Engine.Core/Abstract/Assignable/IHasUniverseObject.cs index 2f6b48f..ad1081a 100644 --- a/Engine.Core/Abstract/Assignable/IHasUniverseObject.cs +++ b/Engine.Core/Abstract/Assignable/IHasUniverseObject.cs @@ -21,6 +21,4 @@ public interface IHasUniverseObject : IAssignable /// , if the value given assigned successfully assigned, if not. /// bool Assign(IUniverseObject universeObject); - - delegate void UniverseObjectAssignedEventHandler(IHasUniverseObject sender); } diff --git a/Engine.Core/Abstract/IActive.cs b/Engine.Core/Abstract/IActive.cs index 724c5fa..7fbfd6c 100644 --- a/Engine.Core/Abstract/IActive.cs +++ b/Engine.Core/Abstract/IActive.cs @@ -8,12 +8,12 @@ public interface IActive /// /// Event triggered when the state of the changes. /// - Event OnActiveChanged { get; } + Event OnActiveChanged { get; } /// /// The value indicating whether the is enabled. /// bool IsActive { get; } - delegate void ActiveChangedEventHandler(IActive sender, bool previousState); + readonly record struct ActiveChangedArguments(bool PreviousState); } diff --git a/Engine.Core/Abstract/IBehaviour.cs b/Engine.Core/Abstract/IBehaviour.cs index baeb531..25ec8cd 100644 --- a/Engine.Core/Abstract/IBehaviour.cs +++ b/Engine.Core/Abstract/IBehaviour.cs @@ -8,12 +8,12 @@ public interface IBehaviour : IEntity, IActive, IHasBehaviourController, IHasSta /// /// Event triggered when the priority of the changes. /// - Event OnPriorityChanged { get; } + Event OnPriorityChanged { get; } /// /// The priority of the . /// int Priority { get; set; } - delegate void PriorityChangedEventHandler(IBehaviour sender, int previousPriority); + readonly record struct PriorityChangedArguments(int PreviousPriority); } diff --git a/Engine.Core/Abstract/IBehaviourCollector.cs b/Engine.Core/Abstract/IBehaviourCollector.cs index c9fa4fc..ad9ed56 100644 --- a/Engine.Core/Abstract/IBehaviourCollector.cs +++ b/Engine.Core/Abstract/IBehaviourCollector.cs @@ -10,12 +10,12 @@ public interface IBehaviourCollector : IHasUniverse where T : class /// /// Event triggered when an object of type is added to the collector. /// - Event, T> OnCollected { get; } + Event, BehaviourCollectedArguments> OnCollected { get; } /// /// Event triggered when an object of type is removed from the collector. /// - Event, T> OnRemoved { get; } + Event, BehaviourRemovedArguments> OnRemoved { get; } /// /// Amount of collected. @@ -32,12 +32,11 @@ public interface IBehaviourCollector : IHasUniverse where T : class /// /// The instance of the that triggered the event. /// The object of type that was added to the collector. - delegate void CollectedEventHandler(IBehaviourCollector sender, T behaviourCollected); + readonly record struct BehaviourCollectedArguments(T BehaviourCollected); /// /// Delegate for handling the event. /// - /// The instance of the that triggered the event. - /// The object of type that was removed from the collector. - delegate void RemovedEventHandler(IBehaviourCollector sender, T behaviourRemoved); + /// The object of type that was removed from the collector. + readonly record struct BehaviourRemovedArguments(T BehaviourRemoved); } diff --git a/Engine.Core/Abstract/IBehaviourController.cs b/Engine.Core/Abstract/IBehaviourController.cs index 997751a..590e2e8 100644 --- a/Engine.Core/Abstract/IBehaviourController.cs +++ b/Engine.Core/Abstract/IBehaviourController.cs @@ -10,12 +10,12 @@ public interface IBehaviourController : IEntity, IHasUniverseObject /// /// Event triggered when a is added to the . /// - Event OnBehaviourAdded { get; } + Event OnBehaviourAdded { get; } /// /// Event triggered when a is removed from the . /// - Event OnBehaviourRemoved { get; } + Event OnBehaviourRemoved { get; } /// /// Amount of collected. @@ -78,6 +78,6 @@ public interface IBehaviourController : IEntity, IHasUniverseObject /// The to remove. void RemoveBehaviour(T behaviour) where T : class, IBehaviour; - delegate void BehaviourAddedEventHandler(IBehaviourController sender, IBehaviour behaviourAdded); - delegate void BehaviourRemovedEventHandler(IBehaviourController sender, IBehaviour behaviourRemoved); + readonly record struct BehaviourAddedArguments(IBehaviour BehaviourAdded); + readonly record struct BehaviourRemovedArguments(IBehaviour BehaviourRemoved); } diff --git a/Engine.Core/Abstract/IEntity.cs b/Engine.Core/Abstract/IEntity.cs index f33a635..3eeefdd 100644 --- a/Engine.Core/Abstract/IEntity.cs +++ b/Engine.Core/Abstract/IEntity.cs @@ -9,12 +9,12 @@ public interface IEntity : IInitializable, IHasStateEnable /// Event triggered when the of the changes. /// The string action parameter is the previous of the . /// - Event OnIdChanged { get; } + Event OnIdChanged { get; } /// /// The ID of the . /// string Id { get; set; } - delegate void IdChangedEventHandler(IEntity sender, string previousId); + readonly record struct IdChangedArguments(string PreviousId); } diff --git a/Engine.Core/Abstract/IInitializable.cs b/Engine.Core/Abstract/IInitializable.cs index 881bda3..64230d3 100644 --- a/Engine.Core/Abstract/IInitializable.cs +++ b/Engine.Core/Abstract/IInitializable.cs @@ -31,7 +31,4 @@ public interface IInitializable /// /// if finalization is successful, otherwise . bool Finalize(); - - delegate void InitializedEventHandler(IInitializable sender); - delegate void FinalizedEventHandler(IInitializable sender); } diff --git a/Engine.Core/Abstract/INameable.cs b/Engine.Core/Abstract/INameable.cs index 015eee1..93442be 100644 --- a/Engine.Core/Abstract/INameable.cs +++ b/Engine.Core/Abstract/INameable.cs @@ -8,12 +8,12 @@ public interface INameable /// /// Event triggered when the name of the entity changes. /// - Event OnNameChanged { get; } + Event OnNameChanged { get; } /// /// The name of the entity. /// string Name { get; set; } - delegate void NameChangedEventHandler(INameable sender, string previousName); + readonly record struct NameChangedArguments(string PreviousName); } diff --git a/Engine.Core/Abstract/IStateEnable.cs b/Engine.Core/Abstract/IStateEnable.cs index 29334ab..4c61668 100644 --- a/Engine.Core/Abstract/IStateEnable.cs +++ b/Engine.Core/Abstract/IStateEnable.cs @@ -8,12 +8,12 @@ public interface IStateEnable : IHasEntity /// /// Event triggered when the state of the changes. /// - Event OnEnabledChanged { get; } + Event OnEnabledChanged { get; } /// /// The value indicating whether the is enabled. /// bool Enabled { get; set; } - delegate void EnabledChangedEventHandler(IStateEnable sender, bool previousState); + readonly record struct EnabledChangedArguments(bool PreviousState); } diff --git a/Engine.Core/Abstract/ITransform2D.cs b/Engine.Core/Abstract/ITransform2D.cs index c0ec888..b0175fa 100644 --- a/Engine.Core/Abstract/ITransform2D.cs +++ b/Engine.Core/Abstract/ITransform2D.cs @@ -8,17 +8,17 @@ public interface ITransform2D : IBehaviour /// /// Event triggered when the of the changes. /// - Event OnPositionChanged { get; } + Event OnPositionChanged { get; } /// /// Event triggered when the of the changes. /// - Event OnScaleChanged { get; } + Event OnScaleChanged { get; } /// /// Event triggered when the of the changes. /// - Event OnRotationChanged { get; } + Event OnRotationChanged { get; } /// /// The world position of the in 2D space. @@ -51,23 +51,20 @@ public interface ITransform2D : IBehaviour float LocalRotation { get; set; } /// - /// Delegate for the event triggered when the 's rotation changes. + /// Arguments for the event triggered when the 's rotation changes. /// - /// The that the parent has changed. - /// The previous of the . - delegate void PositionChangedEventHandler(ITransform2D sender, Vector2D previousPosition); + /// The previous of the . + readonly record struct PositionChangedArguments(Vector2D PreviousPosition); /// - /// Delegate for the event triggered when the 's rotation changes. + /// Arguments for the event triggered when the 's rotation changes. /// - /// The that the parent has changed. - /// The previous of the . - delegate void ScaleChangedEventHandler(ITransform2D sender, Vector2D previousScale); + /// The previous of the . + readonly record struct ScaleChangedArguments(Vector2D PreviousScale); /// - /// Delegate for the event triggered when the 's rotation changes. + /// Arguments for the event triggered when the 's rotation changes. /// - /// The that the parent has changed. - /// The previous of the . - delegate void RotationChangedEventHandler(ITransform2D sender, float previousRotation); + /// The previous of the . + readonly record struct RotationChangedArguments(float PreviousRotation); } diff --git a/Engine.Core/Abstract/IUniverse.cs b/Engine.Core/Abstract/IUniverse.cs index 33c3162..116967b 100644 --- a/Engine.Core/Abstract/IUniverse.cs +++ b/Engine.Core/Abstract/IUniverse.cs @@ -10,17 +10,17 @@ public interface IUniverse : IEntity, IEnumerable /// /// Event triggered when is about to be called called on the . /// - Event OnPreUpdate { get; } + Event OnPreUpdate { get; } /// /// Event triggered when is called on the . /// - Event OnUpdate { get; } + Event OnUpdate { get; } /// /// Event triggered after is called on the . /// - Event OnPostUpdate { get; } + Event OnPostUpdate { get; } /// /// Event triggered when is about to be called called on the . @@ -40,17 +40,17 @@ public interface IUniverse : IEntity, IEnumerable /// /// Event triggered when a is registered to the . /// - Event OnUniverseObjectRegistered { get; } + Event OnUniverseObjectRegistered { get; } /// /// Event triggered when a is unregistered from the . /// - Event OnUniverseObjectUnRegistered { get; } + Event OnUniverseObjectUnRegistered { get; } /// /// Event triggered when is changed on the . /// - Event OnTimeScaleChanged { get; } + Event OnTimeScaleChanged { get; } /// /// Current time scale the operates on. @@ -103,11 +103,8 @@ public interface IUniverse : IEntity, IEnumerable /// void Draw(); - delegate void TimeScaleChangedEventHandler(IUniverse sender, float previousTimeScale); - - delegate void UpdateEventHandler(IUniverse sender, UniverseTime engineTime); - delegate void DrawEventHandler(IUniverse sender); - - delegate void UniverseObjectRegisteredEventHandler(IUniverse sender, IUniverseObject universeObjectRegistered); - delegate void UniverseObjectUnRegisteredEventHandler(IUniverse sender, IUniverseObject universeObjectUnregistered); + readonly record struct TimeScaleChangedArguments(float PreviousTimeScale); + readonly record struct UpdateArguments(UniverseTime EngineTime); + readonly record struct UniverseObjectRegisteredArguments(IUniverseObject UniverseObjectRegistered); + readonly record struct UniverseObjectUnRegisteredArguments(IUniverseObject UniverseObjectUnregistered); } diff --git a/Engine.Core/Abstract/IUniverseObject.cs b/Engine.Core/Abstract/IUniverseObject.cs index a90cabc..7f03950 100644 --- a/Engine.Core/Abstract/IUniverseObject.cs +++ b/Engine.Core/Abstract/IUniverseObject.cs @@ -12,27 +12,27 @@ public interface IUniverseObject : IEntity, IActive, INameable, IHasBehaviourCon /// /// Event triggered when the enters the universe. /// - Event OnEnteredUniverse { get; } + Event OnEnteredUniverse { get; } /// /// Event triggered when the exits the universe. /// - Event OnExitedUniverse { get; } + Event OnExitedUniverse { get; } /// /// Event triggered when the of the changes. The second parameter is the old . /// - Event OnParentChanged { get; } + Event OnParentChanged { get; } /// /// Event triggered when a new is added to the . /// - Event OnChildrenAdded { get; } + Event OnChildrenAdded { get; } /// /// Event triggered when an is removed from the . /// - Event OnChildrenRemoved { get; } + Event OnChildrenRemoved { get; } /// /// Gets the this is connected to, if any. @@ -94,38 +94,38 @@ public interface IUniverseObject : IEntity, IActive, INameable, IHasBehaviourCon void RemoveChild(IUniverseObject universeObject); /// - /// EventHandler delegate for the event triggered when the enters the universe of a . + /// Arguments for the event triggered when the enters the universe of a . /// /// The that entered the universe. /// The that the has entered it's universe. - delegate void EnteredUniverseEventHandler(IUniverseObject sender, IUniverse universe); + readonly record struct EnteredUniverseArguments(IUniverse Universe); /// - /// EventHandler delegate for the event triggered when the exits the universe of a . + /// Arguments for the event triggered when the exits the universe of a . /// /// The that exited the universe. /// The that the has exited it's universe. - delegate void ExitedUniverseEventHandler(IUniverseObject sender, IUniverse universe); + readonly record struct ExitedUniverseArguments(IUniverse Universe); /// - /// Delegate for the event triggered when the 's parent changes. + /// Arguments for the event triggered when the 's parent changes. /// /// The that the parent has changed. /// The previous the sender was a child of. /// The new and current the sender is a child of. - delegate void ParentChangedEventHandler(IUniverseObject sender, IUniverseObject? previousParent, IUniverseObject? newParent); + readonly record struct ParentChangedArguments(IUniverseObject? PreviousParent, IUniverseObject? CurrentParent); /// - /// Delegate for the event triggered when a new added as a child. + /// Arguments for the event triggered when a new added as a child. /// /// The parent this event is being called from. /// The that got removed as a children of the sender . - delegate void ChildrenAddedEventHandler(IUniverseObject sender, IUniverseObject childrenAdded); + readonly record struct ChildrenAddedArguments(IUniverseObject ChildrenAdded); /// /// Delegate for the event triggered when a new removed from being a child. /// /// The parent this event is being called from. /// The that got removed as a children of the sender . - delegate void ChildrenRemovedEventHandler(IUniverseObject sender, IUniverseObject childrenRemoved); + readonly record struct ChildrenRemovedArguments(IUniverseObject ChildrenRemoved); } diff --git a/Engine.Core/ActiveBehaviourCollector.cs b/Engine.Core/ActiveBehaviourCollector.cs index 45370b5..7ad8fcd 100644 --- a/Engine.Core/ActiveBehaviourCollector.cs +++ b/Engine.Core/ActiveBehaviourCollector.cs @@ -5,16 +5,16 @@ namespace Syntriax.Engine.Core; public class ActiveBehaviourCollector : IBehaviourCollector where T : class, IBehaviour { - public Event, T> OnCollected { get; private set; } = new(); - public Event, T> OnRemoved { get; private set; } = new(); - public Event OnUniverseAssigned { get; private set; } = new(); - public Event? OnUnassigned { get; private set; } = new(); + public Event, IBehaviourCollector.BehaviourCollectedArguments> OnCollected { get; init; } = new(); + public Event, IBehaviourCollector.BehaviourRemovedArguments> OnRemoved { get; init; } = new(); + public Event OnUniverseAssigned { get; init; } = new(); + public Event? OnUnassigned { get; init; } = new(); - private readonly Action cachedOnBehaviourAdded = null!; - private readonly Action cachedOnBehaviourRemoved = null!; - private readonly Action cachedOnBehaviourStateChanged = null!; - private readonly Action cachedOnUniverseObjectRegistered = null!; - private readonly Action cachedOnUniverseObjectUnregistered = null!; + private readonly Event.EventHandler cachedOnBehaviourAdded = null!; + private readonly Event.EventHandler cachedOnBehaviourRemoved = null!; + private readonly Event.EventHandler cachedOnBehaviourStateChanged = null!; + private readonly Event.EventHandler cachedOnUniverseObjectRegistered = null!; + private readonly Event.EventHandler cachedOnUniverseObjectUnregistered = null!; private readonly List monitoringBehaviours = new(32); protected readonly List activeBehaviours = new(32); @@ -22,56 +22,60 @@ public class ActiveBehaviourCollector : IBehaviourCollector where T : clas public IUniverse Universe { get; private set; } = null!; - private void OnUniverseObjectRegistered(IUniverse manager, IUniverseObject universeObject) + private void OnUniverseObjectRegistered(IUniverse manager, IUniverse.UniverseObjectRegisteredArguments arguments) { + IUniverseObject universeObject = arguments.UniverseObjectRegistered; + universeObject.BehaviourController.OnBehaviourAdded.AddListener(cachedOnBehaviourAdded); universeObject.BehaviourController.OnBehaviourRemoved.AddListener(cachedOnBehaviourRemoved); for (int i = 0; i < universeObject.BehaviourController.Count; i++) - OnBehaviourAdded(universeObject.BehaviourController, universeObject.BehaviourController[i]); + OnBehaviourAdded(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); } - private void OnUniverseObjectUnregistered(IUniverse manager, IUniverseObject universeObject) + private void OnUniverseObjectUnregistered(IUniverse manager, IUniverse.UniverseObjectUnRegisteredArguments arguments) { + IUniverseObject universeObject = arguments.UniverseObjectUnregistered; + universeObject.BehaviourController.OnBehaviourAdded.RemoveListener(cachedOnBehaviourAdded); universeObject.BehaviourController.OnBehaviourRemoved.RemoveListener(cachedOnBehaviourRemoved); for (int i = 0; i < universeObject.BehaviourController.Count; i++) - OnBehaviourRemoved(universeObject.BehaviourController, universeObject.BehaviourController[i]); + OnBehaviourRemoved(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); } protected virtual void OnBehaviourAdd(IBehaviour behaviour) { } - private void OnBehaviourAdded(IBehaviourController controller, IBehaviour behaviour) + private void OnBehaviourAdded(IBehaviourController controller, IBehaviourController.BehaviourAddedArguments arguments) { - if (behaviour is not T tBehaviour) + if (arguments.BehaviourAdded is not T tBehaviour) return; monitoringBehaviours.Add(tBehaviour); monitoringActiveToBehaviour.Add(tBehaviour, tBehaviour); tBehaviour.OnActiveChanged.AddListener(cachedOnBehaviourStateChanged); - OnBehaviourStateChanged(tBehaviour, !tBehaviour.IsActive); + OnBehaviourStateChanged(tBehaviour, new(!tBehaviour.IsActive)); } - private void OnBehaviourStateChanged(IActive sender, bool previousState) + private void OnBehaviourStateChanged(IActive sender, IActive.ActiveChangedArguments arguments) { T behaviour = monitoringActiveToBehaviour[sender]; if (sender.IsActive) { activeBehaviours.Add(behaviour); OnBehaviourAdd(behaviour); - OnCollected?.Invoke(this, behaviour); + OnCollected?.Invoke(this, new(behaviour)); } else if (activeBehaviours.Remove(behaviour)) { OnBehaviourRemove(behaviour); - OnRemoved?.Invoke(this, behaviour); + OnRemoved?.Invoke(this, new(behaviour)); } } protected virtual void OnBehaviourRemove(IBehaviour behaviour) { } - private void OnBehaviourRemoved(IBehaviourController controller, IBehaviour behaviour) + private void OnBehaviourRemoved(IBehaviourController controller, IBehaviourController.BehaviourRemovedArguments arguments) { - if (behaviour is not T tBehaviour) + if (arguments.BehaviourRemoved is not T tBehaviour) return; if (!monitoringBehaviours.Remove(tBehaviour) || !monitoringActiveToBehaviour.Remove(tBehaviour)) @@ -81,7 +85,7 @@ public class ActiveBehaviourCollector : IBehaviourCollector where T : clas if (activeBehaviours.Remove(tBehaviour)) { OnBehaviourRemove(tBehaviour); - OnRemoved?.Invoke(this, tBehaviour); + OnRemoved?.Invoke(this, new(tBehaviour)); } } @@ -91,7 +95,7 @@ public class ActiveBehaviourCollector : IBehaviourCollector where T : clas return false; foreach (IUniverseObject universeObject in universe.UniverseObjects) - OnUniverseObjectRegistered(universe, universeObject); + OnUniverseObjectRegistered(universe, new(universeObject)); universe.OnUniverseObjectRegistered.AddListener(cachedOnUniverseObjectRegistered); universe.OnUniverseObjectUnRegistered.AddListener(cachedOnUniverseObjectUnregistered); @@ -108,7 +112,7 @@ public class ActiveBehaviourCollector : IBehaviourCollector where T : clas return false; foreach (IUniverseObject universeObject in Universe.UniverseObjects) - OnUniverseObjectUnregistered(Universe, universeObject); + OnUniverseObjectUnregistered(Universe, new(universeObject)); Universe.OnUniverseObjectRegistered.RemoveListener(cachedOnUniverseObjectRegistered); Universe.OnUniverseObjectUnRegistered.RemoveListener(cachedOnUniverseObjectUnregistered); diff --git a/Engine.Core/BaseEntity.cs b/Engine.Core/BaseEntity.cs index 0260046..f89d833 100644 --- a/Engine.Core/BaseEntity.cs +++ b/Engine.Core/BaseEntity.cs @@ -4,11 +4,11 @@ namespace Syntriax.Engine.Core; public abstract class BaseEntity : IEntity { - public Event OnIdChanged { get; private set; } = new(); - public Event OnInitialized { get; private set; } = new(); - public Event OnFinalized { get; private set; } = new(); - public Event OnStateEnableAssigned { get; private set; } = new(); - public Event OnUnassigned { get; private set; } = new(); + public Event OnIdChanged { get; init; } = new(); + public Event OnInitialized { get; init; } = new(); + public Event OnFinalized { get; init; } = new(); + public Event OnStateEnableAssigned { get; init; } = new(); + public Event OnUnassigned { get; init; } = new(); private IStateEnable _stateEnable = null!; @@ -31,7 +31,7 @@ public abstract class BaseEntity : IEntity string previousId = _id; _id = value; - OnIdChanged?.Invoke(this, previousId); + OnIdChanged?.Invoke(this, new(previousId)); } } diff --git a/Engine.Core/Behaviour.cs b/Engine.Core/Behaviour.cs index 85b1a5c..8c8b706 100644 --- a/Engine.Core/Behaviour.cs +++ b/Engine.Core/Behaviour.cs @@ -1,5 +1,3 @@ -using System; - namespace Syntriax.Engine.Core; public abstract class Behaviour : BehaviourBase, IFirstFrameUpdate, @@ -9,8 +7,8 @@ public abstract class Behaviour : BehaviourBase, IFirstFrameUpdate, protected IUniverse Universe => BehaviourController.UniverseObject.Universe; protected IUniverseObject UniverseObject => BehaviourController.UniverseObject; - private readonly Action cachedEnteredUniverse = null!; - private readonly Action cachedExitedUniverse = null!; + private readonly Event.EventHandler cachedEnteredUniverse = null!; + private readonly Event.EventHandler cachedExitedUniverse = null!; public Behaviour() { @@ -34,7 +32,7 @@ public abstract class Behaviour : BehaviourBase, IFirstFrameUpdate, OnInitialize(); if (UniverseObject.IsInUniverse) - EnteredUniverse(UniverseObject, Universe); + EnteredUniverse(UniverseObject, new(Universe)); } protected virtual void OnFinalize() { } @@ -46,7 +44,7 @@ public abstract class Behaviour : BehaviourBase, IFirstFrameUpdate, OnFinalize(); if (UniverseObject.IsInUniverse) - ExitedUniverse(UniverseObject, Universe); + ExitedUniverse(UniverseObject, new(Universe)); } protected virtual void OnFirstActiveFrame() { } @@ -141,8 +139,8 @@ public abstract class Behaviour : BehaviourBase, IFirstFrameUpdate, } protected virtual void OnEnteredUniverse(IUniverse universe) { } - protected virtual void EnteredUniverse(IUniverseObject sender, IUniverse universe) => OnEnteredUniverse(universe); + protected virtual void EnteredUniverse(IUniverseObject sender, IUniverseObject.EnteredUniverseArguments arguments) => OnEnteredUniverse(arguments.Universe); protected virtual void OnExitedUniverse(IUniverse universe) { } - protected virtual void ExitedUniverse(IUniverseObject sender, IUniverse universe) => OnExitedUniverse(universe); + protected virtual void ExitedUniverse(IUniverseObject sender, IUniverseObject.ExitedUniverseArguments arguments) => OnExitedUniverse(arguments.Universe); } diff --git a/Engine.Core/Behaviour2D.cs b/Engine.Core/Behaviour2D.cs index f7be439..e7ee376 100644 --- a/Engine.Core/Behaviour2D.cs +++ b/Engine.Core/Behaviour2D.cs @@ -17,6 +17,6 @@ public abstract class Behaviour2D : Behaviour, IBehaviour2D } protected sealed override void OnUnassign(IAssignable assignable) => base.OnUnassign(assignable); - protected sealed override void EnteredUniverse(IUniverseObject sender, IUniverse universe) => base.EnteredUniverse(sender, universe); - protected sealed override void ExitedUniverse(IUniverseObject sender, IUniverse universe) => base.ExitedUniverse(sender, universe); + protected sealed override void EnteredUniverse(IUniverseObject sender, IUniverseObject.EnteredUniverseArguments arguments) => base.EnteredUniverse(sender, arguments); + protected sealed override void ExitedUniverse(IUniverseObject sender, IUniverseObject.ExitedUniverseArguments arguments) => base.ExitedUniverse(sender, arguments); } diff --git a/Engine.Core/BehaviourBase.cs b/Engine.Core/BehaviourBase.cs index 085f23b..41610b0 100644 --- a/Engine.Core/BehaviourBase.cs +++ b/Engine.Core/BehaviourBase.cs @@ -1,17 +1,15 @@ -using System; - namespace Syntriax.Engine.Core; [System.Diagnostics.DebuggerDisplay("{GetType().Name, nq}, Priority: {Priority}, Initialized: {Initialized}")] public abstract class BehaviourBase : BaseEntity, IBehaviour { - public Event OnPriorityChanged { get; private set; } = new(); - public Event OnActiveChanged { get; private set; } = new(); - public Event OnBehaviourControllerAssigned { get; private set; } = new(); + public Event OnPriorityChanged { get; init; } = new(); + public Event OnActiveChanged { get; init; } = new(); + public Event OnBehaviourControllerAssigned { get; init; } = new(); - private Action cachedOnUniverseObjectAssigned = null!; - private Action cachedOnUniverseObjectActiveChanged = null!; - private Action cachedOnStateEnabledChanged = null!; + private readonly Event.EventHandler cachedOnUniverseObjectAssigned = null!; + private readonly Event.EventHandler cachedOnUniverseObjectActiveChanged = null!; + private readonly Event.EventHandler cachedOnStateEnabledChanged = null!; private IBehaviourController _behaviourController = null!; public IBehaviourController BehaviourController => _behaviourController; @@ -27,7 +25,7 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour int previousPriority = _priority; _priority = value; - OnPriorityChanged?.Invoke(this, previousPriority); + OnPriorityChanged?.Invoke(this, new(previousPriority)); } } @@ -77,8 +75,8 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour Debug.Assert.AssertStateEnableAssigned(this); } - private void OnStateEnabledChanged(IStateEnable sender, bool previousState) => UpdateActive(); - private void OnUniverseObjectActiveChanged(IActive sender, bool previousState) => UpdateActive(); + private void OnStateEnabledChanged(IStateEnable sender, IStateEnable.EnabledChangedArguments arguments) => UpdateActive(); + private void OnUniverseObjectActiveChanged(IActive sender, IActive.ActiveChangedArguments arguments) => UpdateActive(); private void UpdateActive() { @@ -86,7 +84,7 @@ public abstract class BehaviourBase : BaseEntity, IBehaviour _isActive = StateEnable.Enabled && _behaviourController.UniverseObject.IsActive; if (previousActive != IsActive) - OnActiveChanged?.Invoke(this, previousActive); + OnActiveChanged?.Invoke(this, new(previousActive)); } protected BehaviourBase() diff --git a/Engine.Core/BehaviourCollector.cs b/Engine.Core/BehaviourCollector.cs index 4e5e5cd..f10f29e 100644 --- a/Engine.Core/BehaviourCollector.cs +++ b/Engine.Core/BehaviourCollector.cs @@ -5,60 +5,64 @@ namespace Syntriax.Engine.Core; public class BehaviourCollector : IBehaviourCollector where T : class { - public Event, T> OnCollected { get; private set; } = new(); - public Event, T> OnRemoved { get; private set; } = new(); - public Event OnUniverseAssigned { get; private set; } = new(); - public Event? OnUnassigned { get; private set; } = new(); + public Event, IBehaviourCollector.BehaviourCollectedArguments> OnCollected { get; init; } = new(); + public Event, IBehaviourCollector.BehaviourRemovedArguments> OnRemoved { get; init; } = new(); + public Event OnUniverseAssigned { get; init; } = new(); + public Event? OnUnassigned { get; init; } = new(); - private readonly Action cachedOnBehaviourAdded = null!; - private readonly Action cachedOnBehaviourRemoved = null!; - private readonly Action cachedOnUniverseObjectRegistered = null!; - private readonly Action cachedOnUniverseObjectUnregistered = null!; + private readonly Event.EventHandler cachedOnBehaviourAdded = null!; + private readonly Event.EventHandler cachedOnBehaviourRemoved = null!; + private readonly Event.EventHandler cachedOnUniverseObjectRegistered = null!; + private readonly Event.EventHandler cachedOnUniverseObjectUnregistered = null!; protected readonly List behaviours = new(32); public IUniverse Universe { get; private set; } = null!; - private void OnUniverseObjectRegistered(IUniverse manager, IUniverseObject universeObject) + private void OnUniverseObjectRegistered(IUniverse manager, IUniverse.UniverseObjectRegisteredArguments arguments) { + IUniverseObject universeObject = arguments.UniverseObjectRegistered; + universeObject.BehaviourController.OnBehaviourAdded.AddListener(cachedOnBehaviourAdded); universeObject.BehaviourController.OnBehaviourRemoved.AddListener(cachedOnBehaviourRemoved); for (int i = 0; i < universeObject.BehaviourController.Count; i++) - OnBehaviourAdded(universeObject.BehaviourController, universeObject.BehaviourController[i]); + OnBehaviourAdded(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); } - private void OnUniverseObjectUnregistered(IUniverse manager, IUniverseObject universeObject) + private void OnUniverseObjectUnregistered(IUniverse manager, IUniverse.UniverseObjectUnRegisteredArguments arguments) { + IUniverseObject universeObject = arguments.UniverseObjectUnregistered; + universeObject.BehaviourController.OnBehaviourAdded.RemoveListener(cachedOnBehaviourAdded); universeObject.BehaviourController.OnBehaviourRemoved.RemoveListener(cachedOnBehaviourRemoved); for (int i = 0; i < universeObject.BehaviourController.Count; i++) - OnBehaviourRemoved(universeObject.BehaviourController, universeObject.BehaviourController[i]); + OnBehaviourRemoved(universeObject.BehaviourController, new(universeObject.BehaviourController[i])); } protected virtual void OnBehaviourAdd(IBehaviour behaviour) { } - private void OnBehaviourAdded(IBehaviourController controller, IBehaviour behaviour) + private void OnBehaviourAdded(IBehaviourController controller, IBehaviourController.BehaviourAddedArguments arguments) { - if (behaviour is not T tBehaviour) + if (arguments.BehaviourAdded is not T tBehaviour) return; behaviours.Add(tBehaviour); - OnBehaviourAdd(behaviour); - OnCollected?.Invoke(this, tBehaviour); + OnBehaviourAdd(arguments.BehaviourAdded); + OnCollected?.Invoke(this, new(tBehaviour)); } protected virtual void OnBehaviourRemove(IBehaviour behaviour) { } - private void OnBehaviourRemoved(IBehaviourController controller, IBehaviour behaviour) + private void OnBehaviourRemoved(IBehaviourController controller, IBehaviourController.BehaviourRemovedArguments arguments) { - if (behaviour is not T tBehaviour) + if (arguments.BehaviourRemoved is not T tBehaviour) return; if (!behaviours.Remove(tBehaviour)) return; - OnBehaviourRemove(behaviour); - OnRemoved?.Invoke(this, tBehaviour); + OnBehaviourRemove(arguments.BehaviourRemoved); + OnRemoved?.Invoke(this, new(tBehaviour)); } protected virtual void OnAssign(IUniverse universe) { } @@ -68,7 +72,7 @@ public class BehaviourCollector : IBehaviourCollector where T : class return false; foreach (IUniverseObject universeObject in universe.UniverseObjects) - OnUniverseObjectRegistered(universe, universeObject); + OnUniverseObjectRegistered(universe, new(universeObject)); universe.OnUniverseObjectRegistered.AddListener(cachedOnUniverseObjectRegistered); universe.OnUniverseObjectUnRegistered.AddListener(cachedOnUniverseObjectUnregistered); @@ -86,7 +90,7 @@ public class BehaviourCollector : IBehaviourCollector where T : class return false; foreach (IUniverseObject universeObject in Universe.UniverseObjects) - OnUniverseObjectUnregistered(Universe, universeObject); + OnUniverseObjectUnregistered(Universe, new(universeObject)); Universe.OnUniverseObjectRegistered.RemoveListener(cachedOnUniverseObjectRegistered); Universe.OnUniverseObjectUnRegistered.RemoveListener(cachedOnUniverseObjectUnregistered); diff --git a/Engine.Core/BehaviourController.cs b/Engine.Core/BehaviourController.cs index 6829c9b..631603a 100644 --- a/Engine.Core/BehaviourController.cs +++ b/Engine.Core/BehaviourController.cs @@ -1,5 +1,4 @@ using System; -using System.Collections; using System.Collections.Generic; using System.Linq; @@ -8,11 +7,11 @@ namespace Syntriax.Engine.Core; [System.Diagnostics.DebuggerDisplay("Behaviour Count: {behaviours.Count}")] public class BehaviourController : BaseEntity, IBehaviourController { - public Event OnBehaviourAdded { get; private set; } = new(); - public Event OnBehaviourRemoved { get; private set; } = new(); - public Event OnUniverseObjectAssigned { get; private set; } = new(); + public Event OnBehaviourAdded { get; init; } = new(); + public Event OnBehaviourRemoved { get; init; } = new(); + public Event OnUniverseObjectAssigned { get; init; } = new(); - private readonly IList behaviours = new List(Constants.BEHAVIOURS_SIZE_INITIAL); + private readonly List behaviours = new(Constants.BEHAVIOURS_SIZE_INITIAL); private IUniverseObject _universeObject = null!; @@ -20,9 +19,6 @@ public class BehaviourController : BaseEntity, IBehaviourController public int Count => behaviours.Count; public IBehaviour this[Index index] => behaviours[index]; - public int Count => behaviours.Count; - public IBehaviour this[Index index] => behaviours[index]; - public T AddBehaviour(T behaviour) where T : class, IBehaviour { InsertBehaviourByPriority(behaviour); @@ -32,7 +28,7 @@ public class BehaviourController : BaseEntity, IBehaviourController if (IsInitialized) behaviour.Initialize(); behaviour.OnPriorityChanged.AddListener(OnPriorityChange); - OnBehaviourAdded?.Invoke(this, behaviour); + OnBehaviourAdded?.Invoke(this, new(behaviour)); return behaviour; } @@ -100,7 +96,7 @@ public class BehaviourController : BaseEntity, IBehaviourController behaviour.OnPriorityChanged.RemoveListener(OnPriorityChange); behaviour.Finalize(); behaviours.Remove(behaviour); - OnBehaviourRemoved?.Invoke(this, behaviour); + OnBehaviourRemoved?.Invoke(this, new(behaviour)); } protected virtual void OnAssign(IUniverseObject universeObject) { } @@ -149,7 +145,7 @@ public class BehaviourController : BaseEntity, IBehaviourController behaviours.Add(behaviour); } - private void OnPriorityChange(IBehaviour sender, int previousPriority) + private void OnPriorityChange(IBehaviour sender, IBehaviour.PriorityChangedArguments arguments) { behaviours.Remove(sender); InsertBehaviourByPriority(sender); diff --git a/Engine.Core/CoroutineManager.cs b/Engine.Core/CoroutineManager.cs index bbe49c7..aeec4c5 100644 --- a/Engine.Core/CoroutineManager.cs +++ b/Engine.Core/CoroutineManager.cs @@ -28,7 +28,7 @@ public class CoroutineManager : UniverseObject universe.OnUpdate.RemoveListener(OnUpdate); } - private void OnUpdate(IUniverse sender, UniverseTime time) + private void OnUpdate(IUniverse sender, IUniverse.UpdateArguments arguments) { for (int i = enumerators.Count - 1; i >= 0; i--) { diff --git a/Engine.Core/Helpers/Event.cs b/Engine.Core/Helpers/Event.cs index 766d604..88215c4 100644 --- a/Engine.Core/Helpers/Event.cs +++ b/Engine.Core/Helpers/Event.cs @@ -3,31 +3,14 @@ using System.Collections.Generic; namespace Syntriax.Engine.Core; -public class Event +public class Event { - private readonly List listeners = new(1000); + private readonly List listeners = new(8); - public void AddListener(Action listener) => listeners.Add(listener); - public void RemoveListener(Action listener) => listeners.Remove(listener); - public void Invoke() - { - for (int i = 0; i < listeners.Count; i++) - try { listeners[i].Invoke(); } - catch (Exception exception) - { - string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}()"; - Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); - } - } -} - -public class Event -{ - private readonly List> listeners = new(1000); - - public void AddListener(Action listener) => listeners.Add(listener); - public void RemoveListener(Action listener) => listeners.Remove(listener); - public void Invoke(T1 argument) + public void AddListener(EventHandler listener) => listeners.Add(listener); + public void RemoveListener(EventHandler listener) => listeners.Remove(listener); + public void Clear() => listeners.Clear(); + public void Invoke(TSender argument) { for (int i = 0; i < listeners.Count; i++) try { listeners[i].Invoke(argument); } @@ -37,58 +20,27 @@ public class Event Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); } } + + public delegate void EventHandler(TSender sender); } -public class Event +public class Event { - private readonly List> listeners = new(1000); + private readonly List listeners = new(8); - public void AddListener(Action listener) => listeners.Add(listener); - public void RemoveListener(Action listener) => listeners.Remove(listener); - public void Invoke(T1 argument1, T2 argument2) + public void AddListener(EventHandler listener) => listeners.Add(listener); + public void RemoveListener(EventHandler listener) => listeners.Remove(listener); + public void Clear() => listeners.Clear(); + public void Invoke(TSender sender, TArguments arguments) { for (int i = 0; i < listeners.Count; i++) - try { listeners[i].Invoke(argument1, argument2); } + try { listeners[i].Invoke(sender, arguments); } catch (Exception exception) { - string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({string.Join(", ", argument1, argument2)})"; - Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); - } - } -} - -public class Event -{ - private readonly List> listeners = new(1000); - - public void AddListener(Action listener) => listeners.Add(listener); - public void RemoveListener(Action listener) => listeners.Remove(listener); - public void Invoke(T1 argument1, T2 argument2, T3 argument3) - { - for (int i = 0; i < listeners.Count; i++) - try { listeners[i].Invoke(argument1, argument2, argument3); } - catch (Exception exception) - { - string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({string.Join(", ", argument1, argument2, argument3)})"; - Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); - } - } -} - -public class Event -{ - private readonly List> listeners = new(1000); - - public void AddListener(Action listener) => listeners.Add(listener); - public void RemoveListener(Action listener) => listeners.Remove(listener); - public void Invoke(T1 argument1, T2 argument2, T3 argument3, T4 argument4) - { - for (int i = 0; i < listeners.Count; i++) - try { listeners[i].Invoke(argument1, argument2, argument3, argument4); } - catch (Exception exception) - { - string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({string.Join(", ", argument1, argument2, argument3, argument4)})"; + string methodCallRepresentation = $"{listeners[i].Method.DeclaringType?.FullName}.{listeners[i].Method.Name}({string.Join(", ", sender, arguments)})"; Console.WriteLine($"Unexpected exception on invocation of method {methodCallRepresentation}:{Environment.NewLine}{exception.InnerException}"); } } + + public delegate void EventHandler(TSender sender, TArguments arguments); } diff --git a/Engine.Core/Helpers/Progression/IReadOnlyProgressionTracker.cs b/Engine.Core/Helpers/Progression/IReadOnlyProgressionTracker.cs index 0daed26..a92034d 100644 --- a/Engine.Core/Helpers/Progression/IReadOnlyProgressionTracker.cs +++ b/Engine.Core/Helpers/Progression/IReadOnlyProgressionTracker.cs @@ -2,12 +2,11 @@ namespace Syntriax.Engine.Core; public interface IReadOnlyProgressionTracker { - event ProgressionUpdatedEventHandler? OnUpdated; - event ProgressionEndedEventHandler? OnEnded; + Event OnUpdated { get; } + Event OnEnded { get; } float Progression { get; } string Status { get; } - delegate void ProgressionUpdatedEventHandler(IReadOnlyProgressionTracker sender, float previousProgression, string previousStatus); - delegate void ProgressionEndedEventHandler(IReadOnlyProgressionTracker sender); + readonly record struct ProgressionUpdatedArguments(float PreviousProgression, string PreviousStatus); } diff --git a/Engine.Core/Helpers/Progression/ProgressionTracker.cs b/Engine.Core/Helpers/Progression/ProgressionTracker.cs index 7175561..bceca0f 100644 --- a/Engine.Core/Helpers/Progression/ProgressionTracker.cs +++ b/Engine.Core/Helpers/Progression/ProgressionTracker.cs @@ -2,8 +2,8 @@ namespace Syntriax.Engine.Core; public class ProgressionTracker : IProgressionTracker { - public event IReadOnlyProgressionTracker.ProgressionUpdatedEventHandler? OnUpdated = null; - public event IReadOnlyProgressionTracker.ProgressionEndedEventHandler? OnEnded = null; + public Event OnUpdated { get; init; } = new(); + public Event OnEnded { get; init; } = new(); public float Progression { get; private set; } = 0f; public string Status { get; private set; } = "Default"; @@ -19,7 +19,7 @@ public class ProgressionTracker : IProgressionTracker Progression = progression.Clamp(Progression, 1f); Status = status; - OnUpdated?.Invoke(this, previousProgression, previousStatus); + OnUpdated?.Invoke(this, new(previousProgression, previousStatus)); if (progression >= 1f) OnEnded?.Invoke(this); @@ -30,7 +30,7 @@ public class ProgressionTracker : IProgressionTracker Progression = 0f; Status = "Default"; - OnUpdated = null; - OnEnded = null; + OnUpdated.Clear(); + OnEnded.Clear(); } } diff --git a/Engine.Core/Primitives/Shape2D.cs b/Engine.Core/Primitives/Shape2D.cs index 4449574..41772fd 100644 --- a/Engine.Core/Primitives/Shape2D.cs +++ b/Engine.Core/Primitives/Shape2D.cs @@ -18,7 +18,7 @@ public class Shape2D(List vertices) : IEnumerable public static Shape2D Pentagon => CreateNgon(5, Vector2D.Up); public static Shape2D Hexagon => CreateNgon(6, Vector2D.Right); - public Event OnShapeUpdated { get; private set; } = new(); + public Event OnShapeUpdated { get; init; } = new(); private List _vertices = vertices; @@ -257,7 +257,7 @@ public class Shape2D(List vertices) : IEnumerable /// IEnumerator IEnumerable.GetEnumerator() => Vertices.GetEnumerator(); - public delegate void ShapeUpdatedEventHandler(Shape2D shape2D); + public readonly record struct ShapeUpdatedArguments(Shape2D shape2D); } /// diff --git a/Engine.Core/Serialization/EntityRegistry.cs b/Engine.Core/Serialization/EntityRegistry.cs index a698ab1..c02b9d2 100644 --- a/Engine.Core/Serialization/EntityRegistry.cs +++ b/Engine.Core/Serialization/EntityRegistry.cs @@ -5,7 +5,7 @@ namespace Syntriax.Engine.Core.Serialization; public class EntityRegistry { - public event EntityRegisteredEventHandler? OnEntityRegistered = null!; + public Event OnEntityRegistered = null!; private readonly Dictionary?> assignCallbacks = []; private readonly Dictionary registeredEntities = []; @@ -14,7 +14,7 @@ public class EntityRegistry public void Add(IEntity entity) { if (registeredEntities.TryAdd(entity.Id, entity)) - OnEntityRegistered?.Invoke(this, entity); + OnEntityRegistered?.Invoke(this, new(entity)); } public void QueueAssign(string id, Action setMethod) @@ -35,5 +35,5 @@ public class EntityRegistry registeredEntities.Clear(); } - public delegate void EntityRegisteredEventHandler(EntityRegistry sender, IEntity entity); + public readonly record struct EntityRegisteredArguments(IEntity Entity); } diff --git a/Engine.Core/StateEnable.cs b/Engine.Core/StateEnable.cs index 174880f..1be811a 100644 --- a/Engine.Core/StateEnable.cs +++ b/Engine.Core/StateEnable.cs @@ -2,9 +2,9 @@ namespace Syntriax.Engine.Core; public class StateEnable : IStateEnable { - public Event OnEnabledChanged { get; private set; } = new(); - public Event OnEntityAssigned { get; private set; } = new(); - public Event? OnUnassigned { get; private set; } = new(); + public Event OnEnabledChanged { get; init; } = new(); + public Event OnEntityAssigned { get; init; } = new(); + public Event? OnUnassigned { get; init; } = new(); private bool _enabled = true; private IEntity _entity = null!; @@ -21,7 +21,7 @@ public class StateEnable : IStateEnable bool previousState = _enabled; _enabled = value; - OnEnabledChanged?.Invoke(this, previousState); + OnEnabledChanged?.Invoke(this, new(previousState)); } } diff --git a/Engine.Core/Systems/UpdateManager.cs b/Engine.Core/Systems/UpdateManager.cs index af65a8f..f5a9a30 100644 --- a/Engine.Core/Systems/UpdateManager.cs +++ b/Engine.Core/Systems/UpdateManager.cs @@ -38,7 +38,7 @@ public class UpdateManager : UniverseObject universe.OnPostUpdate.RemoveListener(OnPostUpdate); } - private void OnPreUpdate(IUniverse sender, UniverseTime engineTime) + private void OnPreUpdate(IUniverse sender, IUniverse.UpdateArguments arguments) { for (int i = toCallFirstFrameUpdates.Count - 1; i >= 0; i--) { @@ -50,21 +50,21 @@ public class UpdateManager : UniverseObject preUpdateEntities[i].PreUpdate(); } - private void OnUpdate(IUniverse sender, UniverseTime engineTime) + private void OnUpdate(IUniverse sender, IUniverse.UpdateArguments arguments) { for (int i = updateEntities.Count - 1; i >= 0; i--) updateEntities[i].Update(); } - private void OnPostUpdate(IUniverse sender, UniverseTime engineTime) + private void OnPostUpdate(IUniverse sender, IUniverse.UpdateArguments arguments) { for (int i = postUpdateEntities.Count - 1; i >= 0; i--) postUpdateEntities[i].PostUpdate(); } - private void OnFirstFrameCollected(IBehaviourCollector sender, IFirstFrameUpdate behaviourCollected) + private void OnFirstFrameCollected(IBehaviourCollector sender, IBehaviourCollector.BehaviourCollectedArguments arguments) { - toCallFirstFrameUpdates.Add(behaviourCollected); + toCallFirstFrameUpdates.Add(arguments.BehaviourCollected); } public UpdateManager() diff --git a/Engine.Core/Transform2D.cs b/Engine.Core/Transform2D.cs index f67477c..ede2311 100644 --- a/Engine.Core/Transform2D.cs +++ b/Engine.Core/Transform2D.cs @@ -5,9 +5,9 @@ namespace Syntriax.Engine.Core; [System.Diagnostics.DebuggerDisplay("Name: {UniverseObject.Name, nq} Position: {Position.ToString(), nq}, Scale: {Scale.ToString(), nq}, Rotation: {Rotation}")] public class Transform2D : Behaviour, ITransform2D { - public Event OnPositionChanged { get; private set; } = new(); - public Event OnScaleChanged { get; private set; } = new(); - public Event OnRotationChanged { get; private set; } = new(); + public Event OnPositionChanged { get; init; } = new(); + public Event OnScaleChanged { get; init; } = new(); + public Event OnRotationChanged { get; init; } = new(); private Vector2D _position = Vector2D.Zero; private Vector2D _scale = Vector2D.One; @@ -31,7 +31,7 @@ public class Transform2D : Behaviour, ITransform2D _position = value; UpdateLocalPosition(); - OnPositionChanged?.Invoke(this, previousPosition); + OnPositionChanged?.Invoke(this, new(previousPosition)); } } @@ -47,7 +47,7 @@ public class Transform2D : Behaviour, ITransform2D _scale = value; UpdateLocalScale(); - OnScaleChanged?.Invoke(this, previousScale); + OnScaleChanged?.Invoke(this, new(previousScale)); } } @@ -63,7 +63,7 @@ public class Transform2D : Behaviour, ITransform2D _rotation = value; UpdateLocalRotation(); - OnRotationChanged?.Invoke(this, previousRotation); + OnRotationChanged?.Invoke(this, new(previousRotation)); } } @@ -79,7 +79,7 @@ public class Transform2D : Behaviour, ITransform2D _localPosition = value; UpdatePosition(); - OnPositionChanged?.Invoke(this, previousPosition); + OnPositionChanged?.Invoke(this, new(previousPosition)); } } @@ -97,8 +97,8 @@ public class Transform2D : Behaviour, ITransform2D UpdateScale(); UpdatePosition(); - OnScaleChanged?.Invoke(this, previousScale); - OnPositionChanged?.Invoke(this, previousPosition); + OnScaleChanged?.Invoke(this, new(previousScale)); + OnPositionChanged?.Invoke(this, new(previousPosition)); } } @@ -114,21 +114,21 @@ public class Transform2D : Behaviour, ITransform2D _localRotation = value; UpdateRotation(); - OnRotationChanged?.Invoke(this, previousRotation); + OnRotationChanged?.Invoke(this, new(previousRotation)); } } - private void RecalculatePosition(ITransform2D _, Vector2D previousPosition) + private void RecalculatePosition(ITransform2D _, ITransform2D.PositionChangedArguments arguments) { if (parentTransform is null) return; UpdatePosition(); - OnPositionChanged?.Invoke(this, previousPosition); + OnPositionChanged?.Invoke(this, arguments); } - private void RecalculateScale(ITransform2D _, Vector2D previousScale) + private void RecalculateScale(ITransform2D _, ITransform2D.ScaleChangedArguments arguments) { if (parentTransform is null) return; @@ -138,11 +138,11 @@ public class Transform2D : Behaviour, ITransform2D UpdateScale(); UpdatePosition(); - OnScaleChanged?.Invoke(this, previousScale); - OnPositionChanged?.Invoke(this, previousPosition); + OnScaleChanged?.Invoke(this, arguments); + OnPositionChanged?.Invoke(this, new(previousPosition)); } - private void RecalculateRotation(ITransform2D _, float previousRotation) + private void RecalculateRotation(ITransform2D _, ITransform2D.RotationChangedArguments arguments) { if (parentTransform is null) return; @@ -152,8 +152,8 @@ public class Transform2D : Behaviour, ITransform2D UpdateRotation(); UpdatePosition(); - OnRotationChanged?.Invoke(this, previousRotation); - OnPositionChanged?.Invoke(this, previousPosition); + OnRotationChanged?.Invoke(this, arguments); + OnPositionChanged?.Invoke(this, new(previousPosition)); } private void UpdateLocalPosition() @@ -247,21 +247,21 @@ public class Transform2D : Behaviour, ITransform2D UpdateLocalScale(); UpdateLocalRotation(); - OnPositionChanged?.Invoke(this, Position); - OnScaleChanged?.Invoke(this, Scale); - OnRotationChanged?.Invoke(this, Rotation); + OnPositionChanged?.Invoke(this, new(Position)); + OnScaleChanged?.Invoke(this, new(Scale)); + OnRotationChanged?.Invoke(this, new(Rotation)); } - private void LookForTransform2D(IBehaviourController sender, IBehaviour behaviourAdded) + private void LookForTransform2D(IBehaviourController sender, IBehaviourController.BehaviourAddedArguments arguments) { - if (behaviourAdded is not ITransform2D transform2D) + if (arguments.BehaviourAdded is not ITransform2D) return; UpdateReferences(UniverseObject.Parent); } - private void OnParentChanged(IUniverseObject sender, IUniverseObject? previousParent, IUniverseObject? newParent) + private void OnParentChanged(IUniverseObject sender, IUniverseObject.ParentChangedArguments arguments) { - UpdateReferences(newParent); + UpdateReferences(arguments.CurrentParent); } } diff --git a/Engine.Core/Universe.cs b/Engine.Core/Universe.cs index c1e7fce..1634cd8 100644 --- a/Engine.Core/Universe.cs +++ b/Engine.Core/Universe.cs @@ -7,18 +7,18 @@ namespace Syntriax.Engine.Core; [System.Diagnostics.DebuggerDisplay("UniverseObject Count: {_universeObjects.Count}")] public class Universe : BaseEntity, IUniverse { - public Event OnPreUpdate { get; set; } = new(); - public Event OnUpdate { get; set; } = new(); - public Event OnPostUpdate { get; set; } = new(); - public Event OnPreDraw { get; set; } = new(); - public Event OnDraw { get; set; } = new(); - public Event OnPostDraw { get; set; } = new(); - public Event OnUniverseObjectRegistered { get; set; } = new(); - public Event OnUniverseObjectUnRegistered { get; set; } = new(); - public Event OnTimeScaleChanged { get; set; } = new(); + public Event OnPreUpdate { get; init; } = new(); + public Event OnUpdate { get; init; } = new(); + public Event OnPostUpdate { get; init; } = new(); + public Event OnPreDraw { get; init; } = new(); + public Event OnDraw { get; init; } = new(); + public Event OnPostDraw { get; init; } = new(); + public Event OnUniverseObjectRegistered { get; init; } = new(); + public Event OnUniverseObjectUnRegistered { get; init; } = new(); + public Event OnTimeScaleChanged { get; init; } = new(); - private readonly Action cachedOnUniverseObjectFinalize = null!; - private readonly Action cachedOnUniverseObjectExitedUniverse = null!; + private readonly Event.EventHandler cachedOnUniverseObjectFinalize = null!; + private readonly Event.EventHandler cachedOnUniverseObjectExitedUniverse = null!; private readonly List _universeObjects = new(Constants.UNIVERSE_OBJECTS_SIZE_INITIAL); private float _timeScale = 1f; @@ -44,7 +44,7 @@ public class Universe : BaseEntity, IUniverse float previousTimeScale = _timeScale; _timeScale = value; - OnTimeScaleChanged?.Invoke(this, previousTimeScale); + OnTimeScaleChanged?.Invoke(this, new(previousTimeScale)); } } @@ -67,7 +67,7 @@ public class Universe : BaseEntity, IUniverse if (!universeObject.EnterUniverse(this)) throw new Exception($"{universeObject.Name} can't enter the universe"); - OnUniverseObjectRegistered?.Invoke(this, universeObject); + OnUniverseObjectRegistered?.Invoke(this, new(universeObject)); } public T InstantiateUniverseObject(params object?[]? args) where T : class, IUniverseObject @@ -102,7 +102,7 @@ public class Universe : BaseEntity, IUniverse if (!universeObject.Finalize()) throw new Exception($"{universeObject.Name} can't be finalized"); - OnUniverseObjectUnRegistered?.Invoke(this, universeObject); + OnUniverseObjectUnRegistered?.Invoke(this, new(universeObject)); } protected override void InitializeInternal() @@ -125,9 +125,9 @@ public class Universe : BaseEntity, IUniverse UnscaledTime = engineTime; Time = new(TimeSpan.FromTicks((long)(Time.TimeSinceStart.Ticks + engineTime.DeltaSpan.Ticks * TimeScale)), TimeSpan.FromTicks((long)(engineTime.DeltaSpan.Ticks * TimeScale))); - OnPreUpdate?.Invoke(this, Time); - OnUpdate?.Invoke(this, Time); - OnPostUpdate?.Invoke(this, Time); + OnPreUpdate?.Invoke(this, new(Time)); + OnUpdate?.Invoke(this, new(Time)); + OnPostUpdate?.Invoke(this, new(Time)); } public void Draw() @@ -145,7 +145,7 @@ public class Universe : BaseEntity, IUniverse Remove(universeObject); } - private void OnUniverseObjectExitedUniverse(IUniverseObject sender, IUniverse universe) + private void OnUniverseObjectExitedUniverse(IUniverseObject sender, IUniverseObject.ExitedUniverseArguments arguments) { if (sender is IUniverseObject universeObject) Remove(universeObject); diff --git a/Engine.Core/UniverseObject.cs b/Engine.Core/UniverseObject.cs index 7e19baa..85062ce 100644 --- a/Engine.Core/UniverseObject.cs +++ b/Engine.Core/UniverseObject.cs @@ -6,14 +6,15 @@ namespace Syntriax.Engine.Core; [System.Diagnostics.DebuggerDisplay("Name: {Name}, Initialized: {Initialized}")] public class UniverseObject : BaseEntity, IUniverseObject { - public Event OnEnteredUniverse { get; private set; } = new(); - public Event OnExitedUniverse { get; private set; } = new(); - public Event OnParentChanged { get; private set; } = new(); - public Event OnChildrenAdded { get; private set; } = new(); - public Event OnChildrenRemoved { get; private set; } = new(); - public Event OnActiveChanged { get; private set; } = new(); - public Event OnNameChanged { get; private set; } = new(); - public Event OnBehaviourControllerAssigned { get; private set; } = new(); + public Event OnEnteredUniverse { get; init; } = new(); + public Event OnExitedUniverse { get; init; } = new(); + public Event OnParentChanged { get; init; } = new(); + public Event OnChildrenAdded { get; init; } = new(); + public Event OnChildrenRemoved { get; init; } = new(); + + public Event OnActiveChanged { get; init; } = new(); + public Event OnNameChanged { get; init; } = new(); + public Event OnBehaviourControllerAssigned { get; init; } = new(); private string _name = nameof(UniverseObject); private IUniverse _universe = null!; @@ -37,7 +38,7 @@ public class UniverseObject : BaseEntity, IUniverseObject string previousName = _name; _name = value; - OnNameChanged?.Invoke(this, previousName); + OnNameChanged?.Invoke(this, new(previousName)); } } @@ -50,7 +51,7 @@ public class UniverseObject : BaseEntity, IUniverseObject _universe = universe; UpdateActive(); OnEnteringUniverse(universe); - OnEnteredUniverse?.Invoke(this, universe); + OnEnteredUniverse?.Invoke(this, new(universe)); return true; } @@ -62,7 +63,7 @@ public class UniverseObject : BaseEntity, IUniverseObject OnExitingUniverse(universe); _universe = null!; - OnExitedUniverse?.Invoke(this, universe); + OnExitedUniverse?.Invoke(this, new(universe)); return true; } @@ -93,7 +94,7 @@ public class UniverseObject : BaseEntity, IUniverseObject } UpdateActive(); - OnParentChanged?.Invoke(this, previousParent, parent); + OnParentChanged?.Invoke(this, new(previousParent, parent)); } public void AddChild(IUniverseObject parent) @@ -103,7 +104,7 @@ public class UniverseObject : BaseEntity, IUniverseObject _children.Add(parent); parent.SetParent(this); - OnChildrenAdded?.Invoke(this, parent); + OnChildrenAdded?.Invoke(this, new(parent)); } public void RemoveChild(IUniverseObject child) @@ -112,7 +113,7 @@ public class UniverseObject : BaseEntity, IUniverseObject return; child.SetParent(null); - OnChildrenRemoved?.Invoke(this, child); + OnChildrenRemoved?.Invoke(this, new(child)); } protected virtual void OnAssign(IBehaviourController behaviourController) { } @@ -134,8 +135,8 @@ public class UniverseObject : BaseEntity, IUniverseObject stateEnable.OnEnabledChanged.AddListener(OnStateEnabledChanged); } - private void OnParentActiveChanged(IActive sender, bool previousState) => UpdateActive(); - private void OnStateEnabledChanged(IStateEnable sender, bool previousState) => UpdateActive(); + private void OnParentActiveChanged(IActive sender, IActive.ActiveChangedArguments arguments) => UpdateActive(); + private void OnStateEnabledChanged(IStateEnable sender, IStateEnable.EnabledChangedArguments arguments) => UpdateActive(); private void UpdateActive() { @@ -143,7 +144,7 @@ public class UniverseObject : BaseEntity, IUniverseObject _isActive = StateEnable.Enabled && (Parent?.IsActive ?? true); if (previousActive != IsActive) - OnActiveChanged?.Invoke(this, previousActive); + OnActiveChanged?.Invoke(this, new(previousActive)); } protected override void UnassignInternal() diff --git a/Engine.Physics2D/Abstract/ICollider2D.cs b/Engine.Physics2D/Abstract/ICollider2D.cs index 7dd6307..a6cfa7d 100644 --- a/Engine.Physics2D/Abstract/ICollider2D.cs +++ b/Engine.Physics2D/Abstract/ICollider2D.cs @@ -44,7 +44,7 @@ public interface ICollider2D : IBehaviour void Resolve(CollisionDetectionInformation collisionDetectionInformation); void Trigger(ICollider2D initiator); - delegate void CollisionDetectedEventHandler(ICollider2D sender, CollisionDetectionInformation collisionDetectionInformation); - delegate void CollisionResolvedEventHandler(ICollider2D sender, CollisionDetectionInformation collisionDetectionInformation); - delegate void TriggeredEventHandler(ICollider2D sender, ICollider2D initiatorCollider); + readonly record struct CollisionDetectedArguments(ICollider2D sender, CollisionDetectionInformation collisionDetectionInformation); + readonly record struct CollisionResolvedArguments(ICollider2D sender, CollisionDetectionInformation collisionDetectionInformation); + readonly record struct TriggeredArguments(ICollider2D sender, ICollider2D initiatorCollider); } diff --git a/Engine.Physics2D/Abstract/IPhysicsEngine2D.cs b/Engine.Physics2D/Abstract/IPhysicsEngine2D.cs index 290f5bd..c096daf 100644 --- a/Engine.Physics2D/Abstract/IPhysicsEngine2D.cs +++ b/Engine.Physics2D/Abstract/IPhysicsEngine2D.cs @@ -35,6 +35,6 @@ public interface IPhysicsEngine2D /// The time step. void StepIndividual(IRigidBody2D rigidBody, float deltaTime); - delegate void PhysicsIterationEventHandler(IPhysicsEngine2D sender, float iterationDeltaTime); - delegate void PhysicsStepEventHandler(IPhysicsEngine2D sender, float stepDeltaTime); + readonly record struct PhysicsIterationArguments(IPhysicsEngine2D sender, float iterationDeltaTime); + readonly record struct PhysicsStepArguments(IPhysicsEngine2D sender, float stepDeltaTime); } diff --git a/Engine.Physics2D/Collider2DBehaviourBase.cs b/Engine.Physics2D/Collider2DBehaviourBase.cs index 8d04fcd..e9601b5 100644 --- a/Engine.Physics2D/Collider2DBehaviourBase.cs +++ b/Engine.Physics2D/Collider2DBehaviourBase.cs @@ -4,13 +4,30 @@ namespace Syntriax.Engine.Physics2D; public abstract class Collider2DBehaviourBase : Behaviour2D, ICollider2D { - public Event OnCollisionDetected { get; private set; } = new(); - public Event OnCollisionResolved { get; private set; } = new(); - public Event OnTriggered { get; private set; } = new(); + public Event OnCollisionDetected { get; init; } = new(); + public Event OnCollisionResolved { get; init; } = new(); + public Event OnTriggered { get; init; } = new(); + + private readonly Event.EventHandler cachedOnBehaviourAddedToController = null!; + private readonly Event.EventHandler cachedOnBehaviourRemovedFromController = null!; + private readonly Event.EventHandler cachedSetNeedsRecalculationFromPosition = null!; + private readonly Event.EventHandler cachedSetNeedsRecalculationFromRotation = null!; + private readonly Event.EventHandler cachedSetNeedsRecalculationFromScale = null!; + private readonly Event.EventHandler cachedUpdateRigidBody2D = null!; protected bool NeedsRecalculation { get; set; } = true; protected IRigidBody2D? _rigidBody2D = null; + protected Collider2DBehaviourBase() + { + cachedOnBehaviourAddedToController = OnBehaviourAddedToController; + cachedOnBehaviourRemovedFromController = OnBehaviourRemovedFromController; + cachedSetNeedsRecalculationFromPosition = SetNeedsRecalculationFromPosition; + cachedSetNeedsRecalculationFromRotation = SetNeedsRecalculationFromRotation; + cachedSetNeedsRecalculationFromScale = SetNeedsRecalculationFromScale; + cachedUpdateRigidBody2D = UpdateRigidBody2D; + } + public IRigidBody2D? RigidBody2D => _rigidBody2D; public bool IsTrigger { get; set; } = false; @@ -29,44 +46,44 @@ public abstract class Collider2DBehaviourBase : Behaviour2D, ICollider2D { BehaviourController.TryGetBehaviourInParent(out _rigidBody2D); - BehaviourController.OnBehaviourAdded.AddListener(OnBehaviourAddedToController); - BehaviourController.OnBehaviourRemoved.AddListener(OnBehaviourRemovedFromController); + BehaviourController.OnBehaviourAdded.AddListener(cachedOnBehaviourAddedToController); + BehaviourController.OnBehaviourRemoved.AddListener(cachedOnBehaviourRemovedFromController); - Transform.OnPositionChanged.AddListener(SetNeedsRecalculationFromPosition); - Transform.OnRotationChanged.AddListener(SetNeedsRecalculationFromRotation); - Transform.OnScaleChanged.AddListener(SetNeedsRecalculationFromScale); - UniverseObject.OnParentChanged.AddListener(UpdateRigidBody2D); + Transform.OnPositionChanged.AddListener(cachedSetNeedsRecalculationFromPosition); + Transform.OnRotationChanged.AddListener(cachedSetNeedsRecalculationFromRotation); + Transform.OnScaleChanged.AddListener(cachedSetNeedsRecalculationFromScale); + UniverseObject.OnParentChanged.AddListener(cachedUpdateRigidBody2D); } - private void UpdateRigidBody2D(IUniverseObject sender, IUniverseObject? previousParent, IUniverseObject? newParent) + private void UpdateRigidBody2D(IUniverseObject sender, IUniverseObject.ParentChangedArguments arguments) { BehaviourController.TryGetBehaviourInParent(out _rigidBody2D); } - private void OnBehaviourAddedToController(IBehaviourController _, IBehaviour behaviour) + private void OnBehaviourAddedToController(IBehaviourController sender, IBehaviourController.BehaviourAddedArguments arguments) { - if (behaviour is IRigidBody2D rigidBody) + if (arguments.BehaviourAdded is IRigidBody2D rigidBody) _rigidBody2D = rigidBody; } - private void OnBehaviourRemovedFromController(IBehaviourController _, IBehaviour behaviour) + private void OnBehaviourRemovedFromController(IBehaviourController sender, IBehaviourController.BehaviourRemovedArguments arguments) { - if (behaviour is IRigidBody2D _) + if (arguments.BehaviourRemoved is IRigidBody2D) _rigidBody2D = null; } - private void SetNeedsRecalculationFromScale(ITransform2D sender, Vector2D previousScale) => NeedsRecalculation = true; - private void SetNeedsRecalculationFromPosition(ITransform2D sender, Vector2D previousPosition) => NeedsRecalculation = true; - private void SetNeedsRecalculationFromRotation(ITransform2D sender, float previousRotation) => NeedsRecalculation = true; + private void SetNeedsRecalculationFromPosition(ITransform2D sender, ITransform2D.PositionChangedArguments arguments) => NeedsRecalculation = true; + private void SetNeedsRecalculationFromScale(ITransform2D sender, ITransform2D.ScaleChangedArguments arguments) => NeedsRecalculation = true; + private void SetNeedsRecalculationFromRotation(ITransform2D sender, ITransform2D.RotationChangedArguments arguments) => NeedsRecalculation = true; protected override void OnFinalize() { - BehaviourController.OnBehaviourAdded.RemoveListener(OnBehaviourAddedToController); - BehaviourController.OnBehaviourRemoved.RemoveListener(OnBehaviourRemovedFromController); - Transform.OnScaleChanged.RemoveListener(SetNeedsRecalculationFromScale); + BehaviourController.OnBehaviourAdded.RemoveListener(cachedOnBehaviourAddedToController); + BehaviourController.OnBehaviourRemoved.RemoveListener(cachedOnBehaviourRemovedFromController); + Transform.OnScaleChanged.RemoveListener(cachedSetNeedsRecalculationFromScale); - Transform.OnPositionChanged.RemoveListener(SetNeedsRecalculationFromPosition); - Transform.OnRotationChanged.RemoveListener(SetNeedsRecalculationFromRotation); + Transform.OnPositionChanged.RemoveListener(cachedSetNeedsRecalculationFromPosition); + Transform.OnRotationChanged.RemoveListener(cachedSetNeedsRecalculationFromRotation); } public void Detect(CollisionDetectionInformation collisionDetectionInformation) => OnCollisionDetected?.Invoke(this, collisionDetectionInformation); diff --git a/Engine.Physics2D/PhysicsCoroutineManager.cs b/Engine.Physics2D/PhysicsCoroutineManager.cs index 20586ad..53c6c14 100644 --- a/Engine.Physics2D/PhysicsCoroutineManager.cs +++ b/Engine.Physics2D/PhysicsCoroutineManager.cs @@ -7,6 +7,8 @@ namespace Syntriax.Engine.Physics2D; public class PhysicsCoroutineManager : UniverseObject { + private readonly Event.EventHandler cachedOnUpdate = null!; + private readonly List enumerators = []; private IPhysicsEngine2D? physicsEngine = null; @@ -49,7 +51,7 @@ public class PhysicsCoroutineManager : UniverseObject universe.OnUpdate.RemoveListener(OnUpdate); } - private void OnUpdate(IUniverse sender, UniverseTime engineTime) + private void OnUpdate(IUniverse sender, IUniverse.UpdateArguments arguments) { if (Universe is not IUniverse universe) return; @@ -61,4 +63,9 @@ public class PhysicsCoroutineManager : UniverseObject universe.OnUpdate.RemoveListener(OnUpdate); } } + + public PhysicsCoroutineManager() + { + cachedOnUpdate = OnUpdate; + } } diff --git a/Engine.Physics2D/PhysicsEngine2D.cs b/Engine.Physics2D/PhysicsEngine2D.cs index e8f074c..cba93cf 100644 --- a/Engine.Physics2D/PhysicsEngine2D.cs +++ b/Engine.Physics2D/PhysicsEngine2D.cs @@ -4,8 +4,10 @@ namespace Syntriax.Engine.Physics2D; public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D { - public Event OnPhysicsIteration { get; private set; } = new(); - public Event OnPhysicsStep { get; private set; } = new(); + public Event OnPhysicsIteration { get; init; } = new(); + public Event OnPhysicsStep { get; init; } = new(); + + private readonly Event.EventHandler cachedOnPreUpdate = null!; private float physicsTicker = 0f; private int _iterationPerStep = 1; @@ -192,9 +194,9 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D universe.OnPreUpdate.RemoveListener(OnEnginePreUpdate); } - private void OnEnginePreUpdate(IUniverse sender, UniverseTime engineTime) + private void OnEnginePreUpdate(IUniverse sender, IUniverse.UpdateArguments arguments) { - physicsTicker += engineTime.DeltaTime; + physicsTicker += arguments.EngineTime.DeltaTime; while (physicsTicker >= IterationPeriod) { @@ -207,11 +209,15 @@ public class PhysicsEngine2D : UniverseObject, IPhysicsEngine2D { collisionDetector = new CollisionDetector2D(); collisionResolver = new CollisionResolver2D(); + + cachedOnPreUpdate = OnEnginePreUpdate; } public PhysicsEngine2D(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver) { this.collisionDetector = collisionDetector; this.collisionResolver = collisionResolver; + + cachedOnPreUpdate = OnEnginePreUpdate; } } diff --git a/Engine.Physics2D/PhysicsEngine2DStandalone.cs b/Engine.Physics2D/PhysicsEngine2DStandalone.cs index 2e200f9..0ee2eed 100644 --- a/Engine.Physics2D/PhysicsEngine2DStandalone.cs +++ b/Engine.Physics2D/PhysicsEngine2DStandalone.cs @@ -6,8 +6,11 @@ namespace Syntriax.Engine.Physics2D; public class PhysicsEngine2DStandalone : IPhysicsEngine2D { - public Event OnPhysicsIteration { get; private set; } = new(); - public Event OnPhysicsStep { get; private set; } = new(); + public Event OnPhysicsIteration { get; init; } = new(); + public Event OnPhysicsStep { get; init; } = new(); + + private readonly Event.EventHandler cachedOnBehaviourAdded = null!; + private readonly Event.EventHandler cachedOnBehaviourRemoved = null!; private readonly List rigidBodies = new(32); private readonly List colliders = new(64); @@ -29,16 +32,16 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D foreach (ICollider2D collider2D in rigidBody.BehaviourController.GetBehaviours()) colliders.Add(collider2D); - rigidBody.BehaviourController.OnBehaviourAdded.AddListener(OnBehaviourAdded); - rigidBody.BehaviourController.OnBehaviourRemoved.AddListener(OnBehaviourRemoved); + rigidBody.BehaviourController.OnBehaviourAdded.AddListener(cachedOnBehaviourAdded); + rigidBody.BehaviourController.OnBehaviourRemoved.AddListener(cachedOnBehaviourRemoved); } public void RemoveRigidBody(IRigidBody2D rigidBody) { rigidBodies.Remove(rigidBody); - rigidBody.BehaviourController.OnBehaviourAdded.RemoveListener(OnBehaviourAdded); - rigidBody.BehaviourController.OnBehaviourRemoved.RemoveListener(OnBehaviourRemoved); + rigidBody.BehaviourController.OnBehaviourAdded.RemoveListener(cachedOnBehaviourAdded); + rigidBody.BehaviourController.OnBehaviourRemoved.RemoveListener(cachedOnBehaviourRemoved); } public void Step(float deltaTime) @@ -175,17 +178,17 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D rigidBody.Transform.Rotation += rigidBody.AngularVelocity * intervalDeltaTime; } - private void OnBehaviourAdded(IBehaviourController controller, IBehaviour behaviour) + private void OnBehaviourAdded(IBehaviourController sender, IBehaviourController.BehaviourAddedArguments arguments) { - if (behaviour is not ICollider2D collider2D) + if (arguments.BehaviourAdded is not ICollider2D collider2D) return; colliders.Add(collider2D); } - private void OnBehaviourRemoved(IBehaviourController controller, IBehaviour behaviour) + private void OnBehaviourRemoved(IBehaviourController sender, IBehaviourController.BehaviourRemovedArguments arguments) { - if (behaviour is not ICollider2D collider2D) + if (arguments.BehaviourRemoved is not ICollider2D collider2D) return; colliders.Remove(collider2D); @@ -195,11 +198,17 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D { collisionDetector = new CollisionDetector2D(); collisionResolver = new CollisionResolver2D(); + + cachedOnBehaviourAdded = OnBehaviourAdded; + cachedOnBehaviourRemoved = OnBehaviourRemoved; } public PhysicsEngine2DStandalone(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver) { this.collisionDetector = collisionDetector; this.collisionResolver = collisionResolver; + + cachedOnBehaviourAdded = OnBehaviourAdded; + cachedOnBehaviourRemoved = OnBehaviourRemoved; } } diff --git a/Engine.Systems/Input/IButtonInputs.cs b/Engine.Systems/Input/IButtonInputs.cs index 6361772..3501ee3 100644 --- a/Engine.Systems/Input/IButtonInputs.cs +++ b/Engine.Systems/Input/IButtonInputs.cs @@ -4,15 +4,15 @@ namespace Syntriax.Engine.Systems.Input; public interface IButtonInputs : IHasStateEnable { - event ButtonCallbackEventHandler? OnAnyButtonPressed; - event ButtonCallbackEventHandler? OnAnyButtonReleased; + Event, ButtonCallbackArguments> OnAnyButtonPressed { get; } + Event, ButtonCallbackArguments> OnAnyButtonReleased { get; } - void RegisterOnPress(T button, ButtonCallbackEventHandler callback); - void UnregisterOnPress(T button, ButtonCallbackEventHandler callback); - void RegisterOnRelease(T button, ButtonCallbackEventHandler callback); - void UnregisterOnRelease(T button, ButtonCallbackEventHandler callback); + void RegisterOnPress(T button, ButtonCallbackArguments callback); + void UnregisterOnPress(T button, ButtonCallbackArguments callback); + void RegisterOnRelease(T button, ButtonCallbackArguments callback); + void UnregisterOnRelease(T button, ButtonCallbackArguments callback); bool IsPressed(T button); - delegate void ButtonCallbackEventHandler(IButtonInputs buttonInputs, T button); + readonly record struct ButtonCallbackArguments(T Button); } diff --git a/Engine.Systems/StateMachine/IState.cs b/Engine.Systems/StateMachine/IState.cs index e3bb49e..f30b260 100644 --- a/Engine.Systems/StateMachine/IState.cs +++ b/Engine.Systems/StateMachine/IState.cs @@ -4,10 +4,10 @@ namespace Syntriax.Engine.Systems.StateMachine; public interface IState : IEntity, INameable { - event StateUpdateEventHandler? OnStateUpdate; - event StateTransitionedFromEventHandler? OnStateTransitionedFrom; - event StateTransitionedToEventHandler? OnStateTransitionedTo; - event StateTransitionReadyEventHandler? OnStateTransitionReady; + Event OnStateUpdate { get; } + Event OnStateTransitionedFrom { get; } + Event OnStateTransitionedTo { get; } + Event OnStateTransitionReady { get; } IState? GetNextState(); @@ -15,8 +15,7 @@ public interface IState : IEntity, INameable void TransitionTo(IState from); void TransitionFrom(IState to); - delegate void StateUpdateEventHandler(IState sender); - delegate void StateTransitionedFromEventHandler(IState sender, IState toState); - delegate void StateTransitionedToEventHandler(IState sender, IState fromState); - delegate void StateTransitionReadyEventHandler(IState sender, IState toState); + readonly record struct StateTransitionedFromArguments(IState ToState); + readonly record struct StateTransitionedToArguments(IState FromState); + readonly record struct StateTransitionReadyArguments(IState ToState); } diff --git a/Engine.Systems/StateMachine/State.cs b/Engine.Systems/StateMachine/State.cs index 87874dc..b6be045 100644 --- a/Engine.Systems/StateMachine/State.cs +++ b/Engine.Systems/StateMachine/State.cs @@ -6,11 +6,11 @@ namespace Syntriax.Engine.Systems.StateMachine; public class State : BaseEntity, IState { - public event IState.StateUpdateEventHandler? OnStateUpdate = null; - public event IState.StateTransitionedFromEventHandler? OnStateTransitionedFrom = null; - public event IState.StateTransitionedToEventHandler? OnStateTransitionedTo = null; - public event IState.StateTransitionReadyEventHandler? OnStateTransitionReady = null; - public Event OnNameChanged { get; private set; } = new(); + public Event OnStateUpdate { get; init; } = new(); + public Event OnStateTransitionedFrom { get; init; } = new(); + public Event OnStateTransitionedTo { get; init; } = new(); + public Event OnStateTransitionReady { get; init; } = new(); + public Event OnNameChanged { get; init; } = new(); private readonly List transitions = []; private readonly Dictionary possibleTransitions = []; @@ -28,7 +28,7 @@ public class State : BaseEntity, IState string previousName = _name; _name = value; - OnNameChanged?.Invoke(this, previousName); + OnNameChanged?.Invoke(this, new(previousName)); } } @@ -53,12 +53,12 @@ public class State : BaseEntity, IState public void Update() { if (GetNextState() is IState transitionState) - OnStateTransitionReady?.Invoke(this, transitionState); + OnStateTransitionReady?.Invoke(this, new(transitionState)); OnStateUpdate?.Invoke(this); } - public void TransitionTo(IState from) => OnStateTransitionedTo?.Invoke(this, from); - public void TransitionFrom(IState to) => OnStateTransitionedFrom?.Invoke(this, to); + public void TransitionTo(IState from) => OnStateTransitionedTo?.Invoke(this, new(from)); + public void TransitionFrom(IState to) => OnStateTransitionedFrom?.Invoke(this, new(to)); public IState? GetNextState() { diff --git a/Engine.Systems/StateMachine/StateBehaviourBase.cs b/Engine.Systems/StateMachine/StateBehaviourBase.cs index 4518839..439da89 100644 --- a/Engine.Systems/StateMachine/StateBehaviourBase.cs +++ b/Engine.Systems/StateMachine/StateBehaviourBase.cs @@ -4,13 +4,11 @@ namespace Syntriax.Engine.Systems.StateMachine; public abstract class StateBehaviourBase : Behaviour, IState { - public event IState.StateUpdateEventHandler? OnStateUpdate = null; - public event IState.StateTransitionedFromEventHandler? OnStateTransitionedFrom = null; - public event IState.StateTransitionedToEventHandler? OnStateTransitionedTo = null; - - public Event OnNameChanged { get; private set; } = new(); - - public abstract event IState.StateTransitionReadyEventHandler? OnStateTransitionReady; + public Event OnStateUpdate { get; init; } = new(); + public Event OnStateTransitionedFrom { get; init; } = new(); + public Event OnStateTransitionedTo { get; init; } = new(); + public Event OnStateTransitionReady { get; init; } = new(); + public Event OnNameChanged { get; init; } = new(); private string _name = string.Empty; public string Name @@ -23,7 +21,7 @@ public abstract class StateBehaviourBase : Behaviour, IState string previousName = _name; _name = value; - OnNameChanged?.Invoke(this, previousName); + OnNameChanged?.Invoke(this, new(previousName)); } } @@ -38,14 +36,14 @@ public abstract class StateBehaviourBase : Behaviour, IState public void TransitionTo(IState from) { OnTransitionedToState(from); - OnStateTransitionedTo?.Invoke(this, from); + OnStateTransitionedTo?.Invoke(this, new(from)); } protected virtual void OnTransitionedFromState(IState to) { } public void TransitionFrom(IState to) { OnTransitionedFromState(to); - OnStateTransitionedFrom?.Invoke(this, to); + OnStateTransitionedFrom?.Invoke(this, new(to)); } public abstract IState? GetNextState(); diff --git a/Engine.Systems/StateMachine/StateMachine.cs b/Engine.Systems/StateMachine/StateMachine.cs index 10b4be9..937975c 100644 --- a/Engine.Systems/StateMachine/StateMachine.cs +++ b/Engine.Systems/StateMachine/StateMachine.cs @@ -5,9 +5,17 @@ namespace Syntriax.Engine.Systems.StateMachine; public class StateMachine : Behaviour { - public event StateChangedEventHandler? OnStateChanged = null; + public Event OnStateChanged { get; init; } = new(); + + private readonly Event.EventHandler cachedOnStateTransitionReady = null!; private IState _state = new State(); + + public StateMachine() + { + cachedOnStateTransitionReady = OnStateTransitionReady; + } + [Serialize] public IState State { @@ -18,20 +26,20 @@ public class StateMachine : Behaviour return; IState previousState = _state; - previousState.OnStateTransitionReady -= OnStateTransitionReady; + previousState.OnStateTransitionReady.RemoveListener(cachedOnStateTransitionReady); _state = value; previousState.TransitionFrom(value); value.TransitionTo(_state); - OnStateChanged?.Invoke(this, previousState, value); + OnStateChanged?.Invoke(this, new(value, previousState)); - value.OnStateTransitionReady += OnStateTransitionReady; + value.OnStateTransitionReady.AddListener(cachedOnStateTransitionReady); } } - private void OnStateTransitionReady(IState sender, IState toState) + private void OnStateTransitionReady(IState sender, IState.StateTransitionReadyArguments arguments) { - State = toState; + State = arguments.ToState; while (State.GetNextState() is IState nextState) State = nextState; } @@ -47,5 +55,5 @@ public class StateMachine : Behaviour State.Update(); } - public delegate void StateChangedEventHandler(StateMachine sender, IState previousState, IState newState); + public readonly record struct StateChangedArguments(IState CurrentState, IState PreviousState); } diff --git a/Engine.Systems/Time/IReadOnlyStopwatch.cs b/Engine.Systems/Time/IReadOnlyStopwatch.cs index 3caaaa9..ea28155 100644 --- a/Engine.Systems/Time/IReadOnlyStopwatch.cs +++ b/Engine.Systems/Time/IReadOnlyStopwatch.cs @@ -1,18 +1,19 @@ +using Syntriax.Engine.Core; + namespace Syntriax.Engine.Systems.Time; public interface IReadOnlyStopwatch { - event StopwatchEventHandler? OnStarted; - event StopwatchDeltaEventHandler? OnDelta; - event StopwatchEventHandler? OnStopped; + Event OnStarted { get; } + Event OnDelta { get; } + Event OnStopped { get; } double Time { get; } TimerState State { get; } - event StopwatchEventHandler? OnPaused; - event StopwatchEventHandler? OnResumed; + Event OnPaused { get; } + Event OnResumed { get; } - delegate void StopwatchEventHandler(IReadOnlyStopwatch sender); - delegate void StopwatchDeltaEventHandler(IReadOnlyStopwatch sender, double delta); + readonly record struct StopwatchDeltaArguments(double Delta); } diff --git a/Engine.Systems/Time/IReadOnlyTicker.cs b/Engine.Systems/Time/IReadOnlyTicker.cs index 9ffec3b..665671f 100644 --- a/Engine.Systems/Time/IReadOnlyTicker.cs +++ b/Engine.Systems/Time/IReadOnlyTicker.cs @@ -1,11 +1,11 @@ +using Syntriax.Engine.Core; + namespace Syntriax.Engine.Systems.Time; public interface IReadOnlyTicker : IReadOnlyStopwatch { - event TickerTickEventHandler? OnTick; + Event OnTick { get; } int TickCounter { get; } double TickPeriod { get; set; } - - delegate void TickerTickEventHandler(IReadOnlyTicker sender); } diff --git a/Engine.Systems/Time/IReadOnlyTimer.cs b/Engine.Systems/Time/IReadOnlyTimer.cs index 660ccb7..c1e2a51 100644 --- a/Engine.Systems/Time/IReadOnlyTimer.cs +++ b/Engine.Systems/Time/IReadOnlyTimer.cs @@ -1,13 +1,15 @@ +using Syntriax.Engine.Core; + namespace Syntriax.Engine.Systems.Time; public interface IReadOnlyTimer { - event TimerEventHandler? OnStarted; - event TimerDeltaEventHandler? OnDelta; - event TimerEventHandler? OnStopped; + Event OnStarted { get; } + Event OnDelta { get; } + Event OnStopped { get; } - event TimerEventHandler? OnPaused; - event TimerEventHandler? OnResumed; + Event OnPaused { get; } + Event OnResumed { get; } double StartTime { get; } double Remaining { get; } @@ -16,7 +18,6 @@ public interface IReadOnlyTimer TimerState State { get; } - delegate void TimerEventHandler(IReadOnlyTimer sender); - delegate void TimerDeltaEventHandler(IReadOnlyTimer sender, double delta); + readonly record struct TimerDeltaArguments(double delta); } diff --git a/Engine.Systems/Time/ITicker.cs b/Engine.Systems/Time/ITicker.cs index 8bb1fc2..1d88e4a 100644 --- a/Engine.Systems/Time/ITicker.cs +++ b/Engine.Systems/Time/ITicker.cs @@ -1,11 +1,11 @@ +using Syntriax.Engine.Core; + namespace Syntriax.Engine.Systems.Time; public interface ITicker : IStopwatch { - event TickerTickEventHandler? OnTick; + Event OnTick { get; } int TickCounter { get; } double Period { get; set; } - - delegate void TickerTickEventHandler(ITicker sender); } diff --git a/Engine.Systems/Time/StopwatchBehaviour.cs b/Engine.Systems/Time/StopwatchBehaviour.cs index 96bcb8a..16b37af 100644 --- a/Engine.Systems/Time/StopwatchBehaviour.cs +++ b/Engine.Systems/Time/StopwatchBehaviour.cs @@ -4,11 +4,11 @@ namespace Syntriax.Engine.Systems.Time; public class StopwatchBehaviour : Behaviour, IStopwatch { - public event IReadOnlyStopwatch.StopwatchEventHandler? OnStarted = null; - public event IReadOnlyStopwatch.StopwatchDeltaEventHandler? OnDelta = null; - public event IReadOnlyStopwatch.StopwatchEventHandler? OnStopped = null; - public event IReadOnlyStopwatch.StopwatchEventHandler? OnPaused = null; - public event IReadOnlyStopwatch.StopwatchEventHandler? OnResumed = null; + public Event OnStarted { get; init; } = new(); + public Event OnDelta { get; init; } = new(); + public Event OnStopped { get; init; } = new(); + public Event OnPaused { get; init; } = new(); + public Event OnResumed { get; init; } = new(); public double Time { get; protected set; } = 0f; public TimerState State { get; protected set; } = TimerState.Idle; @@ -46,7 +46,7 @@ public class StopwatchBehaviour : Behaviour, IStopwatch double delta = Universe.Time.DeltaSpan.TotalSeconds; Time += delta; - OnDelta?.Invoke(this, delta); + OnDelta?.Invoke(this, new(delta)); } protected override void OnEnteredUniverse(IUniverse universe) diff --git a/Engine.Systems/Time/TickerBehaviour.cs b/Engine.Systems/Time/TickerBehaviour.cs index 9f82b30..f60a775 100644 --- a/Engine.Systems/Time/TickerBehaviour.cs +++ b/Engine.Systems/Time/TickerBehaviour.cs @@ -4,7 +4,7 @@ namespace Syntriax.Engine.Systems.Time; public class TickerBehaviour : StopwatchBehaviour, ITicker { - public event ITicker.TickerTickEventHandler? OnTick = null; + public Event OnTick { get; init; } = new(); public double Period { get; set; } = 1f; public int TickCounter { get; private set; } = 0; diff --git a/Engine.Systems/Time/TimerBehaviour.cs b/Engine.Systems/Time/TimerBehaviour.cs index 533fea4..5985035 100644 --- a/Engine.Systems/Time/TimerBehaviour.cs +++ b/Engine.Systems/Time/TimerBehaviour.cs @@ -4,11 +4,11 @@ namespace Syntriax.Engine.Systems.Time; public class TimerBehaviour : Behaviour, ITimer { - public event IReadOnlyTimer.TimerEventHandler? OnStarted = null; - public event IReadOnlyTimer.TimerDeltaEventHandler? OnDelta = null; - public event IReadOnlyTimer.TimerEventHandler? OnStopped = null; - public event IReadOnlyTimer.TimerEventHandler? OnPaused = null; - public event IReadOnlyTimer.TimerEventHandler? OnResumed = null; + public Event OnStarted { get; init; } = new(); + public Event OnDelta { get; init; } = new(); + public Event OnStopped { get; init; } = new(); + public Event OnPaused { get; init; } = new(); + public Event OnResumed { get; init; } = new(); public TimerState State { get; protected set; } = TimerState.Idle; public double StartTime { get; protected set; } = 0f; @@ -61,7 +61,7 @@ public class TimerBehaviour : Behaviour, ITimer double delta = Universe.Time.DeltaSpan.TotalSeconds; Remaining -= delta; - OnDelta?.Invoke(this, delta); + OnDelta?.Invoke(this, new(delta)); if (Remaining <= .0f) Stop(); diff --git a/Engine.Systems/Tween/ITween.cs b/Engine.Systems/Tween/ITween.cs index 6f90137..f4d881b 100644 --- a/Engine.Systems/Tween/ITween.cs +++ b/Engine.Systems/Tween/ITween.cs @@ -1,16 +1,18 @@ +using Syntriax.Engine.Core; + namespace Syntriax.Engine.Systems.Tween; public interface ITween { - event TweenEventHandler? OnStarted; - event TweenEventHandler? OnPaused; - event TweenEventHandler? OnResumed; - event TweenEventHandler? OnCancelled; - event TweenEventHandler? OnCompleted; - event TweenEventHandler? OnEnded; + Event OnStarted { get; } + Event OnPaused { get; } + Event OnResumed { get; } + Event OnCancelled { get; } + Event OnCompleted { get; } + Event OnEnded { get; } - event TweenEventHandler? OnUpdated; - event TweenDeltaEventHandler? OnDeltaUpdated; + Event OnUpdated { get; } + Event OnDeltaUpdated { get; } TweenState State { get; set; } @@ -19,7 +21,6 @@ public interface ITween float Progress { get; } float Value { get; } - delegate void TweenEventHandler(ITween sender); - delegate void TweenDeltaEventHandler(ITween sender, float delta); + readonly record struct TweenDeltaArguments(float Delta); } diff --git a/Engine.Systems/Tween/Tween.cs b/Engine.Systems/Tween/Tween.cs index 5a4d48a..72039f7 100644 --- a/Engine.Systems/Tween/Tween.cs +++ b/Engine.Systems/Tween/Tween.cs @@ -4,14 +4,14 @@ namespace Syntriax.Engine.Systems.Tween; internal class Tween : ITween { - public event ITween.TweenEventHandler? OnStarted = null; - public event ITween.TweenEventHandler? OnPaused = null; - public event ITween.TweenEventHandler? OnResumed = null; - public event ITween.TweenEventHandler? OnCancelled = null; - public event ITween.TweenEventHandler? OnCompleted = null; - public event ITween.TweenEventHandler? OnEnded = null; - public event ITween.TweenEventHandler? OnUpdated = null; - public event ITween.TweenDeltaEventHandler? OnDeltaUpdated = null; + public Event OnStarted { get; init; } = new(); + public Event OnPaused { get; init; } = new(); + public Event OnResumed { get; init; } = new(); + public Event OnCancelled { get; init; } = new(); + public Event OnCompleted { get; init; } = new(); + public Event OnEnded { get; init; } = new(); + public Event OnUpdated { get; init; } = new(); + public Event OnDeltaUpdated { get; init; } = new(); private TweenState _state = TweenState.Idle; public TweenState State @@ -60,7 +60,7 @@ internal class Tween : ITween Progress = Counter / Duration; OnUpdated?.Invoke(this); - OnDeltaUpdated?.Invoke(this, Easing.Evaluate(Progress) - Easing.Evaluate(previousProgress)); + OnDeltaUpdated?.Invoke(this, new(Easing.Evaluate(Progress) - Easing.Evaluate(previousProgress))); if (_counter >= Duration) State = TweenState.Completed; diff --git a/Engine.Systems/Tween/TweenExtensions.cs b/Engine.Systems/Tween/TweenExtensions.cs index aa10375..771e976 100644 --- a/Engine.Systems/Tween/TweenExtensions.cs +++ b/Engine.Systems/Tween/TweenExtensions.cs @@ -1,7 +1,5 @@ using System; -using Syntriax.Engine.Core; - namespace Syntriax.Engine.Systems.Tween; public static class TweenExtensions @@ -11,14 +9,14 @@ public static class TweenExtensions Tween tweenConcrete = (Tween)tween; int counter = count; - tweenConcrete.OnCompleted += _ => + tweenConcrete.OnCompleted.AddListener(_ => { if (counter-- <= 0) return; tweenConcrete.Reset(); tweenConcrete.State = TweenState.Playing; - }; + }); return tween; } @@ -26,11 +24,11 @@ public static class TweenExtensions public static ITween LoopInfinitely(this ITween tween) { Tween tweenConcrete = (Tween)tween; - tweenConcrete.OnCompleted += _ => + tweenConcrete.OnCompleted.AddListener(_ => { tweenConcrete.Reset(); tweenConcrete.State = TweenState.Playing; - }; + }); return tween; } @@ -46,56 +44,56 @@ public static class TweenExtensions public static ITween OnStart(this ITween tween, Action callback) { Tween tweenConcrete = (Tween)tween; - tweenConcrete.OnStarted += _ => callback.Invoke(); + tweenConcrete.OnStarted.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnPause(this ITween tween, Action callback) { Tween tweenConcrete = (Tween)tween; - tweenConcrete.OnPaused += _ => callback.Invoke(); + tweenConcrete.OnPaused.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnResume(this ITween tween, Action callback) { Tween tweenConcrete = (Tween)tween; - tweenConcrete.OnResumed += _ => callback.Invoke(); + tweenConcrete.OnResumed.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnCancel(this ITween tween, Action callback) { Tween tweenConcrete = (Tween)tween; - tweenConcrete.OnCancelled += _ => callback.Invoke(); + tweenConcrete.OnCancelled.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnComplete(this ITween tween, Action callback) { Tween tweenConcrete = (Tween)tween; - tweenConcrete.OnCompleted += _ => callback.Invoke(); + tweenConcrete.OnCompleted.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnEnd(this ITween tween, Action callback) { Tween tweenConcrete = (Tween)tween; - tweenConcrete.OnEnded += _ => callback.Invoke(); + tweenConcrete.OnEnded.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnUpdate(this ITween tween, Action callback) { Tween tweenConcrete = (Tween)tween; - tweenConcrete.OnUpdated += _ => callback.Invoke(); + tweenConcrete.OnUpdated.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnDeltaUpdate(this ITween tween, Action callback) { Tween tweenConcrete = (Tween)tween; - tweenConcrete.OnDeltaUpdated += (_, delta) => callback.Invoke(delta); + tweenConcrete.OnDeltaUpdated.AddListener((_, arguments) => callback.Invoke(arguments.Delta)); return tween; } } diff --git a/Engine.Systems/Tween/TweenManager.cs b/Engine.Systems/Tween/TweenManager.cs index 0a38228..856efdd 100644 --- a/Engine.Systems/Tween/TweenManager.cs +++ b/Engine.Systems/Tween/TweenManager.cs @@ -14,7 +14,7 @@ public class TweenManager : UniverseObject, ITweenManager public ITween StartTween(float duration, ITweenManager.TweenSetCallback? setCallback = null) { Tween tween = new(duration); - tween.OnUpdated += tween => setCallback?.Invoke(tween.Value); + tween.OnUpdated.AddListener(tween => setCallback?.Invoke(tween.Value)); runningCoroutines.Add(tween, coroutineManager.StartCoroutine(RunTween(tween))); return tween; }