using Microsoft.Xna.Framework; using Syntriax.Engine.Core.Abstract; namespace Syntriax.Engine.Core; public abstract class BehaviourOverride : Behaviour { private bool isInitializedThisFrame = false; protected IGameObject GameObject => BehaviourController.GameObject; protected ITransform Transform => BehaviourController.GameObject.Transform; public BehaviourOverride() { OnInitialized += OnInitialize; OnFinalized += OnFinalize; OnUnassigned += OnUnassign; } protected virtual void OnUnassign() { } private void OnUnassign(IAssignable assignable) => OnUnassign(); protected virtual void OnInitialize() { } private void OnInitialize(IInitialize _) { isInitializedThisFrame = true; BehaviourController.OnPreUpdate += PreUpdate; BehaviourController.OnPreDraw += PreDraw; BehaviourController.OnUpdate += Update; OnInitialize(); } 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) { OnUpdatePreEnabledCheck(time); if (!StateEnable.Enabled) return; OnUpdate(time); } protected virtual void OnPreDrawPreEnabledCheck(GameTime time) { } protected virtual void OnPreDraw(GameTime time) { } private void PreDraw(IBehaviourController _, GameTime time) { OnPreDrawPreEnabledCheck(time); if (!StateEnable.Enabled) return; OnPreDraw(time); } }