diff --git a/Engine.Core/CoroutineManager.cs b/Engine.Core/CoroutineManager.cs index 8ec9e22..3b60152 100644 --- a/Engine.Core/CoroutineManager.cs +++ b/Engine.Core/CoroutineManager.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; namespace Syntriax.Engine.Core; -public class CoroutineManager : Behaviour +public class CoroutineManager : Behaviour, IUpdate { private readonly List enumerators = []; @@ -18,17 +18,7 @@ public class CoroutineManager : Behaviour enumerators.Remove(enumerator); } - protected override void OnEnteredUniverse(IUniverse universe) - { - universe.OnUpdate.AddListener(OnUpdate); - } - - protected override void OnExitedUniverse(IUniverse universe) - { - universe.OnUpdate.RemoveListener(OnUpdate); - } - - private void OnUpdate(IUniverse sender, IUniverse.UpdateArguments args) + void IUpdate.Update() { for (int i = enumerators.Count - 1; i >= 0; i--) { @@ -39,4 +29,6 @@ public class CoroutineManager : Behaviour enumerators.RemoveAt(i); } } + + public CoroutineManager() => Priority = int.MinValue; } diff --git a/Engine.Physics2D/PhysicsCoroutineManager.cs b/Engine.Physics2D/PhysicsCoroutineManager.cs index 8403594..9837efc 100644 --- a/Engine.Physics2D/PhysicsCoroutineManager.cs +++ b/Engine.Physics2D/PhysicsCoroutineManager.cs @@ -5,7 +5,7 @@ using Syntriax.Engine.Core; namespace Syntriax.Engine.Physics2D; -public class PhysicsCoroutineManager : Behaviour +public class PhysicsCoroutineManager : Behaviour, IPhysicsUpdate { private readonly Event.EventHandler delegateOnUpdate = null!; @@ -23,16 +23,7 @@ public class PhysicsCoroutineManager : Behaviour enumerators.Remove(enumerator); } - protected override void OnEnteredUniverse(IUniverse universe) - { - physicsEngine = universe.FindRequiredBehaviour(); - if (physicsEngine is IPhysicsEngine2D foundPhysicsEngine) - foundPhysicsEngine.OnPhysicsStep.RemoveListener(OnPhysicsStep); - else - universe.OnUpdate.AddListener(OnUpdate); - } - - private void OnPhysicsStep(IPhysicsEngine2D sender, float stepDeltaTime) + public void PhysicsUpdate(float delta) { for (int i = enumerators.Count - 1; i >= 0; i--) { @@ -44,28 +35,5 @@ public class PhysicsCoroutineManager : Behaviour } } - protected override void OnExitedUniverse(IUniverse universe) - { - if (physicsEngine is IPhysicsEngine2D existingPhysicsEngine) - existingPhysicsEngine.OnPhysicsStep.RemoveListener(OnPhysicsStep); - universe.OnUpdate.RemoveListener(delegateOnUpdate); - } - - private void OnUpdate(IUniverse sender, IUniverse.UpdateArguments args) - { - if (Universe is not IUniverse universe) - return; - - physicsEngine = universe.FindRequiredBehaviour(); - if (physicsEngine is IPhysicsEngine2D foundPhysicsEngine) - { - foundPhysicsEngine.OnPhysicsStep.AddListener(OnPhysicsStep); - universe.OnUpdate.RemoveListener(delegateOnUpdate); - } - } - - public PhysicsCoroutineManager() - { - delegateOnUpdate = OnUpdate; - } + public PhysicsCoroutineManager() => Priority = int.MinValue; } diff --git a/Engine.Physics2D/PhysicsEngine2D.cs b/Engine.Physics2D/PhysicsEngine2D.cs index feab8e1..d7ad475 100644 --- a/Engine.Physics2D/PhysicsEngine2D.cs +++ b/Engine.Physics2D/PhysicsEngine2D.cs @@ -4,13 +4,11 @@ using Syntriax.Engine.Core; namespace Syntriax.Engine.Physics2D; -public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D +public class PhysicsEngine2D : Behaviour, IPreUpdate, IPhysicsEngine2D { public Event OnPhysicsIteration { get; } = new(); public Event OnPhysicsStep { get; } = new(); - private readonly Event.EventHandler delegateOnPreUpdate = null!; - private float physicsTicker = 0f; private int _iterationPerStep = 1; private float _iterationPeriod = 1f / 60f; @@ -191,8 +189,6 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D physicsPostUpdateCollector.Assign(universe); colliderCollector.Assign(universe); rigidBodyCollector.Assign(universe); - - universe.OnPreUpdate.AddListener(OnEnginePreUpdate); } protected override void OnExitedUniverse(IUniverse universe) @@ -203,13 +199,11 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D physicsPostUpdateCollector.Unassign(); colliderCollector.Unassign(); rigidBodyCollector.Unassign(); - - universe.OnPreUpdate.RemoveListener(OnEnginePreUpdate); } - private void OnEnginePreUpdate(IUniverse sender, IUniverse.UpdateArguments args) + void IPreUpdate.PreUpdate() { - physicsTicker += args.EngineTime.DeltaTime; + physicsTicker += Universe.Time.DeltaTime; while (physicsTicker >= IterationPeriod) { @@ -222,15 +216,13 @@ public class PhysicsEngine2D : Behaviour, IPhysicsEngine2D { collisionDetector = new CollisionDetector2D(); collisionResolver = new CollisionResolver2D(); - - delegateOnPreUpdate = OnEnginePreUpdate; + Priority = int.MaxValue; } public PhysicsEngine2D(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver) { this.collisionDetector = collisionDetector; this.collisionResolver = collisionResolver; - - delegateOnPreUpdate = OnEnginePreUpdate; + Priority = int.MaxValue; } }