all component reads use ComponentMessage now

pull/5/head
Evan Hemsley 2019-07-18 17:50:38 -07:00
parent a42123f58d
commit 3deff94dfe
3 changed files with 80 additions and 42 deletions

View File

@ -161,7 +161,7 @@ namespace Encompass
throw new IllegalReadException("Engine {0} tried to read undeclared Component {1}", GetType().Name, typeof(TComponent).Name); throw new IllegalReadException("Engine {0} tried to read undeclared Component {1}", GetType().Name, typeof(TComponent).Name);
} }
return componentManager.GetComponentsByEntityAndType<TComponent>(entity.ID); return ReadMessages<ComponentMessage<TComponent>>().Where((message) => message.entity == entity).Select((message) => (message.componentID, message.component));
} }
protected ValueTuple<Guid, TComponent> GetComponent<TComponent>(Entity entity) where TComponent : struct, IComponent protected ValueTuple<Guid, TComponent> GetComponent<TComponent>(Entity entity) where TComponent : struct, IComponent
@ -176,7 +176,7 @@ namespace Encompass
throw new IllegalReadException("Engine {0} tried to read undeclared Component {1}", GetType().Name, typeof(TComponent).Name); throw new IllegalReadException("Engine {0} tried to read undeclared Component {1}", GetType().Name, typeof(TComponent).Name);
} }
return messageManager.GetMessagesByType<ComponentMessage<TComponent>>().Where((message) => message.entity == entity).Any(); return ReadMessages<ComponentMessage<TComponent>>().Where((message) => message.entity == entity).Any();
} }
internal void UpdateComponentInWorld<TComponent>(Guid componentID, TComponent newComponent) where TComponent : struct, IComponent internal void UpdateComponentInWorld<TComponent>(Guid componentID, TComponent newComponent) where TComponent : struct, IComponent
@ -241,7 +241,7 @@ namespace Encompass
throw new IllegalReadException("Engine {0} tried to read undeclared Message {1}", GetType().Name, typeof(TMessage).Name); throw new IllegalReadException("Engine {0} tried to read undeclared Message {1}", GetType().Name, typeof(TMessage).Name);
} }
return messageManager.GetMessagesByType<TMessage>().Any(); return ReadMessages<TMessage>().Any();
} }
protected bool SomeComponent<TComponent>() where TComponent : struct, IComponent protected bool SomeComponent<TComponent>() where TComponent : struct, IComponent
@ -251,7 +251,7 @@ namespace Encompass
throw new IllegalReadException("Engine {0} tried to read undeclared Component {1}", GetType().Name, typeof(TComponent).Name); throw new IllegalReadException("Engine {0} tried to read undeclared Component {1}", GetType().Name, typeof(TComponent).Name);
} }
return componentManager.GetActiveComponentsByType<TComponent>().Any(); return ReadMessages<ComponentMessage<TComponent>>().Any();
} }
protected void Destroy(Guid entityID) protected void Destroy(Guid entityID)

View File

