Properly link flecs library

This commit is contained in:
2023-11-09 11:38:29 +01:00
parent dc585396c3
commit 8edcf9305c
1392 changed files with 390081 additions and 164 deletions

View File

@@ -0,0 +1,84 @@
#include <entity_event.h>
#include <stdio.h>
// Entity events are events that are emitted and observed for a specific entity.
// They are a thin wrapper around regular observers, which match against queries
// instead of single entities. While they work similarly under the hood, entity
// events provide a much simpler API.
//
// An entity event only needs two pieces of data:
// - The entity on which to emit the event
// - The event to emit
//
// Any (_) is provided as component, indicating that we're not emitting an event
// for a specific component but rather for the entity itself.
// Event without payload
ECS_TAG_DECLARE(Click);
// Event with payload
typedef struct {
double width, height;
} Resize;
ECS_COMPONENT_DECLARE(Resize);
void OnClick(ecs_iter_t *it) {
// The event source can be obtained with ecs_field_src(1). This allows the
// same event function to be used for different entities.
char *path = ecs_get_fullpath(it->world, ecs_field_src(it, 1));
printf("clicked on %s!\n", path);
ecs_os_free(path);
}
void OnResize(ecs_iter_t *it) {
// Event payload can be obtained from the it->param member
Resize *p = it->param;
char *path = ecs_get_fullpath(it->world, ecs_field_src(it, 1));
printf("resized %s to {%.0f, %.0f}!\n", path, p->width, p->height);
ecs_os_free(path);
}
int main(int argc, char *argv[]) {
ecs_world_t *ecs = ecs_init_w_args(argc, argv);
ECS_TAG_DEFINE(ecs, Click);
ECS_COMPONENT_DEFINE(ecs, Resize);
// Create a widget entity
ecs_entity_t widget = ecs_new_entity(ecs, "MyWidget");
// Create entity observer. Use EcsAny to indicate we're not interested in
// matching specific components.
ecs_observer(ecs, {
.filter.terms = {{ .id = EcsAny, .src.id = widget }},
.events = { Click },
.callback = OnClick
});
// Create another one for the Resize event
ecs_observer(ecs, {
.filter.terms = {{ .id = EcsAny, .src.id = widget }},
.events = { ecs_id(Resize) },
.callback = OnResize
});
// Emit the Click event
ecs_emit(ecs, &(ecs_event_desc_t) {
.event = Click,
.entity = widget
});
// Emit the Resize event
ecs_emit(ecs, &(ecs_event_desc_t) {
.event = ecs_id(Resize),
.entity = widget,
.param = &(Resize){100, 200} // pass payload
});
ecs_fini(ecs);
// Output
// clicked on MyWidget!
// resized MyWidget to {100, 200}!
}