Skip to content

Cookbook

ecs_init();
ecs_entity_t entity = ecs_new();
ecs_fini();
ECS_RESOURCE(Time, { float dt; });
ECS_COMPONENT(Position, { float x; });
ECS_COMPONENT(Velocity, { float x; });
static void Move(ecs_iter_t *it) {
const Time *time = ecs_get_resource_read(it->world, Time);
Position *p = ecs_field(it, 0);
const Velocity *v = ecs_field(it, 1);
for (uint32_t i = 0; i < it->count; i++) p[i].x += v[i].x * time->dt;
}
ecs_entity_t parent = ecs_new();
ecs_entity_t child = ecs_new();
ecs_set(child, ChildOf, { parent });

ChildOf cascades deletion: killing the parent also kills its children.

ecs_query_id_t q = ecs_query({
.terms = { ecs_inout(Position), ecs_in_optional(Velocity) },
});
static void OnPositionSet(ecs_observer_event_t *event) {
const Position *incoming = event->trigger_data;
(void)incoming;
}
ecs_observer({
.on = EcsOnSet,
.query.terms = { ecs_in(Position) },
.callback = OnPositionSet,
});
ecs_add(entity, Disabled);
ecs_remove(entity, Disabled);

Normal queries skip disabled entities. Add ecs_filter(Disabled) to match them explicitly.