blob: 022d4b8c9cf7754183d4bd9d7c6081ffde10f71d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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);
}
}
}
|