refactor!: IGameObject removed
This commit is contained in:
@@ -7,33 +7,28 @@ using Syntriax.Engine.Core.Factory;
|
||||
|
||||
namespace Syntriax.Engine.Core;
|
||||
|
||||
[System.Diagnostics.DebuggerDisplay("GameObject Count: {_gameObjects.Count}")]
|
||||
[System.Diagnostics.DebuggerDisplay("HierarchyObject Count: {_hierarchyObjects.Count}")]
|
||||
public class GameManager : BaseEntity, IGameManager
|
||||
{
|
||||
public event IGameManager.OnUpdateEventHandler? OnUpdate = null;
|
||||
public event IGameManager.OnPreDawEventHandler? OnPreDraw = null;
|
||||
|
||||
public event IGameManager.OnGameObjectRegisteredEventHandler? OnGameObjectRegistered = null;
|
||||
public event IGameManager.OnGameObjectUnRegisteredEventHandler? OnGameObjectUnRegistered = null;
|
||||
public event IGameManager.OnHierarchyObjectRegisteredEventHandler? OnHierarchyObjectRegistered = null;
|
||||
public event IGameManager.OnHierarchyObjectUnRegisteredEventHandler? OnHierarchyObjectUnRegistered = null;
|
||||
|
||||
private readonly List<IGameObject> _gameObjects = new(Constants.GAME_OBJECTS_SIZE_INITIAL);
|
||||
private readonly List<IHierarchyObject> _hierarchyObjects = new(Constants.GAME_OBJECTS_SIZE_INITIAL);
|
||||
|
||||
private GameObjectFactory _gameObjectFactory = null!;
|
||||
private HierarchyObjectFactory _hierarchyObjectFactory = null!;
|
||||
|
||||
private GameObjectFactory GameObjectFactory
|
||||
private HierarchyObjectFactory HierarchyObjectFactory
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_gameObjectFactory is null)
|
||||
_gameObjectFactory = new GameObjectFactory();
|
||||
return _gameObjectFactory;
|
||||
_hierarchyObjectFactory ??= new HierarchyObjectFactory();
|
||||
return _hierarchyObjectFactory;
|
||||
}
|
||||
}
|
||||
|
||||
public IReadOnlyList<IGameObject> GameObjects => _gameObjects;
|
||||
public IReadOnlyList<IHierarchyObject> HierarchyObjects => _hierarchyObjects;
|
||||
|
||||
public override IStateEnable StateEnable
|
||||
@@ -56,25 +51,28 @@ public class GameManager : BaseEntity, IGameManager
|
||||
if (_hierarchyObjects.Contains(hierarchyObject))
|
||||
throw new Exception($"{nameof(IHierarchyObject)} named {hierarchyObject.Name} is already registered to the {nameof(GameManager)}.");
|
||||
|
||||
if (hierarchyObject is IGameObject gameObject)
|
||||
Register(gameObject);
|
||||
else
|
||||
{
|
||||
if (!hierarchyObject.Initialize())
|
||||
throw new Exception($"{nameof(hierarchyObject)} can't be initialized");
|
||||
hierarchyObject.OnFinalized += OnHierarchyObjectFinalize;
|
||||
hierarchyObject.OnExitedHierarchy += OnHierarchyObjectExitedHierarchy;
|
||||
|
||||
_hierarchyObjects.Add(hierarchyObject);
|
||||
hierarchyObject.EnterHierarchy(this);
|
||||
if (!hierarchyObject.Initialize())
|
||||
throw new Exception($"{hierarchyObject.Name} can't be initialized");
|
||||
|
||||
OnHierarchyObjectRegistered?.Invoke(this, hierarchyObject);
|
||||
}
|
||||
foreach (IHierarchyObject child in hierarchyObject.Children)
|
||||
Register(child);
|
||||
|
||||
_hierarchyObjects.Add(hierarchyObject);
|
||||
|
||||
if (!hierarchyObject.EnterHierarchy(this))
|
||||
throw new Exception($"{hierarchyObject.Name} can't enter the hierarchy");
|
||||
|
||||
OnHierarchyObjectRegistered?.Invoke(this, hierarchyObject);
|
||||
}
|
||||
|
||||
public T InstantiateGameObject<T>(params object?[]? args) where T : class, IGameObject
|
||||
public T InstantiateHierarchyObject<T>(params object?[]? args) where T : class, IHierarchyObject
|
||||
{
|
||||
T gameObject = GameObjectFactory.Instantiate<T>(args);
|
||||
Register(gameObject);
|
||||
return gameObject;
|
||||
T hierarchyObject = HierarchyObjectFactory.Instantiate<T>(args);
|
||||
Register(hierarchyObject);
|
||||
return hierarchyObject;
|
||||
}
|
||||
|
||||
public void Remove(IHierarchyObject hierarchyObject)
|
||||
@@ -82,18 +80,21 @@ public class GameManager : BaseEntity, IGameManager
|
||||
if (!_hierarchyObjects.Contains(hierarchyObject))
|
||||
throw new Exception($"{nameof(IHierarchyObject)} named {hierarchyObject.Name} is not registered to the {nameof(GameManager)}.");
|
||||
|
||||
if (hierarchyObject is IGameObject gameObject)
|
||||
Unregister(gameObject);
|
||||
else
|
||||
{
|
||||
_hierarchyObjects.Remove(hierarchyObject);
|
||||
hierarchyObject.ExitHierarchy();
|
||||
hierarchyObject.OnFinalized -= OnHierarchyObjectFinalize;
|
||||
hierarchyObject.OnExitedHierarchy -= OnHierarchyObjectExitedHierarchy;
|
||||
|
||||
if (!hierarchyObject.Finalize())
|
||||
throw new Exception($"{nameof(hierarchyObject)} can't be finalized");
|
||||
foreach (IHierarchyObject child in hierarchyObject.Children)
|
||||
Remove(child);
|
||||
|
||||
OnHierarchyObjectUnRegistered?.Invoke(this, hierarchyObject);
|
||||
}
|
||||
_hierarchyObjects.Remove(hierarchyObject);
|
||||
|
||||
if (!hierarchyObject.ExitHierarchy())
|
||||
throw new Exception($"{hierarchyObject.Name} can't exit the hierarchy");
|
||||
|
||||
if (!hierarchyObject.Finalize())
|
||||
throw new Exception($"{hierarchyObject.Name} can't be finalized");
|
||||
|
||||
OnHierarchyObjectUnRegistered?.Invoke(this, hierarchyObject);
|
||||
}
|
||||
|
||||
protected override void InitializeInternal()
|
||||
@@ -101,93 +102,45 @@ public class GameManager : BaseEntity, IGameManager
|
||||
base.InitializeInternal();
|
||||
NotAssignedException.Check(this, StateEnable);
|
||||
|
||||
foreach (IGameObject gameObject in GameObjects)
|
||||
gameObject.Initialize();
|
||||
foreach (IHierarchyObject hierarchyObject in HierarchyObjects)
|
||||
hierarchyObject.Initialize();
|
||||
}
|
||||
|
||||
protected override void FinalizeInternal()
|
||||
{
|
||||
base.FinalizeInternal();
|
||||
for (int i = GameObjects.Count; i >= 0; i--)
|
||||
GameObjects[i].Finalize();
|
||||
for (int i = HierarchyObjects.Count; i >= 0; i--)
|
||||
HierarchyObjects[i].Finalize();
|
||||
}
|
||||
|
||||
public void Update(EngineTime time)
|
||||
{
|
||||
Time.SetTime(time);
|
||||
for (int i = 0; i < GameObjects.Count; i++)
|
||||
GameObjects[i].BehaviourController.Update();
|
||||
for (int i = 0; i < HierarchyObjects.Count; i++)
|
||||
HierarchyObjects[i].BehaviourController.Update();
|
||||
|
||||
OnUpdate?.Invoke(this, time);
|
||||
}
|
||||
|
||||
public void PreDraw()
|
||||
{
|
||||
for (int i = 0; i < GameObjects.Count; i++)
|
||||
GameObjects[i].BehaviourController.UpdatePreDraw();
|
||||
for (int i = 0; i < HierarchyObjects.Count; i++)
|
||||
HierarchyObjects[i].BehaviourController.UpdatePreDraw();
|
||||
|
||||
OnPreDraw?.Invoke(this);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
|
||||
private void Register(IGameObject gameObject)
|
||||
private void OnHierarchyObjectFinalize(IInitializable initializable)
|
||||
{
|
||||
if (_gameObjects.Contains(gameObject))
|
||||
throw new Exception($"{nameof(IGameObject)} named {gameObject.Name} is already registered to the {nameof(GameManager)}.");
|
||||
|
||||
gameObject.OnFinalized += OnGameObjectFinalize;
|
||||
gameObject.OnExitedHierarchy += OnGameObjectExitedHierarchy;
|
||||
|
||||
if (!gameObject.Initialize())
|
||||
throw new Exception($"{nameof(gameObject)} can't be initialized");
|
||||
|
||||
foreach (ITransform child in gameObject.Transform.Children)
|
||||
Register(child.GameObject);
|
||||
|
||||
_gameObjects.Add(gameObject);
|
||||
_hierarchyObjects.Add(gameObject);
|
||||
|
||||
if (!gameObject.EnterHierarchy(this))
|
||||
throw new Exception($"{nameof(gameObject)} can't enter the hierarchy");
|
||||
|
||||
OnHierarchyObjectRegistered?.Invoke(this, gameObject);
|
||||
OnGameObjectRegistered?.Invoke(this, gameObject);
|
||||
if (initializable is IHierarchyObject hierarchyObject)
|
||||
Remove(hierarchyObject);
|
||||
}
|
||||
|
||||
private void Unregister(IGameObject gameObject)
|
||||
private void OnHierarchyObjectExitedHierarchy(IHierarchyObject sender, IGameManager gameManager)
|
||||
{
|
||||
if (!_gameObjects.Contains(gameObject))
|
||||
throw new Exception($"{nameof(IGameObject)} named {gameObject.Name} is not registered to the {nameof(GameManager)}.");
|
||||
|
||||
gameObject.OnFinalized -= OnGameObjectFinalize;
|
||||
gameObject.OnExitedHierarchy -= OnGameObjectExitedHierarchy;
|
||||
|
||||
foreach (ITransform child in gameObject.Transform.Children)
|
||||
Unregister(child.GameObject);
|
||||
|
||||
_gameObjects.Remove(gameObject);
|
||||
_hierarchyObjects.Remove(gameObject);
|
||||
|
||||
if (!gameObject.ExitHierarchy())
|
||||
throw new Exception($"{nameof(gameObject)} can't exit the hierarchy");
|
||||
|
||||
if (!gameObject.Finalize())
|
||||
throw new Exception($"{nameof(gameObject)} can't be finalized");
|
||||
|
||||
OnHierarchyObjectUnRegistered?.Invoke(this, gameObject);
|
||||
OnGameObjectUnRegistered?.Invoke(this, gameObject);
|
||||
}
|
||||
|
||||
private void OnGameObjectFinalize(IInitialize initialize)
|
||||
{
|
||||
if (initialize is IGameObject gameObject)
|
||||
Unregister(gameObject);
|
||||
}
|
||||
|
||||
private void OnGameObjectExitedHierarchy(IHierarchyObject sender, IGameManager gameManager)
|
||||
{
|
||||
if (sender is IGameObject gameObject)
|
||||
Unregister(gameObject);
|
||||
if (sender is IHierarchyObject hierarchyObject)
|
||||
Remove(hierarchyObject);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user