diff options
author | chai <215380520@qq.com> | 2024-06-03 10:15:45 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2024-06-03 10:15:45 +0800 |
commit | acea7b2e728787a0d83bbf83c8c1f042d2c32e7e (patch) | |
tree | 0bfec05c1ca2d71be2c337bcd110a0421f19318b /Plugins/MonoGame.Extended/source/MonoGame.Extended.Entities/World.cs | |
parent | 88febcb02bf127d961c6471d9e846c0e1315f5c3 (diff) |
+ plugins project
Diffstat (limited to 'Plugins/MonoGame.Extended/source/MonoGame.Extended.Entities/World.cs')
-rw-r--r-- | Plugins/MonoGame.Extended/source/MonoGame.Extended.Entities/World.cs | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/Plugins/MonoGame.Extended/source/MonoGame.Extended.Entities/World.cs b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Entities/World.cs new file mode 100644 index 0000000..022d4b8 --- /dev/null +++ b/Plugins/MonoGame.Extended/source/MonoGame.Extended.Entities/World.cs @@ -0,0 +1,84 @@ +using Microsoft.Xna.Framework; +using MonoGame.Extended.Collections; +using MonoGame.Extended.Entities.Systems; + +namespace MonoGame.Extended.Entities +{ + public class World : SimpleDrawableGameComponent + { + private readonly Bag<IUpdateSystem> _updateSystems; + private readonly Bag<IDrawSystem> _drawSystems; + + internal World() + { + _updateSystems = new Bag<IUpdateSystem>(); + _drawSystems = new Bag<IDrawSystem>(); + + RegisterSystem(ComponentManager = new ComponentManager()); + RegisterSystem(EntityManager = new EntityManager(ComponentManager)); + } + + public override void Dispose() + { + foreach (var updateSystem in _updateSystems) + updateSystem.Dispose(); + + foreach (var drawSystem in _drawSystems) + drawSystem.Dispose(); + + _updateSystems.Clear(); + _drawSystems.Clear(); + + base.Dispose(); + } + + internal EntityManager EntityManager { get; } + internal ComponentManager ComponentManager { get; } + + public int EntityCount => EntityManager.ActiveCount; + + internal void RegisterSystem(ISystem system) + { + // ReSharper disable once ConvertIfStatementToSwitchStatement + if (system is IUpdateSystem updateSystem) + _updateSystems.Add(updateSystem); + + if (system is IDrawSystem drawSystem) + _drawSystems.Add(drawSystem); + + system.Initialize(this); + } + + public Entity GetEntity(int entityId) + { + return EntityManager.Get(entityId); + } + + public Entity CreateEntity() + { + return EntityManager.Create(); + } + + public void DestroyEntity(int entityId) + { + EntityManager.Destroy(entityId); + } + + public void DestroyEntity(Entity entity) + { + EntityManager.Destroy(entity); + } + + public override void Update(GameTime gameTime) + { + foreach (var system in _updateSystems) + system.Update(gameTime); + } + + public override void Draw(GameTime gameTime) + { + foreach (var system in _drawSystems) + system.Draw(gameTime); + } + } +}
\ No newline at end of file |