feat: IEntity.Id & BaseEntity
This commit is contained in:
		
							
								
								
									
										105
									
								
								Engine.Core/Abstract/BaseEntity.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								Engine.Core/Abstract/BaseEntity.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | |||||||
|  | using System; | ||||||
|  |  | ||||||
|  | namespace Syntriax.Engine.Core.Abstract; | ||||||
|  |  | ||||||
|  | public abstract class BaseEntity : IEntity | ||||||
|  | { | ||||||
|  |     public Action<IEntity, string>? OnIdChanged { get; set; } = null; | ||||||
|  |  | ||||||
|  |     public Action<IAssignable>? OnUnassigned { get; set; } = null; | ||||||
|  |     public Action<IAssignableStateEnable>? OnStateEnableAssigned { get; set; } = null; | ||||||
|  |  | ||||||
|  |     public Action<IInitialize>? OnInitialized { get; set; } = null; | ||||||
|  |     public Action<IInitialize>? OnFinalized { get; set; } = null; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private IStateEnable _stateEnable = null!; | ||||||
|  |  | ||||||
|  |     private bool _initialized = false; | ||||||
|  |     private string _id = string.Empty; | ||||||
|  |  | ||||||
|  |     public virtual IStateEnable StateEnable => _stateEnable; | ||||||
|  |  | ||||||
|  |     public virtual bool IsActive => StateEnable.Enabled; | ||||||
|  |  | ||||||
|  |     public string Id | ||||||
|  |     { | ||||||
|  |         get => _id; | ||||||
|  |         set | ||||||
|  |         { | ||||||
|  |             if (value == _id) | ||||||
|  |                 return; | ||||||
|  |  | ||||||
|  |             string previousId = _id; | ||||||
|  |  | ||||||
|  |             _id = value; | ||||||
|  |             OnIdChanged?.Invoke(this, previousId); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public bool Initialized | ||||||
|  |     { | ||||||
|  |         get => _initialized; | ||||||
|  |         private set | ||||||
|  |         { | ||||||
|  |             if (value == _initialized) | ||||||
|  |                 return; | ||||||
|  |  | ||||||
|  |             _initialized = value; | ||||||
|  |             if (value) | ||||||
|  |                 OnInitialized?.Invoke(this); | ||||||
|  |             else | ||||||
|  |                 OnFinalized?.Invoke(this); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public bool Assign(IStateEnable stateEnable) | ||||||
|  |     { | ||||||
|  |         if (Initialized) | ||||||
|  |             return false; | ||||||
|  |  | ||||||
|  |         _stateEnable = stateEnable; | ||||||
|  |         _stateEnable.Assign(this); | ||||||
|  |         OnStateEnableAssigned?.Invoke(this); | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected virtual void UnassignInternal() { } | ||||||
|  |     public bool Unassign() | ||||||
|  |     { | ||||||
|  |         if (Initialized) | ||||||
|  |             return false; | ||||||
|  |  | ||||||
|  |         UnassignInternal(); | ||||||
|  |  | ||||||
|  |         OnUnassigned?.Invoke(this); | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected virtual void InitializeInternal() { } | ||||||
|  |     public bool Initialize() | ||||||
|  |     { | ||||||
|  |         if (Initialized) | ||||||
|  |             return false; | ||||||
|  |  | ||||||
|  |         InitializeInternal(); | ||||||
|  |  | ||||||
|  |         Initialized = true; | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected virtual void FinalizeInternal() { } | ||||||
|  |     public bool Finalize() | ||||||
|  |     { | ||||||
|  |         if (!Initialized) | ||||||
|  |             return false; | ||||||
|  |  | ||||||
|  |         FinalizeInternal(); | ||||||
|  |  | ||||||
|  |         Initialized = false; | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected BaseEntity() => _id = Guid.NewGuid().ToString("D"); | ||||||
|  |     protected BaseEntity(string id) => _id = id; | ||||||
|  | } | ||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | using System; | ||||||
|  |  | ||||||
| namespace Syntriax.Engine.Core.Abstract; | namespace Syntriax.Engine.Core.Abstract; | ||||||
|  |  | ||||||
| /// <summary> | /// <summary> | ||||||
| @@ -5,4 +7,14 @@ namespace Syntriax.Engine.Core.Abstract; | |||||||
| /// </summary> | /// </summary> | ||||||
| public interface IEntity : IInitialize, IAssignableStateEnable | public interface IEntity : IInitialize, IAssignableStateEnable | ||||||
| { | { | ||||||
|  |     /// <summary> | ||||||
|  |     /// Event triggered when the <see cref="Id"/> of the <see cref="IEntity"/> changes. | ||||||
|  |     /// The string action parameter is the previous <see cref="Id"/> of the <see cref="IEntity"/>.  | ||||||
|  |     /// </summary> | ||||||
|  |     Action<IEntity, string>? OnIdChanged { get; set; } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     /// The ID of the <see cref="IEntity"/>. | ||||||
|  |     /// </summary> | ||||||
|  |     string Id { get; set; } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,43 +6,20 @@ using Syntriax.Engine.Core.Exceptions; | |||||||
| namespace Syntriax.Engine.Core; | namespace Syntriax.Engine.Core; | ||||||
|  |  | ||||||
| [System.Diagnostics.DebuggerDisplay("{GetType().Name, nq}, Priority: {Priority}, Initialized: {Initialized}")] | [System.Diagnostics.DebuggerDisplay("{GetType().Name, nq}, Priority: {Priority}, Initialized: {Initialized}")] | ||||||
| public abstract class Behaviour : IBehaviour | public abstract class Behaviour : BaseEntity, IBehaviour | ||||||
| { | { | ||||||
|     public Action<IAssignable>? OnUnassigned { get; set; } = null; |  | ||||||
|     public Action<IAssignableStateEnable>? OnStateEnableAssigned { get; set; } = null; |  | ||||||
|     public Action<IAssignableBehaviourController>? OnBehaviourControllerAssigned { get; set; } = null; |     public Action<IAssignableBehaviourController>? OnBehaviourControllerAssigned { get; set; } = null; | ||||||
|  |  | ||||||
|     public Action<IInitialize>? OnInitialized { get; set; } = null; |  | ||||||
|     public Action<IInitialize>? OnFinalized { get; set; } = null; |  | ||||||
|     public Action<IBehaviour>? OnPriorityChanged { get; set; } = null; |     public Action<IBehaviour>? OnPriorityChanged { get; set; } = null; | ||||||
|  |  | ||||||
|  |  | ||||||
|     private IBehaviourController _behaviourController = null!; |     private IBehaviourController _behaviourController = null!; | ||||||
|     private IStateEnable _stateEnable = null!; |  | ||||||
|  |  | ||||||
|     private bool _initialized = false; |  | ||||||
|     private int _priority = 0; |     private int _priority = 0; | ||||||
|  |  | ||||||
|     public IStateEnable StateEnable => _stateEnable; |  | ||||||
|     public IBehaviourController BehaviourController => _behaviourController; |     public IBehaviourController BehaviourController => _behaviourController; | ||||||
|  |  | ||||||
|     public bool IsActive => StateEnable.Enabled && BehaviourController.GameObject.StateEnable.Enabled; |     public override bool IsActive => base.IsActive && BehaviourController.GameObject.StateEnable.Enabled; | ||||||
|  |  | ||||||
|     public bool Initialized |  | ||||||
|     { |  | ||||||
|         get => _initialized; |  | ||||||
|         private set |  | ||||||
|         { |  | ||||||
|             if (value == _initialized) |  | ||||||
|                 return; |  | ||||||
|  |  | ||||||
|             _initialized = value; |  | ||||||
|             if (value) |  | ||||||
|                 OnInitialized?.Invoke(this); |  | ||||||
|             else |  | ||||||
|                 OnFinalized?.Invoke(this); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public int Priority |     public int Priority | ||||||
|     { |     { | ||||||
| @@ -57,17 +34,6 @@ public abstract class Behaviour : IBehaviour | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public bool Assign(IStateEnable stateEnable) |  | ||||||
|     { |  | ||||||
|         if (Initialized) |  | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         _stateEnable = stateEnable; |  | ||||||
|         _stateEnable.Assign(this); |  | ||||||
|         OnStateEnableAssigned?.Invoke(this); |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public bool Assign(IBehaviourController behaviourController) |     public bool Assign(IBehaviourController behaviourController) | ||||||
|     { |     { | ||||||
|         if (Initialized) |         if (Initialized) | ||||||
| @@ -78,36 +44,16 @@ public abstract class Behaviour : IBehaviour | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public bool Unassign() |     protected override void UnassignInternal() | ||||||
|     { |     { | ||||||
|         if (Initialized) |         base.UnassignInternal(); | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         _stateEnable = null!; |  | ||||||
|         _behaviourController = null!; |         _behaviourController = null!; | ||||||
|  |  | ||||||
|         OnUnassigned?.Invoke(this); |  | ||||||
|         return true; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public bool Initialize() |     protected override void InitializeInternal() | ||||||
|     { |     { | ||||||
|         if (Initialized) |         base.InitializeInternal(); | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         NotAssignedException.Check(this, _behaviourController); |         NotAssignedException.Check(this, _behaviourController); | ||||||
|         NotAssignedException.Check(this, _stateEnable); |         NotAssignedException.Check(this, StateEnable); | ||||||
|  |  | ||||||
|         Initialized = true; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public bool Finalize() |  | ||||||
|     { |  | ||||||
|         if (!Initialized) |  | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         Initialized = false; |  | ||||||
|         return true; |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -9,22 +9,15 @@ using Syntriax.Engine.Core.Factory; | |||||||
| namespace Syntriax.Engine.Core; | namespace Syntriax.Engine.Core; | ||||||
|  |  | ||||||
| [System.Diagnostics.DebuggerDisplay("GameObject Count: {_gameObjects.Count}")] | [System.Diagnostics.DebuggerDisplay("GameObject Count: {_gameObjects.Count}")] | ||||||
| public class GameManager : IGameManager | public class GameManager : BaseEntity, IGameManager | ||||||
| { | { | ||||||
|     public Action<IGameManager, IGameObject>? OnGameObjectRegistered { get; set; } = null; |     public Action<IGameManager, IGameObject>? OnGameObjectRegistered { get; set; } = null; | ||||||
|     public Action<IGameManager, IGameObject>? OnGameObjectUnRegistered { get; set; } = null; |     public Action<IGameManager, IGameObject>? OnGameObjectUnRegistered { get; set; } = null; | ||||||
|  |  | ||||||
|     public Action<IInitialize>? OnInitialized { get; set; } = null; |  | ||||||
|     public Action<IInitialize>? OnFinalized { get; set; } = null; |  | ||||||
|     public Action<IAssignable>? OnUnassigned { get; set; } = null; |  | ||||||
|     public Action<IAssignableStateEnable>? OnStateEnableAssigned { get; set; } = null; |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     private readonly List<IGameObject> _gameObjects = new(Constants.GAME_OBJECTS_SIZE_INITIAL); |     private readonly List<IGameObject> _gameObjects = new(Constants.GAME_OBJECTS_SIZE_INITIAL); | ||||||
|  |  | ||||||
|     private IStateEnable _stateEnable = null!; |  | ||||||
|     private GameObjectFactory _gameObjectFactory = null!; |     private GameObjectFactory _gameObjectFactory = null!; | ||||||
|     private bool _initialized = false; |  | ||||||
|  |  | ||||||
|     private GameObjectFactory GameObjectFactory |     private GameObjectFactory GameObjectFactory | ||||||
|     { |     { | ||||||
| @@ -36,21 +29,20 @@ public class GameManager : IGameManager | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public bool Initialized => _initialized; |  | ||||||
|     public IReadOnlyList<IGameObject> GameObjects => _gameObjects; |     public IReadOnlyList<IGameObject> GameObjects => _gameObjects; | ||||||
|  |  | ||||||
|     public IStateEnable StateEnable |     public override IStateEnable StateEnable | ||||||
|     { |     { | ||||||
|         get |         get | ||||||
|         { |         { | ||||||
|             if (_stateEnable is null) |             if (base.StateEnable is null) | ||||||
|             { |             { | ||||||
|                 Assign(new StateEnableFactory().Instantiate(this)); |                 Assign(new StateEnableFactory().Instantiate(this)); | ||||||
|                 if (_stateEnable is null) |                 if (base.StateEnable is null) | ||||||
|                     throw NotAssignedException.From(this, _stateEnable); |                     throw NotAssignedException.From(this, base.StateEnable); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             return _stateEnable; |             return base.StateEnable; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -78,52 +70,20 @@ public class GameManager : IGameManager | |||||||
|         return gameObject; |         return gameObject; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public bool Initialize() |     protected override void InitializeInternal() | ||||||
|     { |     { | ||||||
|         if (Initialized) |         base.InitializeInternal(); | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         NotAssignedException.Check(this, StateEnable); |         NotAssignedException.Check(this, StateEnable); | ||||||
|  |  | ||||||
|         foreach (var gameObject in GameObjects) |         foreach (var gameObject in GameObjects) | ||||||
|             gameObject.Initialize(); |             gameObject.Initialize(); | ||||||
|  |  | ||||||
|         _initialized = true; |  | ||||||
|         OnInitialized?.Invoke(this); |  | ||||||
|         return true; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public bool Finalize() |     protected override void FinalizeInternal() | ||||||
|     { |     { | ||||||
|         if (!Initialized) |         base.FinalizeInternal(); | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         for (int i = GameObjects.Count; i >= 0; i--) |         for (int i = GameObjects.Count; i >= 0; i--) | ||||||
|             GameObjects[i].Finalize(); |             GameObjects[i].Finalize(); | ||||||
|  |  | ||||||
|         OnFinalized?.Invoke(this); |  | ||||||
|         _initialized = false; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public bool Assign(IStateEnable stateEnable) |  | ||||||
|     { |  | ||||||
|         if (Initialized) |  | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         _stateEnable = stateEnable; |  | ||||||
|         OnStateEnableAssigned?.Invoke(this); |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public bool Unassign() |  | ||||||
|     { |  | ||||||
|         if (Initialized) |  | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         _stateEnable = null!; |  | ||||||
|         OnUnassigned?.Invoke(this); |  | ||||||
|         return true; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void Update(EngineTime time) |     public void Update(EngineTime time) | ||||||
|   | |||||||
| @@ -6,19 +6,14 @@ using Syntriax.Engine.Core.Exceptions; | |||||||
| namespace Syntriax.Engine.Core; | namespace Syntriax.Engine.Core; | ||||||
|  |  | ||||||
| [System.Diagnostics.DebuggerDisplay("Name: {Name}, Initialized: {Initialized}")] | [System.Diagnostics.DebuggerDisplay("Name: {Name}, Initialized: {Initialized}")] | ||||||
| public class GameObject : IGameObject | public class GameObject : BaseEntity, IGameObject | ||||||
| { | { | ||||||
|     public Action<IAssignableStateEnable>? OnStateEnableAssigned { get; set; } = null; |  | ||||||
|     public Action<IAssignableTransform>? OnTransformAssigned { get; set; } = null; |     public Action<IAssignableTransform>? OnTransformAssigned { get; set; } = null; | ||||||
|     public Action<IAssignable>? OnUnassigned { get; set; } = null; |  | ||||||
|     public Action<IAssignableBehaviourController>? OnBehaviourControllerAssigned { get; set; } = null; |     public Action<IAssignableBehaviourController>? OnBehaviourControllerAssigned { get; set; } = null; | ||||||
|     public Action<IAssignableGameManager>? OnGameManagerAssigned { get; set; } = null; |     public Action<IAssignableGameManager>? OnGameManagerAssigned { get; set; } = null; | ||||||
|  |  | ||||||
|     public Action<IEntity>? OnNameChanged { get; set; } = null; |     public Action<IEntity>? OnNameChanged { get; set; } = null; | ||||||
|  |  | ||||||
|     public Action<IInitialize>? OnInitialized { get; set; } = null; |  | ||||||
|     public Action<IInitialize>? OnFinalized { get; set; } = null; |  | ||||||
|  |  | ||||||
|     public Action<IGameObject>? OnUpdated { get; set; } = null; |     public Action<IGameObject>? OnUpdated { get; set; } = null; | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -28,29 +23,11 @@ public class GameObject : IGameObject | |||||||
|     private IGameManager _gameManager = null!; |     private IGameManager _gameManager = null!; | ||||||
|  |  | ||||||
|     private string _name = nameof(GameObject); |     private string _name = nameof(GameObject); | ||||||
|     private bool _initialized = false; |  | ||||||
|  |  | ||||||
|     public ITransform Transform => _transform; |     public ITransform Transform => _transform; | ||||||
|     public IBehaviourController BehaviourController => _behaviourController; |     public IBehaviourController BehaviourController => _behaviourController; | ||||||
|     public IStateEnable StateEnable => _stateEnable; |  | ||||||
|     public IGameManager GameManager => _gameManager; |     public IGameManager GameManager => _gameManager; | ||||||
|  |  | ||||||
|     public bool Initialized |  | ||||||
|     { |  | ||||||
|         get => _initialized; |  | ||||||
|         private set |  | ||||||
|         { |  | ||||||
|             if (value == _initialized) |  | ||||||
|                 return; |  | ||||||
|  |  | ||||||
|             _initialized = value; |  | ||||||
|             if (value) |  | ||||||
|                 OnInitialized?.Invoke(this); |  | ||||||
|             else |  | ||||||
|                 OnFinalized?.Invoke(this); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public string Name |     public string Name | ||||||
|     { |     { | ||||||
|         get => _name; |         get => _name; | ||||||
| @@ -63,18 +40,14 @@ public class GameObject : IGameObject | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public bool Initialize() |     protected override void InitializeInternal() | ||||||
|     { |     { | ||||||
|         if (Initialized) |         base.InitializeInternal(); | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         NotAssignedException.Check(this, _transform); |         NotAssignedException.Check(this, _transform); | ||||||
|         NotAssignedException.Check(this, _behaviourController); |         NotAssignedException.Check(this, _behaviourController); | ||||||
|         NotAssignedException.Check(this, _stateEnable); |         NotAssignedException.Check(this, _stateEnable); | ||||||
|         NotAssignedException.Check(this, _gameManager); |         NotAssignedException.Check(this, _gameManager); | ||||||
|  |  | ||||||
|         Initialized = true; |  | ||||||
|         return true; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public void Update() |     public void Update() | ||||||
| @@ -85,29 +58,12 @@ public class GameObject : IGameObject | |||||||
|         OnUpdated?.Invoke(this); |         OnUpdated?.Invoke(this); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public bool Finalize() |     protected override void FinalizeInternal() | ||||||
|     { |     { | ||||||
|         if (!Initialized) |         base.FinalizeInternal(); | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|  |         foreach (IBehaviour behaviour in _behaviourController.GetBehaviours<IBehaviour>()) | ||||||
|         System.Threading.Tasks.Parallel.ForEach( |             behaviour.Finalize(); | ||||||
|             _behaviourController.GetBehaviours<IBehaviour>(), |  | ||||||
|             behaviour => behaviour.Finalize() |  | ||||||
|         ); |  | ||||||
|  |  | ||||||
|         Initialized = false; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public bool Assign(IStateEnable stateEnable) |  | ||||||
|     { |  | ||||||
|         if (Initialized) |  | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         _stateEnable = stateEnable; |  | ||||||
|         OnStateEnableAssigned?.Invoke(this); |  | ||||||
|         return true; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public bool Assign(ITransform transform) |     public bool Assign(ITransform transform) | ||||||
| @@ -140,18 +96,14 @@ public class GameObject : IGameObject | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public bool Unassign() |     protected override void UnassignInternal() | ||||||
|     { |     { | ||||||
|         if (Initialized) |         base.UnassignInternal(); | ||||||
|             return false; |  | ||||||
|  |  | ||||||
|         _stateEnable = null!; |         _stateEnable = null!; | ||||||
|         _transform = null!; |         _transform = null!; | ||||||
|         _behaviourController = null!; |         _behaviourController = null!; | ||||||
|         _gameManager = null!; |         _gameManager = null!; | ||||||
|  |  | ||||||
|         OnUnassigned?.Invoke(this); |  | ||||||
|         return true; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public GameObject() { OnBehaviourControllerAssigned += ConnectBehaviourController; } |     public GameObject() { OnBehaviourControllerAssigned += ConnectBehaviourController; } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user