```c++
struct MovementSystem : public System<MovementSystem> {
- void update(entityx::EntityManager &es, entityx::EventManager &events, DeltaTime dt) override {
+ void update(entityx::EntityManager &es, entityx::EventManager &events, TimeDelta dt) override {
Position::Handle position;
Direction::Handle direction;
for (Entity entity : es.entities_with_components(position, direction)) {
```c++
class CollisionSystem : public System<CollisionSystem> {
public:
- void update(entityx::EntityManager &es, entityx::EventManager &events, DeltaTime dt) override {
+ void update(entityx::EntityManager &es, entityx::EventManager &events, TimeDelta dt) override {
Position::Handle left_position, right_position;
for (Entity left_entity : es.entities_with_components(left_position)) {
for (Entity right_entity : es.entities_with_components(right_position)) {
event_manager.subscribe<Collision>(*this);
}
- void update(entityx::EntityManager &entities, entityx::EventManager &events, DeltaTime dt) {}
+ void update(entityx::EntityManager &entities, entityx::EventManager &events, TimeDelta dt) {}
void receive(const Collision &collision) {
LOG(DEBUG) << "entities collided: " << collision.left << " and " << collision.right << endl;
}
}
- void update(DeltaTime dt) {
+ void update(TimeDelta dt) {
systems.update<DebugSystem>(dt);
systems.update<MovementSystem>(dt);
systems.update<CollisionSystem>(dt);
template <typename C>
const ComponentHandle<const C> component() const;
+ template <typename ... Components>
+ std::tuple<ComponentHandle<Components>...> components();
+
+ template <typename ... Components>
+ std::tuple<ComponentHandle<const Components>...> components() const;
+
template <typename C>
bool has_component() const;
return ComponentHandle<const C>(this, id);
}
+ template <typename ... Components>
+ std::tuple<ComponentHandle<Components>...> components(Entity::Id id) {
+ return std::make_tuple(component<Components>(id)...);
+ }
+
+ template <typename ... Components>
+ std::tuple<ComponentHandle<const Components>...> components(Entity::Id id) const {
+ return std::make_tuple(component<const Components>(id)...);
+ }
+
/**
* Find Entities that have all of the specified Components.
*
return manager_->component<const C>(id_);
}
+template <typename ... Components>
+std::tuple<ComponentHandle<Components>...> Entity::components() {
+ assert(valid());
+ return manager_->components<Components...>(id_);
+}
+
+template <typename ... Components>
+std::tuple<ComponentHandle<const Components>...> Entity::components() const {
+ assert(valid());
+ return manager_->components<const Components...>(id_);
+}
+
+
template <typename C>
bool Entity::has_component() const {
assert(valid());
REQUIRE(entityMap[c] == 3);
}
+TEST_CASE_METHOD(EntityManagerFixture, "TestEntityComponentsFromTuple") {
+ Entity e = em.create();
+ e.assign<Position>(1, 2);
+ e.assign<Direction>(3, 4);
+
+ std::tuple<Position::Handle, Direction::Handle> components = e.components<Position, Direction>();
+
+ REQUIRE(std::get<0>(components)->x == 1);
+ REQUIRE(std::get<0>(components)->y == 2);
+ REQUIRE(std::get<1>(components)->x == 3);
+ REQUIRE(std::get<1>(components)->y == 4);
+}
+
TEST_CASE("TestComponentDestructorCalledWhenManagerDestroyed") {
struct Freed {
explicit Freed(bool &yes) : yes(yes) {}
*
* Called every game step.
*/
- virtual void update(EntityManager &entities, EventManager &events, DeltaTime dt) = 0;
+ virtual void update(EntityManager &entities, EventManager &events, TimeDelta dt) = 0;
static Family family_counter_;
* Use this class when implementing Systems.
*
* struct MovementSystem : public System<MovementSystem> {
- * void update(EntityManager &entities, EventManager &events, DeltaTime dt) {
+ * void update(EntityManager &entities, EventManager &events, TimeDelta dt) {
* // Do stuff to/with entities...
* }
* }
* Call the System::update() method for a registered system.
*/
template <typename S>
- void update(DeltaTime dt) {
+ void update(TimeDelta dt) {
assert(initialized_ && "SystemManager::configure() not called");
std::shared_ptr<S> s = system<S>();
s->update(entity_manager_, event_manager_, dt);
public:
explicit MovementSystem(string label = "") : label(label) {}
- void update(EntityManager &es, EventManager &events, DeltaTime) override {
+ void update(EntityManager &es, EventManager &events, TimeDelta) override {
EntityManager::View entities =
es.entities_with_components<Position, Direction>();
ComponentHandle<Position> position;
namespace entityx {
static const size_t MAX_COMPONENTS = @ENTITYX_MAX_COMPONENTS@;
-typedef @ENTITYX_DT_TYPE@ DeltaTime;
+typedef @ENTITYX_DT_TYPE@ TimeDelta;
} // namespace entityx
events.subscribe<ComponentAddedEvent<C>>(*this);
}
- virtual void update(EntityManager &entities, EventManager &events, DeltaTime dt) override {}
+ virtual void update(EntityManager &entities, EventManager &events, TimeDelta dt) override {}
private:
template <typename D>
// Updates a body's position and rotation.
struct BodySystem : public ex::System<BodySystem> {
- void update(ex::EntityManager &es, ex::EventManager &events, ex::DeltaTime dt) override {
+ void update(ex::EntityManager &es, ex::EventManager &events, ex::TimeDelta dt) override {
Body::Handle body;
for (ex::Entity entity : es.entities_with_components(body)) {
body->position += body->direction * static_cast<float>(dt);
// Fades out the alpha value of any Renderable and Fadeable entity. Once the
// object has completely faded out it is destroyed.
struct FadeOutSystem : public ex::System<FadeOutSystem> {
- void update(ex::EntityManager &es, ex::EventManager &events, ex::DeltaTime dt) override {
+ void update(ex::EntityManager &es, ex::EventManager &events, ex::TimeDelta dt) override {
Fadeable::Handle fade;
Renderable::Handle renderable;
for (ex::Entity entity : es.entities_with_components(fade, renderable)) {
public:
explicit BounceSystem(sf::RenderTarget &target) : size(target.getSize()) {}
- void update(ex::EntityManager &es, ex::EventManager &events, ex::DeltaTime dt) override {
+ void update(ex::EntityManager &es, ex::EventManager &events, ex::TimeDelta dt) override {
Body::Handle body;
for (ex::Entity entity : es.entities_with_components(body)) {
if (body->position.x + body->direction.x < 0 ||
size.y = size.y / PARTITIONS + 1;
}
- void update(ex::EntityManager &es, ex::EventManager &events, ex::DeltaTime dt) override {
+ void update(ex::EntityManager &es, ex::EventManager &events, ex::TimeDelta dt) override {
reset();
collect(es);
collide(events);
events.subscribe<CollisionEvent>(*this);
}
- void update(ex::EntityManager &es, ex::EventManager &events, ex::DeltaTime dt) override {
+ void update(ex::EntityManager &es, ex::EventManager &events, ex::TimeDelta dt) override {
for (ex::Entity entity : collided) {
emit_particles(es, entity);
entity.destroy();
text.setColor(sf::Color::White);
}
- void update(ex::EntityManager &es, ex::EventManager &events, ex::DeltaTime dt) override {
+ void update(ex::EntityManager &es, ex::EventManager &events, ex::TimeDelta dt) override {
Body::Handle body;
Renderable::Handle renderable;
for (ex::Entity entity : es.entities_with_components(body, renderable)) {
}
}
- void update(ex::DeltaTime dt) {
+ void update(ex::TimeDelta dt) {
systems.update<BodySystem>(dt);
systems.update<FadeOutSystem>(dt);
systems.update<BounceSystem>(dt);