A LuaJIT script host for the flecs entity component system. Keep in mind that the project is under development and the API might change unexpectedly.
First the flecs module has to be imported and initialised
#include <flecs-luajit/module_base.h>
#include <flecs.h>
int main(void) {
ecs_world_t* world = ecs_init();
ECS_IMPORT(world, FlecsLuajitBase);
ecs_luajit_init(world);
ecs_luajit_run(world, &(ecs_luajit_run_desc_t) {
.script = { .name = "example.lua" },
});
ecs_progress(world, 0.0f);
return ecs_fini(world);
}An example.lua script that imitates the example in the flecs readme
local flecs = require 'flecs'
local world = flecs.world
local ffi = require 'ffi'
ffi.cdef('typedef struct { ecs_f32_t x, y; } Position, Velocity;')
local Position = world:component {
entity = world:entity { name = 'Position', symbol = 'Position' },
}
local Velocity = world:component {
entity = world:entity { name = 'Velocity', symbol = 'Velocity' },
}
local e = world:entity { name = 'Bob' }
world:set(e, Position, { x = 10, y = 20 })
world:set(e, Velocity, { x = 1, y = 2 })
function Move(iter)
for _, p, v in iter:each() do
p.x = p.x + v.x
p.y = p.y + v.y
end
end
world:system {
entity = world:entity {
name = 'Move',
add = { flecs.pair(flecs.g.DependsOn, flecs.g.OnUpdate) },
},
query = { filter = { expr = "Position, [in] Velocity" } },
callback = 'Move',
}Note that to make this example work with a multithreaded ecs_world_t one has
to make some modifications to the Lua script. A more elaborate example can be
found in the example directory.
The following table shows the compatibility of different versions of
flecs-luajit with those of flecs
| flecs-luajit | flecs |
|---|---|
| master | v3.1.3 |
| v0.1.0 | v3.1.3 |
For now only linux is supported but windows support will come shortly. The
project can be built using the meson build system. E.g.
meson build
meson compile -C build
To run the example application
./build/example/example