mirror of
https://github.com/Ukendio/jecs.git
synced 2025-08-04 19:29:18 +00:00
Compare commits
1 commit
2134a6eab3
...
7e638a372e
Author | SHA1 | Date | |
---|---|---|---|
|
7e638a372e |
7 changed files with 47 additions and 114 deletions
|
@ -1,13 +1,13 @@
|
|||
|
||||
--!strict
|
||||
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
||||
local types = require(ReplicatedStorage.types)
|
||||
local ct = require(ReplicatedStorage.components)
|
||||
|
||||
local function entities_delete(world: types.World, dt: number)
|
||||
for e in world:each(ct.Destroy) do
|
||||
world:delete(e)
|
||||
end
|
||||
end
|
||||
|
||||
return entities_delete
|
||||
|
||||
--!strict
|
||||
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
||||
local types = require(ReplicatedStorage.types)
|
||||
local ct = require(ReplicatedStorage.components)
|
||||
|
||||
local function entities_delete(world: types.World, dt: number)
|
||||
for e in world:each(ct.Destroy) do
|
||||
world:delete(e)
|
||||
end
|
||||
end
|
||||
|
||||
return entities_delete
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
||||
local ct = require(ReplicatedStorage.components)
|
||||
local types = require(ReplicatedStorage.types)
|
||||
|
||||
return function(world: types.World, dt: number)
|
||||
for e in world:query(ct.Player):without(ct.Health) do
|
||||
world:set(e, ct.Health, 100)
|
||||
end
|
||||
|
||||
for e, health in world:query(ct.Health) do
|
||||
if math.random() < 1 / 60 / 30 then
|
||||
world:set(e, ct.Health, 100)
|
||||
end
|
||||
end
|
||||
end
|
||||
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
||||
local ct = require(ReplicatedStorage.components)
|
||||
local types = require(ReplicatedStorage.types)
|
||||
|
||||
return function(world: types.World, dt: number)
|
||||
for e in world:query(ct.Player):without(ct.Health) do
|
||||
world:set(e, ct.Health, 100)
|
||||
end
|
||||
|
||||
for e, health in world:query(ct.Health) do
|
||||
if math.random() < 1 / 60 / 30 then
|
||||
world:set(e, ct.Health, 100)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
|
||||
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
||||
local ct = require(ReplicatedStorage.components)
|
||||
local types = require(ReplicatedStorage.types)
|
||||
|
||||
return function(world: types.World, dt: number)
|
||||
for e, lifetime in world:query(ct.Lifetime) do
|
||||
if os.clock() > lifetime.created + lifetime.duration then
|
||||
world:add(e, ct.Destroy)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
||||
local ct = require(ReplicatedStorage.components)
|
||||
local types = require(ReplicatedStorage.types)
|
||||
|
||||
return function(world: types.World, dt: number)
|
||||
for e, lifetime in world:query(ct.Lifetime) do
|
||||
if os.clock() > lifetime.created + lifetime.duration then
|
||||
world:add(e, ct.Destroy)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
17
jecs.luau
17
jecs.luau
|
@ -781,7 +781,6 @@ local function archetype_register(world: World, archetype: Archetype)
|
|||
local archetype_id = archetype.id
|
||||
local columns_map = archetype.columns_map
|
||||
local columns = archetype.columns
|
||||
|
||||
for i, component_id in archetype.types do
|
||||
local idr = id_record_ensure(world, component_id)
|
||||
local is_tag = bit32.btest(idr.flags, ECS_ID_IS_TAG)
|
||||
|
@ -804,10 +803,6 @@ local function archetype_register(world: World, archetype: Archetype)
|
|||
archetype_append_to_records(idr_t, archetype_id, columns_map, t, i, column)
|
||||
end
|
||||
end
|
||||
|
||||
world.archetype_index[archetype.type] = archetype
|
||||
world.archetypes[archetype_id] = archetype
|
||||
world.archetype_edges[archetype.id] = {} :: Map<Id, Archetype>
|
||||
end
|
||||
|
||||
local function archetype_create(world: World, id_types: { Id }, ty, prev: i53?): Archetype
|
||||
|
@ -829,7 +824,7 @@ local function archetype_create(world: World, id_types: { Id }, ty, prev: i53?):
|
|||
dead = false,
|
||||
}
|
||||
|
||||
archetype_register(world, archetype, false)
|
||||
archetype_register(world, archetype)
|
||||
|
||||
for id in columns_map do
|
||||
local observer_list = find_observers(world, EcsOnArchetypeCreate, id)
|
||||
|
@ -843,6 +838,9 @@ local function archetype_create(world: World, id_types: { Id }, ty, prev: i53?):
|
|||
end
|
||||
end
|
||||
|
||||
world.archetype_index[ty] = archetype
|
||||
world.archetypes[archetype_id] = archetype
|
||||
world.archetype_edges[archetype.id] = {} :: Map<Id, Archetype>
|
||||
|
||||
return archetype
|
||||
end
|
||||
|
@ -1080,8 +1078,6 @@ local function archetype_destroy(world: World, archetype: Archetype)
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
archetype.dead = true
|
||||
end
|
||||
|
||||
local function NOOP() end
|
||||
|
@ -2328,10 +2324,6 @@ local function world_new()
|
|||
end
|
||||
edge[id] = to
|
||||
else
|
||||
if to.dead then
|
||||
archetype_register(world, to)
|
||||
to.dead = false
|
||||
end
|
||||
idr = component_index[id]
|
||||
end
|
||||
if from == to then
|
||||
|
@ -2350,7 +2342,6 @@ local function world_new()
|
|||
if on_add then
|
||||
on_add(entity, id)
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
local to = archetype_traverse_add(world, id, from)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@rbxts/jecs",
|
||||
"version": "0.8.3",
|
||||
"version": "0.8.2",
|
||||
"description": "Stupidly fast Entity Component System",
|
||||
"main": "jecs.luau",
|
||||
"repository": {
|
||||
|
|
|
@ -24,44 +24,6 @@ type Id<T=unknown> = jecs.Id<T>
|
|||
local entity_visualiser = require("@tools/entity_visualiser")
|
||||
local dwi = entity_visualiser.stringify
|
||||
|
||||
FOCUS()
|
||||
TEST("", function()
|
||||
local world = jecs.world()
|
||||
local data = world:component()
|
||||
local relation = world:component()
|
||||
world:add(relation, jecs.pair(jecs.OnDeleteTarget, jecs.Delete))
|
||||
|
||||
local e1 = world:entity()
|
||||
local e2 = world:entity()
|
||||
world:set(e2, data, 456)
|
||||
world:add(e2, jecs.pair(relation, e1))
|
||||
world:delete(e1)
|
||||
|
||||
local e1v1 = world:entity()
|
||||
CHECK(ECS_ID(e1v1) == e1)
|
||||
local e2v1 = world:entity()
|
||||
CHECK(ECS_ID(e2v1) == e2)
|
||||
world:set(e2v1, data, 456)
|
||||
|
||||
CHECK(world:contains(e1v1))
|
||||
CHECK(not world:contains(e2))
|
||||
CHECK(world:contains(e2v1))
|
||||
|
||||
local count = 0
|
||||
for i,val in world:query(data):iter() do
|
||||
count += 1
|
||||
end
|
||||
CHECK(count == 1)
|
||||
count = 0
|
||||
world:add(e2v1, jecs.pair(relation, e1v1))
|
||||
CHECK(world:has(e2v1, jecs.pair(relation, e1v1)))
|
||||
|
||||
for i,val in world:query(data):iter() do
|
||||
count += 1
|
||||
end
|
||||
|
||||
CHECK(count==1)
|
||||
end)
|
||||
TEST("bulk", function()
|
||||
local world = jecs.world()
|
||||
local A = world:component()
|
||||
|
@ -923,6 +885,7 @@ TEST("world:each()", function()
|
|||
end
|
||||
end)
|
||||
|
||||
FOCUS()
|
||||
TEST("world:range()", function()
|
||||
|
||||
do CASE "spawn entity under min range"
|
||||
|
@ -1159,7 +1122,6 @@ end)
|
|||
|
||||
TEST("world:query()", function()
|
||||
local N = 2^8
|
||||
|
||||
do CASE "cached"
|
||||
local world = jecs.world()
|
||||
local Foo = world:component()
|
||||
|
@ -1196,26 +1158,6 @@ TEST("world:query()", function()
|
|||
world:delete(Foo)
|
||||
CHECK(#q:archetypes() == 0)
|
||||
end
|
||||
|
||||
do CASE "3 components"
|
||||
local world = jecs.world()
|
||||
local A = world:component() :: jecs.Entity<boolean>
|
||||
local B = world:component() :: jecs.Entity<boolean>
|
||||
local C = world:component() :: jecs.Entity<boolean>
|
||||
local e = world:entity()
|
||||
world:set(e, A, true)
|
||||
world:set(e, B, true)
|
||||
world:set(e, C, true)
|
||||
local q = world:query(A, B, C):cached()
|
||||
local counter = 0
|
||||
for x, a, b, c in q:iter() do
|
||||
counter += 1
|
||||
CHECK(a)
|
||||
CHECK(b)
|
||||
CHECK(c)
|
||||
end
|
||||
CHECK(counter == 1)
|
||||
end
|
||||
do CASE "multiple iter"
|
||||
local world = jecs.world()
|
||||
local A = world:component() :: jecs.Entity<string>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "ukendio/jecs"
|
||||
version = "0.8.3"
|
||||
version = "0.8.2"
|
||||
registry = "https://github.com/UpliftGames/wally-index"
|
||||
realm = "shared"
|
||||
license = "MIT"
|
||||
|
|
Loading…
Reference in a new issue