From bb6990a80c499a93de9c23be7c8821d66c4c3377 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Thu, 30 Nov 2023 10:39:40 +0300 Subject: [PATCH] feat: PreUpdate and FirstActiveFrame to Behaviour --- Engine.Core/Abstract/IBehaviourController.cs | 4 +++ Engine.Core/BehaviourController.cs | 3 ++ Engine.Core/BehaviourOverride.cs | 29 +++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Engine.Core/Abstract/IBehaviourController.cs b/Engine.Core/Abstract/IBehaviourController.cs index b5a1f2c..28548bb 100644 --- a/Engine.Core/Abstract/IBehaviourController.cs +++ b/Engine.Core/Abstract/IBehaviourController.cs @@ -11,6 +11,10 @@ namespace Syntriax.Engine.Core.Abstract; /// public interface IBehaviourController : IAssignableGameObject { + /// + /// Callback triggered when the is called but right before the action is triggered. + /// + Action? OnPreUpdate { get; set; } /// /// Callback triggered when the is called. /// diff --git a/Engine.Core/BehaviourController.cs b/Engine.Core/BehaviourController.cs index ef60e98..cffe44b 100644 --- a/Engine.Core/BehaviourController.cs +++ b/Engine.Core/BehaviourController.cs @@ -10,6 +10,7 @@ namespace Syntriax.Engine.Core; public class BehaviourController : IBehaviourController { + public Action? OnPreUpdate { get; set; } public Action? OnUpdate { get; set; } = null; public Action? OnPreDraw { get; set; } = null; @@ -111,8 +112,10 @@ public class BehaviourController : IBehaviourController if (!GameObject.StateEnable.Enabled) return; + OnPreUpdate?.Invoke(this, gameTime); OnUpdate?.Invoke(this, gameTime); } + public void UpdatePreDraw(GameTime gameTime) { if (!GameObject.StateEnable.Enabled) diff --git a/Engine.Core/BehaviourOverride.cs b/Engine.Core/BehaviourOverride.cs index 0bc67d5..5c2e9f3 100644 --- a/Engine.Core/BehaviourOverride.cs +++ b/Engine.Core/BehaviourOverride.cs @@ -1,4 +1,3 @@ -using System; using Microsoft.Xna.Framework; using Syntriax.Engine.Core.Abstract; @@ -7,6 +6,8 @@ namespace Syntriax.Engine.Core; public abstract class BehaviourOverride : Behaviour { + private bool isInitializedThisFrame = false; + protected IGameObject GameObject => BehaviourController.GameObject; protected ITransform Transform => BehaviourController.GameObject.Transform; @@ -23,6 +24,9 @@ public abstract class BehaviourOverride : Behaviour protected virtual void OnInitialize() { } private void OnInitialize(IInitialize _) { + isInitializedThisFrame = true; + + BehaviourController.OnPreUpdate += PreUpdate; BehaviourController.OnPreDraw += PreDraw; BehaviourController.OnUpdate += Update; OnInitialize(); @@ -31,11 +35,34 @@ public abstract class BehaviourOverride : Behaviour protected virtual void OnFinalize() { } private void OnFinalize(IInitialize _) { + BehaviourController.OnPreUpdate -= PreUpdate; BehaviourController.OnPreDraw -= PreDraw; BehaviourController.OnUpdate -= Update; OnFinalize(); } + protected virtual void OnPreUpdatePreEnabledCheck(GameTime time) { } + protected virtual void OnPreUpdate(GameTime time) { } + private void PreUpdate(IBehaviourController _, GameTime time) + { + OnPreUpdatePreEnabledCheck(time); + + if (!StateEnable.Enabled) + return; + + if (isInitializedThisFrame) + FirstActiveFrame(time); + + OnPreUpdate(time); + } + + protected virtual void OnFirstActiveFrame(GameTime time) { } + private void FirstActiveFrame(GameTime time) + { + OnFirstActiveFrame(time); + isInitializedThisFrame = false; + } + protected virtual void OnUpdatePreEnabledCheck(GameTime time) { } protected virtual void OnUpdate(GameTime time) { } private void Update(IBehaviourController _, GameTime time)