diff --git a/src/ComponentManager.cs b/src/ComponentManager.cs index 1153aaa..fa43bc8 100644 --- a/src/ComponentManager.cs +++ b/src/ComponentManager.cs @@ -36,6 +36,10 @@ namespace Encompass { return activeComponents[typeof(TComponent)].Cast(); } + internal TComponent GetActiveComponentByType() where TComponent : struct, IComponent { + return GetActiveComponentsByType().Single(); + } + internal IEnumerable GetComponentsByEntityAndType(uint entityID) where TComponent : struct, IComponent { var entity_components = GetComponentsByEntity(entityID).Cast(); var active_components_by_type = GetActiveComponentsByType(); diff --git a/src/Engine.cs b/src/Engine.cs new file mode 100644 index 0000000..d951e4d --- /dev/null +++ b/src/Engine.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; + +namespace Encompass { + public abstract class Engine { + private EntityManager entityManager; + private ComponentManager componentManager; + + internal void AssignEntityManager(EntityManager entityManager) { + this.entityManager = entityManager; + } + + internal void AssignComponentManager(ComponentManager componentManager) { + this.componentManager = componentManager; + } + + public abstract void Update(float dt); + + protected Entity CreateEntity() { + return this.entityManager.CreateEntity(); + } + + protected IEnumerable ReadComponents() where TComponent : struct, IComponent { + return this.componentManager.GetActiveComponentsByType(); + } + + protected TComponent ReadComponent() where TComponent : struct, IComponent { + return this.componentManager.GetActiveComponentByType(); + } + } +} diff --git a/src/Entity.cs b/src/Entity.cs index abdf8ba..709f7d3 100644 --- a/src/Entity.cs +++ b/src/Entity.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; namespace Encompass diff --git a/src/EntityManager.cs b/src/EntityManager.cs index e6ea3e9..d3a9400 100644 --- a/src/EntityManager.cs +++ b/src/EntityManager.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; namespace Encompass { internal class EntityManager { diff --git a/src/World.cs b/src/World.cs index f042800..e3003e6 100644 --- a/src/World.cs +++ b/src/World.cs @@ -1,22 +1,29 @@ +using System.Collections.Generic; + namespace Encompass { public class World { - EntityManager entityManager; - ComponentManager componentManager; + private List engines; + private EntityManager entityManager; + private ComponentManager componentManager; - internal World(EntityManager entityManager, ComponentManager componentManager) { + internal World( + List engines, + EntityManager entityManager, + ComponentManager componentManager + ) { + this.engines = engines; this.entityManager = entityManager; this.componentManager = componentManager; } - public void Update() { + public void Update(float dt) { + foreach (var engine in engines) { + engine.Update(dt); + } + entityManager.DestroyMarkedEntities(); componentManager.ActivateComponents(); componentManager.RemoveComponents(); - - } - - public Entity CreateEntity() { - return entityManager.CreateEntity(); } } } diff --git a/src/WorldBuilder.cs b/src/WorldBuilder.cs index efb48a7..23127cc 100644 --- a/src/WorldBuilder.cs +++ b/src/WorldBuilder.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; namespace Encompass { public class WorldBuilder { + private List engines = new List(); + private ComponentManager componentManager; private EntityManager entityManager; @@ -14,8 +16,23 @@ namespace Encompass { return this.entityManager.CreateEntity(); } + public Engine AddEngine() where TEngine : Engine, new() { + var engine = new TEngine(); + + engine.AssignEntityManager(this.entityManager); + engine.AssignComponentManager(this.componentManager); + + engines.Add(engine); + + return engine; + } + public World Build() { - var world = new World(this.entityManager, this.componentManager); + var world = new World( + this.engines, + this.entityManager, + this.componentManager + ); this.componentManager.ActivateComponents(); this.componentManager.RemoveComponents(); diff --git a/src/encompass-cs.csproj b/src/encompass-cs.csproj index db07349..8b5d141 100644 --- a/src/encompass-cs.csproj +++ b/src/encompass-cs.csproj @@ -12,5 +12,6 @@ + \ No newline at end of file diff --git a/test/EngineTest.cs b/test/EngineTest.cs new file mode 100644 index 0000000..c9a24c2 --- /dev/null +++ b/test/EngineTest.cs @@ -0,0 +1,47 @@ +using NUnit.Framework; +using System.Linq; + +using Encompass; +using System.Collections.Generic; + +namespace Tests { + public class EngineTest + { + static IEnumerable components; + + public class TestEngine : Engine + { + public override void Update(float dt) + { + components = this.ReadComponents(); + } + } + + [Test] + public void ReadComponents() + { + var worldBuilder = new WorldBuilder(); + worldBuilder.AddEngine(); + + var entity = worldBuilder.CreateEntity(); + + MockComponent mockComponent; + mockComponent.myInt = 0; + mockComponent.myString = "hello"; + + MockComponent mockComponentB; + mockComponentB.myInt = 1; + mockComponentB.myString = "howdy"; + + entity.AddComponent(mockComponent); + entity.AddComponent(mockComponentB); + + var world = worldBuilder.Build(); + + world.Update(0.01f); + + Assert.Contains(mockComponent, components.ToList()); + Assert.Contains(mockComponentB, components.ToList()); + } + } +} diff --git a/test/test.csproj b/test/test.csproj index 66b4be6..7b887e7 100644 --- a/test/test.csproj +++ b/test/test.csproj @@ -1,16 +1,17 @@ - - - - netcoreapp2.2 - false - - - - - - - - - - - + + + + netcoreapp2.2 + false + + + + + + + + + + + + \ No newline at end of file