methods. Both methods will return only those entities that have *all* of the
specified components associated with them.
-`entityx::EntityManager::each(f) provides functional-style iteration over
-`entity components. The callback for `each()` can optionally accept an Entity as
-`its first argument.
+`entityx::EntityManager::each(f)` provides functional-style iteration over
+entity components:
```c++
entities.each<Position, Direction>([](Entity entity, Position &position, Direction &direction) {
```c++
struct MovementSystem : public System<MovementSystem> {
void update(entityx::EntityManager &es, entityx::EventManager &events, TimeDelta dt) override {
- es.each<Position, Direction>([dt](Position &position, Direction &direction) {
+ es.each<Position, Direction>([dt](Entity entity, Position &position, Direction &direction) {
position.x += direction.x * dt;
position.y += direction.y * dt;
});
public:
template <typename T> struct identity { typedef T type; };
- void each(typename identity<std::function<void(Components&...)>>::type f) {
- for (auto it : *this)
- f(*(it.template component<Components>().get())...);
- }
-
void each(typename identity<std::function<void(Entity entity, Components&...)>>::type f) {
for (auto it : *this)
f(it, *(it.template component<Components>().get())...);
template <typename T> struct identity { typedef T type; };
- template <typename ... Components>
- void each(typename identity<std::function<void(Components&...)>>::type f) {
- return entities_with_components<Components...>().each(f);
- }
-
template <typename ... Components>
void each(typename identity<std::function<void(Entity entity, Components&...)>>::type f) {
return entities_with_components<Components...>().each(f);
Entity a = em.create();
a.assign<Position>(1, 2);
int count = 0;
- em.each<Position>([&count](Position &position) {
+ em.each<Position>([&count](Entity entity, Position &position) {
count++;
REQUIRE(position.x == 1);
REQUIRE(position.y == 2);
}
TEST_CASE_METHOD(EntityManagerFixture, "TestViewEach") {
- Entity a = em.create();
- a.assign<Position>(1, 2);
- int count = 0;
- em.entities_with_components<Position>().each([&count](Position &position) {
- count++;
- REQUIRE(position.x == 1);
- REQUIRE(position.y == 2);
- });
- REQUIRE(count == 1);
-}
-
-TEST_CASE_METHOD(EntityManagerFixture, "TestViewEachWithEntity") {
Entity a = em.create();
a.assign<Position>(1, 2);
int count = 0;
count++;
REQUIRE(position.x == 1);
REQUIRE(position.y == 2);
- REQUIRE(*entity.component<Position>().get() == position);
});
REQUIRE(count == 1);
}
void update(ex::EntityManager &es, ex::EventManager &events, ex::TimeDelta dt) override {
int c = 0;
ex::ComponentHandle<Collideable> collideable;
- es.each<Collideable>([&](Collideable&) { ++c; });
+ es.each<Collideable>([&](ex::Entity entity, Collideable&) { ++c; });
for (int i = 0; i < count - c; i++) {
ex::Entity entity = es.create();
// Updates a body's position and rotation.
struct BodySystem : public ex::System<BodySystem> {
void update(ex::EntityManager &es, ex::EventManager &events, ex::TimeDelta dt) override {
- es.each<Body>([dt](Body &body) {
+ es.each<Body>([dt](ex::Entity entity, Body &body) {
body.position += body.direction * static_cast<float>(dt);
body.rotation += body.rotationd * dt;
});
explicit BounceSystem(sf::RenderTarget &target) : size(target.getSize()) {}
void update(ex::EntityManager &es, ex::EventManager &events, ex::TimeDelta dt) override {
- es.each<Body>([this](Body &body) {
+ es.each<Body>([this](ex::Entity entity, Body &body) {
if (body.position.x + body.direction.x < 0 ||
body.position.x + body.direction.x >= size.x)
body.direction.x = -body.direction.x;
void update(ex::EntityManager &es, ex::EventManager &events, ex::TimeDelta dt) override {
sf::VertexArray vertices(sf::Quads);
- es.each<Particle, Body>([&vertices](Particle &particle, Body &body) {
+ es.each<Particle, Body>([&vertices](ex::Entity entity, Particle &particle, Body &body) {
const float r = particle.radius;
vertices.append(sf::Vertex(body.position + sf::Vector2f(-r, -r), particle.colour));
vertices.append(sf::Vertex(body.position + sf::Vector2f(r, -r), particle.colour));
}
void update(ex::EntityManager &es, ex::EventManager &events, ex::TimeDelta dt) override {
- es.each<Body, Renderable>([this](Body &body, Renderable &renderable) {
+ es.each<Body, Renderable>([this](ex::Entity entity, Body &body, Renderable &renderable) {
renderable.shape->setPosition(body.position);
renderable.shape->setRotation(body.rotation);
target.draw(*renderable.shape.get());