jecs/examples/luau/queries/changetracking.luau

63 lines
1.5 KiB
Text
Raw Normal View History

local jecs = require("@jecs")
2025-02-01 12:07:55 +00:00
local pair = jecs.pair
2025-08-29 15:13:13 +00:00
local world = jecs.world()
local Name = world:component() :: jecs.Id<string>
2025-08-29 15:13:13 +00:00
local function name(e: jecs.Entity): string
return assert(world:get(e, Name))
end
2025-08-29 15:13:13 +00:00
local Position = world:component() :: jecs.Id<vector>
world:set(Position, Name, "Position")
2025-01-14 10:09:18 +00:00
local Previous = jecs.Rest
local added = world
:query(Position)
2025-02-01 12:07:55 +00:00
:without(pair(Previous, Position))
2025-01-14 10:09:18 +00:00
:cached()
local changed = world
2025-02-01 12:07:55 +00:00
:query(Position, pair(Previous, Position))
2025-01-14 10:09:18 +00:00
:cached()
local removed = world
2025-02-01 12:07:55 +00:00
:query(pair(Previous, Position))
2025-01-14 10:09:18 +00:00
:without(Position)
:cached()
2025-02-05 21:26:12 +00:00
2025-08-29 15:13:13 +00:00
local e1 = world:entity()
world:set(e1, Name, "e1")
2025-02-01 12:07:55 +00:00
world:set(e1, Position, vector.create(10, 20, 30))
2025-08-29 15:13:13 +00:00
local e2 = world:entity()
world:set(e2, Name, "e2")
2025-02-01 12:07:55 +00:00
world:set(e2, Position, vector.create(10, 20, 30))
2025-08-29 15:13:13 +00:00
2025-02-01 12:07:55 +00:00
for entity, p in added do
print(`Added {name(entity)}: \{{p.x}, {p.y}, {p.z}}`)
world:set(entity, pair(Previous, Position), p)
2025-01-14 10:09:18 +00:00
end
2025-02-01 12:07:55 +00:00
world:set(e1, Position, vector.create(999, 999, 1998))
2025-08-29 15:13:13 +00:00
for entity, new, old in changed do
2025-01-14 10:09:18 +00:00
if new ~= old then
2025-08-29 15:13:13 +00:00
print(`{name(entity)}'s Position changed from \{{old.x}, {old.y}, {old.z}\} to \{{new.x}, {new.y}, {new.z}\}`)
world:set(entity, pair(Previous, Position), new)
end
2025-01-14 10:09:18 +00:00
end
world:remove(e2, Position)
2025-01-14 10:09:18 +00:00
for e in removed:iter() do
print(`Position was removed from {name(e)}`)
2025-02-01 12:07:55 +00:00
world:remove(e, pair(Previous, Position))
2025-01-14 10:09:18 +00:00
end
-- Output:
-- Added 265: {10, 20, 30}
-- Added 264: {10, 20, 30}
-- e1's Position changed from {10, 20, 30} to {999, 999, 1998}
-- Position was removed from e2