diff --git a/Awperative/Kernel/Behavior/Core.cs b/Awperative/Kernel/Behavior/Core.cs index 18846b0..4a1e67e 100644 --- a/Awperative/Kernel/Behavior/Core.cs +++ b/Awperative/Kernel/Behavior/Core.cs @@ -14,43 +14,80 @@ namespace Awperative; /// public abstract partial class Behavior : Docker { - - public Scene Scene; - public Behavior Parent = null; - - - //todo tags and order - internal void Initiate(Scene __scene, Docker __parent) { - Scene = __scene; - if (__parent is Behavior behavior) Parent = behavior; - + /// + /// Current parent of the Behavior. Can be either Scene or another Behavior. + /// + internal Docker Docker; + + + + /// + /// Identifiers for Behaviors. + /// + public List Tags; + + + + /// + /// Order for when Behaviors are called on. Only applies between Components on the same Docker. + /// + public int Priority; + + + + + + /// + /// To be called when the Behavior is created. + /// + /// Docker that this spawned in this Behavior + internal void Initiate(Docker __parent) { + Docker = __parent; Create(); } - - - - internal void End() { - Destroy(); - } + /// + /// Called when the Game is Closing; does not always happen depending on if it is Force Closed. + /// protected internal virtual void Unload() {} + + /// + /// Called when the Game is Loading. + /// protected internal virtual void Load() {} - //You know what these do - protected internal virtual void Update(GameTime __gameTime) {} - protected internal virtual void Draw(GameTime __gameTime) {} - //component/body/scene is being created or destroyed + /// + /// Called every frame before Draw, it is recommended to do any Non-Drawing update logic here. + /// + protected internal virtual void Update() {} + + /// + /// Called after Update when the screen is being drawn. Please only put Drawing related logic here. + /// + protected internal virtual void Draw() {} + + + + /// + /// Called when the Component is created. + /// protected internal virtual void Create() {} + + /// + /// Called when the Component is destroyed. Not called when the Game is closed. + /// protected internal virtual void Destroy() {} + + } \ No newline at end of file diff --git a/Awperative/Kernel/Behavior/Utility.cs b/Awperative/Kernel/Behavior/Utility.cs new file mode 100644 index 0000000..be1b0f8 --- /dev/null +++ b/Awperative/Kernel/Behavior/Utility.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; + +namespace Awperative; + +public abstract partial class Behavior : Docker +{ + public Scene Scene => __QueryScene(); + private Scene __QueryScene() { + if (Docker is Scene scene) return scene; + if (Docker is Behavior behavior) return behavior.__QueryScene(); + + return null; + } + + public Docker[] Dockers => __QueryDockers(); + + private Docker[] __QueryDockers() + { + List returnValue = []; + + Docker currentDocker = Docker; + + while (!(currentDocker is Scene)) + { + if (currentDocker is Behavior behavior) + { + returnValue.Add(behavior); + currentDocker = behavior.Docker; + } + } + + returnValue.Add(currentDocker); + + return returnValue.ToArray(); + } + + public Behavior[] Parents => __QueryParents(); + +} \ No newline at end of file diff --git a/Awperative/Kernel/Docker/Behaviors.cs b/Awperative/Kernel/Docker/Behaviors.cs index 3de2c7e..d395788 100644 --- a/Awperative/Kernel/Docker/Behaviors.cs +++ b/Awperative/Kernel/Docker/Behaviors.cs @@ -19,7 +19,7 @@ public abstract partial class Docker if(behavior == null) { Debug.LogError("Failed to create component"); return null; } _behaviors.Add(behavior); - behavior.Initiate(DockerScene, this); + behavior.Initiate(this); return behavior; }catch { Debug.LogError("Failed to create component"); return null; } @@ -49,7 +49,7 @@ public abstract partial class Docker if(!_behaviors.Contains(behavior)) { Debug.LogError("Body does not have a component of this type"); return; } - behavior.End(); + behavior.Destroy(); _behaviors.Remove(behavior); } @@ -58,7 +58,7 @@ public abstract partial class Docker { Behavior foundBehavior = Get(); - foundBehavior.End(); + foundBehavior.Destroy(); _behaviors.Remove(foundBehavior); }catch { Debug.LogError("Removal failed"); } } @@ -66,7 +66,7 @@ public abstract partial class Docker public void DestroyAll() where Generic : Behavior { try { foreach (Behavior component in GetAll()) { - component.End(); + component.Destroy(); _behaviors.Remove(component); } }catch { Debug.LogError("Removal failed"); } @@ -79,5 +79,20 @@ public abstract partial class Docker _behaviors.Remove(behavior); } - public void Remove< + public void Remove() where Generic : Behavior { + try + { + Behavior foundBehavior = Get(); + + _behaviors.Remove(foundBehavior); + }catch { Debug.LogError("Removal failed"); } + } + + public void RemoveAll() where Generic : Behavior { + try { + foreach (Behavior component in GetAll()) { + _behaviors.Remove(component); + } + }catch { Debug.LogError("Removal failed"); } + } } \ No newline at end of file diff --git a/Awperative/Kernel/Docker/Time.cs b/Awperative/Kernel/Docker/Time.cs index a5e544d..ea0d10c 100644 --- a/Awperative/Kernel/Docker/Time.cs +++ b/Awperative/Kernel/Docker/Time.cs @@ -9,8 +9,8 @@ public abstract partial class Docker - internal virtual void ChainUpdate(GameTime __gameTime) { foreach (Behavior component in _behaviors) { component.Update(__gameTime); } } - internal virtual void ChainDraw(GameTime __gameTime) { foreach (Behavior component in _behaviors) { component.Draw(__gameTime); } } + internal virtual void ChainUpdate() { foreach (Behavior component in _behaviors) { component.Update(); } } + internal virtual void ChainDraw() { foreach (Behavior component in _behaviors) { component.Draw(); } } diff --git a/Awperative/Kernel/Overhead/Base.cs b/Awperative/Kernel/Overhead/Base.cs index ac2426b..c988bca 100644 --- a/Awperative/Kernel/Overhead/Base.cs +++ b/Awperative/Kernel/Overhead/Base.cs @@ -58,7 +58,7 @@ public sealed class Base : Game /// /// Hooks are unable to receive both Update() and Draw() protected override void Update(GameTime __gameTime) { - foreach(Scene scene in Awperative.LoadedScenes.ToList()) scene.ChainUpdate(__gameTime); + foreach(Scene scene in Awperative.LoadedScenes.ToList()) scene.ChainUpdate(); base.Update(__gameTime); } @@ -71,7 +71,7 @@ public sealed class Base : Game /// /// Hooks are unable to receive both Update() and Draw() protected override void Draw(GameTime __gameTime) { - foreach(Scene scene in Awperative.LoadedScenes.ToList()) scene.ChainDraw(__gameTime); + foreach(Scene scene in Awperative.LoadedScenes.ToList()) scene.ChainDraw(); base.Draw(__gameTime); }