From 6759ae0ab9ebec69d5dfa34b8a352816dda38f96 Mon Sep 17 00:00:00 2001 From: Ukendio Date: Sat, 3 Aug 2024 05:06:51 +0200 Subject: [PATCH] Add queries example --- .../luau/entities/{basic.luau => basics.luau} | 2 +- examples/luau/entities/hierarchy.luau | 2 +- examples/luau/queries/basics.luau | 75 +++++++++++++++++++ 3 files changed, 77 insertions(+), 2 deletions(-) rename examples/luau/entities/{basic.luau => basics.luau} (99%) create mode 100644 examples/luau/queries/basics.luau diff --git a/examples/luau/entities/basic.luau b/examples/luau/entities/basics.luau similarity index 99% rename from examples/luau/entities/basic.luau rename to examples/luau/entities/basics.luau index a6329ad..5833b3e 100644 --- a/examples/luau/entities/basic.luau +++ b/examples/luau/entities/basics.luau @@ -39,7 +39,7 @@ for entity, p in world:query(Position) do print(`{entity}: \{{p.X}, {p.Y}, {p.Z}\}`) end --- Output +-- Output: -- {10, 20, 30} -- Alice: {10, 20, 30} -- Bob: {40, 50, 60} diff --git a/examples/luau/entities/hierarchy.luau b/examples/luau/entities/hierarchy.luau index 167d13f..2882be4 100644 --- a/examples/luau/entities/hierarchy.luau +++ b/examples/luau/entities/hierarchy.luau @@ -111,7 +111,7 @@ do iterate(sun, Vector3.zero) end --- Output +-- Output: -- Child of Earth? true -- Sun -- {1, 1, 1} diff --git a/examples/luau/queries/basics.luau b/examples/luau/queries/basics.luau new file mode 100644 index 0000000..b085e9e --- /dev/null +++ b/examples/luau/queries/basics.luau @@ -0,0 +1,75 @@ +local ecs = require("@jecs") +local world = ecs.World.new() + +local Position = world:component() +local Velocity = world:component() +local Name = 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 + +-- Create a few test entities for a Position, Velocity query +local e1 = world:entity() +world:set(e1, Name, "e1") +world:set(e1, Position, Vector3.new(10, 20, 30)) +world:set(e1, Velocity, Vector3.new(1, 2, 3)) + +local e2 = world:entity() +world:set(e2, Name, "e2") +world:set(e2, Position, Vector3.new(10, 20, 30)) +world:set(e2, Velocity, Vector3.new(4, 5, 6)) + +-- This entity will not match as it does not have Position, Velocity +local e3 = world:entity() +world:set(e3, Name, "e3") +world:set(e3, Position, Vector3.new(10, 20, 30)) + +-- Create an uncached query for Position, Velocity. +for entity, p, v in world:query(Position, Velocity) do + -- Iterate entities matching the query + p.X += v.X + p.Y += v.Y + p.Z += v.Z + + print(`{world:get(entity, Name)}: \{{p.X}, {p.Y}, {p.Z}}`) +end + +-- Output: +-- e2: {14, 25, 36} +-- e1: {11, 22, 33}