mirror of
https://github.com/Ukendio/jecs.git
synced 2025-04-24 17:10:03 +00:00
* Initial commit * Return static function * Fix upvalues conflict * Add examples to luau * rename example folder * Add queries example * Add changetracking example * Add wildcards example * Delete example.project.json
125 lines
2.9 KiB
Text
125 lines
2.9 KiB
Text
local jecs = require("@jecs")
|
|
local pair = jecs.pair
|
|
local ChildOf = jecs.ChildOf
|
|
local world = jecs.World.new()
|
|
|
|
local Name = world:component()
|
|
local Position = world:component()
|
|
local Star = world:component()
|
|
local Planet = world:component()
|
|
local Moon = world:component()
|
|
|
|
local Vector3
|
|
do
|
|
Vector3 = {}
|
|
Vector3.__index = Vector3
|
|
|
|
function Vector3.new(x, y, z)
|
|
x = x or 0
|
|
y = y or 0
|
|
z = z or 0
|
|
return setmetatable({ X = x, Y = y, Z = z }, Vector3)
|
|
end
|
|
|
|
function Vector3.__add(left, right)
|
|
return Vector3.new(
|
|
left.X + right.X,
|
|
left.Y + right.Y,
|
|
left.Z + right.Z
|
|
)
|
|
end
|
|
|
|
function Vector3.__mul(left, right)
|
|
if typeof(right) == "number" then
|
|
return Vector3.new(
|
|
left.X * right,
|
|
left.Y * right,
|
|
left.Z * right
|
|
)
|
|
end
|
|
return Vector3.new(
|
|
left.X * right.X,
|
|
left.Y * right.Y,
|
|
left.Z * right.Z
|
|
)
|
|
end
|
|
|
|
Vector3.one = Vector3.new(1, 1, 1)
|
|
Vector3.zero = Vector3.new()
|
|
end
|
|
|
|
local function path(entity)
|
|
local str = world:get(entity, Name)
|
|
local parent
|
|
while true do
|
|
parent = world:parent(entity)
|
|
if not parent then
|
|
break
|
|
end
|
|
entity = parent
|
|
str = world:get(parent, Name) .. "/" .. str
|
|
end
|
|
return str
|
|
end
|
|
|
|
local function iterate(entity, parent)
|
|
local p = world:get(entity, Position)
|
|
local actual = p + parent
|
|
print(path(entity))
|
|
print(`\{{actual.X}, {actual.Y}, {actual.Z}}`)
|
|
|
|
for child in world:query(pair(ChildOf, entity)) do
|
|
--print(world:get(child, Name))
|
|
iterate(child, actual)
|
|
end
|
|
end
|
|
|
|
local sun = world:entity()
|
|
world:add(sun, Star)
|
|
world:set(sun, Position, Vector3.one)
|
|
world:set(sun, Name, "Sun")
|
|
do
|
|
local earth = world:entity()
|
|
world:set(earth, Name, "Earth")
|
|
world:add(earth, pair(ChildOf, sun))
|
|
world:add(earth, Planet)
|
|
world:set(earth, Position, Vector3.one * 3)
|
|
|
|
do
|
|
local moon = world:entity()
|
|
world:set(moon, Name, "Moon")
|
|
world:add(moon, pair(ChildOf, earth))
|
|
world:add(moon, Moon)
|
|
world:set(moon, Position, Vector3.one * 0.1)
|
|
|
|
print(`Child of Earth? {world:has(moon, pair(ChildOf, earth))}`)
|
|
end
|
|
|
|
local venus = world:entity()
|
|
world:set(venus, Name, "Venus")
|
|
world:add(venus, pair(ChildOf, sun))
|
|
world:add(venus, Planet)
|
|
world:set(venus, Position, Vector3.one * 2)
|
|
|
|
local mercury = world:entity()
|
|
world:set(mercury, Name, "Mercury")
|
|
world:add(mercury, pair(ChildOf, sun))
|
|
world:add(mercury, Planet)
|
|
world:set(mercury, Position, Vector3.one)
|
|
|
|
|
|
iterate(sun, Vector3.zero)
|
|
end
|
|
|
|
-- Output:
|
|
-- Child of Earth? true
|
|
-- Sun
|
|
-- {1, 1, 1}
|
|
-- Sun/Mercury
|
|
-- {2, 2, 2}
|
|
-- Sun/Venus
|
|
-- {3, 3, 3}
|
|
-- Sun/Earth
|
|
-- {4, 4, 4}
|
|
-- Sun/Earth/Moon
|
|
-- {4.1, 4.1, 4.1}
|