@ -24,20 +24,6 @@ namespace Tests
static IEnumerable<(Guid, MockComponent)> gottenMockComponentIDPairs = Enumerable.Empty<(Guid, MockComponent)>(); static IEnumerable<(Guid, MockComponent)> gottenMockComponentIDPairs = Enumerable.Empty<(Guid, MockComponent)>();
static (Guid, MockComponent) gottenMockComponentIDPair; static (Guid, MockComponent) gottenMockComponentIDPair;
[Reads(typeof(EntityMessage), typeof(MockComponent))]
class GetMockComponentsEngine : Engine
{
public override void Update(double dt)
{
gottenMockComponentIDPairs = Enumerable.Empty<(Guid, MockComponent)>();
foreach (var entityMessage in ReadMessages<EntityMessage>())
{
gottenMockComponentIDPairs = GetComponents<MockComponent>(entityMessage.entity);
}
}
}
[Reads(typeof(EntityMessage), typeof(MockComponent))] [Reads(typeof(EntityMessage), typeof(MockComponent))]
class GetMockComponentEngine : Engine class GetMockComponentEngine : Engine
{ {
@ -166,12 +152,51 @@ namespace Tests
world.Update(0.01); world.Update(0.01);
} }
[Reads(typeof(EntityMessage), typeof(MockComponent))]
class GetMockComponentsEngine : Engine
{
private Entity entity;
private Guid componentAID;
private Guid componentBID;
private Guid componentCID;
private MockComponent componentA;
private MockComponent componentB;
private MockComponent componentC;
public GetMockComponentsEngine(
Entity entity,
Guid componentAID,
MockComponent componentA,
Guid componentBID,
MockComponent componentB,
Guid componentCID,
MockComponent componentC
) {
this.entity = entity;
this.componentAID = componentAID;
this.componentA = componentA;
this.componentBID = componentBID;
this.componentB = componentB;
this.componentCID = componentCID;
this.componentC = componentC;
}
public override void Update(double dt)
{
foreach (var entityMessage in ReadMessages<EntityMessage>())
{
var results = GetComponents<MockComponent>(entityMessage.entity);
results.Should().Contain((componentAID, componentA));
results.Should().Contain((componentBID, componentB));
results.Should().Contain((componentCID, componentC));
}
}
}
[Test] [Test]
public void GetComponents() public void GetComponents()
{ {
var worldBuilder = new WorldBuilder(); var worldBuilder = new WorldBuilder();
worldBuilder.AddEngine(new GetMockComponentsEngine());
var entity = worldBuilder.CreateEntity(); var entity = worldBuilder.CreateEntity();
MockComponent mockComponentA; MockComponent mockComponentA;
@ -190,6 +215,16 @@ namespace Tests
var componentBID = worldBuilder.AddComponent(entity, mockComponentB); var componentBID = worldBuilder.AddComponent(entity, mockComponentB);
var componentCID = worldBuilder.AddComponent(entity, mockComponentC); var componentCID = worldBuilder.AddComponent(entity, mockComponentC);
worldBuilder.AddEngine(new GetMockComponentsEngine(
entity,
componentAID,
mockComponentA,
componentBID,
mockComponentB,
componentCID,
mockComponentC
));
EntityMessage entityMessage; EntityMessage entityMessage;
entityMessage.entity = entity; entityMessage.entity = entity;
worldBuilder.EmitMessage(entityMessage); worldBuilder.EmitMessage(entityMessage);
@ -197,10 +232,6 @@ namespace Tests
var world = worldBuilder.Build(); var world = worldBuilder.Build();
world.Update(0.01); world.Update(0.01);
gottenMockComponentIDPairs.Should().Contain((componentAID, mockComponentA));
gottenMockComponentIDPairs.Should().Contain((componentBID, mockComponentB));
gottenMockComponentIDPairs.Should().Contain((componentCID, mockComponentC));
} }
[Test] [Test]
@ -422,13 +453,6 @@ namespace Tests
public override void Update(double dt) public override void Update(double dt)
{ {
if (SomeMessage<ActivateComponentMessage>()) if (SomeMessage<ActivateComponentMessage>())
{
CheckHasMockComponentMessage checkHasMockComponentMessage;
checkHasMockComponentMessage.entity = entity;
checkHasMockComponentMessage.shouldHaveComponent = false;
EmitMessage(checkHasMockComponentMessage);
}
else
{ {
CheckHasMockComponentMessage checkHasMockComponentMessage; CheckHasMockComponentMessage checkHasMockComponentMessage;
checkHasMockComponentMessage.entity = entity; checkHasMockComponentMessage.entity = entity;
@ -444,20 +468,11 @@ namespace Tests
public override void Update(double dt) public override void Update(double dt)
{ {
foreach (var checkHasMockComponentMessage in ReadMessages<CheckHasMockComponentMessage>()) foreach (var checkHasMockComponentMessage in ReadMessages<CheckHasMockComponentMessage>())
{
if (checkHasMockComponentMessage.shouldHaveComponent)
{ {
Assert.IsTrue(HasComponent<MockComponent>(checkHasMockComponentMessage.entity)); Assert.IsTrue(HasComponent<MockComponent>(checkHasMockComponentMessage.entity));
} }
else
{
Assert.IsFalse(HasComponent<MockComponent>(checkHasMockComponentMessage.entity));
} }
} }
}
}
// TODO: need to rethink this test because ActivateComponent is instant now
[Test] [Test]
public void ActivateComponent() public void ActivateComponent()
@ -485,7 +500,6 @@ namespace Tests
var world = worldBuilder.Build(); var world = worldBuilder.Build();
world.Update(0.01); world.Update(0.01);
world.Update(0.01);
} }
struct DeactivateComponentMessage : IMessage struct DeactivateComponentMessage : IMessage

24
test/EntityTest.cs Normal file
View File

@ -0,0 +1,24 @@
using NUnit.Framework;
using FluentAssertions;
using Encompass;
namespace Tests
{
public class EntityTests
{
[Test]
public void Equals()
{
var worldBuilder = new WorldBuilder();
var entity = worldBuilder.CreateEntity();
var entityTwo = worldBuilder.CreateEntity();
var copyEntity = entity;
Assert.AreNotEqual(entity, entityTwo);
Assert.AreEqual(entity, entity);
Assert.IsTrue(entity == copyEntity);
}
}
}