add some convenience methods to Engines
parent
fde3cfe9e3
commit
e964055ec1
|
@ -68,6 +68,23 @@ namespace Encompass
|
||||||
return componentManager.GetEntityIDFromComponentID(componentID);
|
return componentManager.GetEntityIDFromComponentID(componentID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected Entity GetEntityFromComponentID(Guid componentID)
|
||||||
|
{
|
||||||
|
return GetEntity(GetEntityIDFromComponentID(componentID));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected TComponent GetComponentByID<TComponent>(Guid componentID) where TComponent : struct, IComponent
|
||||||
|
{
|
||||||
|
if (componentManager.GetComponentTypeByID(componentID) == typeof(TComponent))
|
||||||
|
{
|
||||||
|
return (TComponent)componentManager.GetComponentByID(componentID);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new ComponentTypeMismatchException("Expected Component to be of type {0} but was actually of type {1}", typeof(TComponent).Name, componentManager.GetComponentTypeByID(componentID).Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected IEnumerable<KeyValuePair<Guid, TComponent>> ReadComponents<TComponent>() where TComponent : struct, IComponent
|
protected IEnumerable<KeyValuePair<Guid, TComponent>> ReadComponents<TComponent>() where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
return componentManager.GetActiveComponentsByType<TComponent>();
|
return componentManager.GetActiveComponentsByType<TComponent>();
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Encompass
|
||||||
|
{
|
||||||
|
public class ComponentTypeMismatchException : Exception
|
||||||
|
{
|
||||||
|
public ComponentTypeMismatchException(
|
||||||
|
string format,
|
||||||
|
params object[] args
|
||||||
|
) : base(string.Format(format, args)) { }
|
||||||
|
}
|
||||||
|
}
|
|
@ -435,5 +435,91 @@ namespace Tests
|
||||||
Assert.That(results, Does.Not.Contain(new KeyValuePair<Guid, MockComponent>(componentID, mockComponent)));
|
Assert.That(results, Does.Not.Contain(new KeyValuePair<Guid, MockComponent>(componentID, mockComponent)));
|
||||||
Assert.That(results, Does.Not.Contain(new KeyValuePair<Guid, MockComponent>(componentBID, mockComponent)));
|
Assert.That(results, Does.Not.Contain(new KeyValuePair<Guid, MockComponent>(componentBID, mockComponent)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Entity entityFromComponentIDResult;
|
||||||
|
class GetEntityFromComponentIDEngine : Engine
|
||||||
|
{
|
||||||
|
public override void Update(float dt)
|
||||||
|
{
|
||||||
|
var componentID = ReadComponent<MockComponent>().Key;
|
||||||
|
entityFromComponentIDResult = GetEntityFromComponentID(componentID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetEntityFromComponentID()
|
||||||
|
{
|
||||||
|
var worldBuilder = new WorldBuilder();
|
||||||
|
worldBuilder.AddEngine<GetEntityFromComponentIDEngine>();
|
||||||
|
|
||||||
|
MockComponent component;
|
||||||
|
component.myInt = 2;
|
||||||
|
component.myString = "howdy";
|
||||||
|
|
||||||
|
var entity = worldBuilder.CreateEntity();
|
||||||
|
entity.AddComponent(component);
|
||||||
|
|
||||||
|
var world = worldBuilder.Build();
|
||||||
|
world.Update(0.01f);
|
||||||
|
|
||||||
|
Assert.That(entity, Is.EqualTo(entityFromComponentIDResult));
|
||||||
|
}
|
||||||
|
|
||||||
|
static MockComponent mockComponentByIDResult;
|
||||||
|
class GetComponentByIDEngine : Engine
|
||||||
|
{
|
||||||
|
public override void Update(float dt)
|
||||||
|
{
|
||||||
|
var componentID = ReadComponent<MockComponent>().Key;
|
||||||
|
mockComponentByIDResult = GetComponentByID<MockComponent>(componentID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[Test]
|
||||||
|
public void GetComponentByID()
|
||||||
|
{
|
||||||
|
var worldBuilder = new WorldBuilder();
|
||||||
|
worldBuilder.AddEngine<GetComponentByIDEngine>();
|
||||||
|
|
||||||
|
MockComponent component;
|
||||||
|
component.myInt = 2;
|
||||||
|
component.myString = "howdy";
|
||||||
|
|
||||||
|
var entity = worldBuilder.CreateEntity();
|
||||||
|
entity.AddComponent(component);
|
||||||
|
|
||||||
|
var world = worldBuilder.Build();
|
||||||
|
world.Update(0.01f);
|
||||||
|
|
||||||
|
Assert.That(component, Is.EqualTo(mockComponentByIDResult));
|
||||||
|
}
|
||||||
|
|
||||||
|
struct OtherComponent : IComponent { }
|
||||||
|
|
||||||
|
class GetComponentByIDWithTypeMismatchEngine : Engine
|
||||||
|
{
|
||||||
|
public override void Update(float dt)
|
||||||
|
{
|
||||||
|
var componentID = ReadComponent<MockComponent>().Key;
|
||||||
|
GetComponentByID<OtherComponent>(componentID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetComponentByIDWithTypeMismatch()
|
||||||
|
{
|
||||||
|
var worldBuilder = new WorldBuilder();
|
||||||
|
worldBuilder.AddEngine<GetComponentByIDWithTypeMismatchEngine>();
|
||||||
|
|
||||||
|
MockComponent component;
|
||||||
|
component.myInt = 2;
|
||||||
|
component.myString = "howdy";
|
||||||
|
|
||||||
|
var entity = worldBuilder.CreateEntity();
|
||||||
|
entity.AddComponent(component);
|
||||||
|
|
||||||
|
var world = worldBuilder.Build();
|
||||||
|
|
||||||
|
Assert.Throws<ComponentTypeMismatchException>(() => world.Update(0.01f));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue