]> Untitled Git - axy/ft/pacman.git/commitdiff
Hook fix
author= <=>
Thu, 24 Sep 2026 13:03:05 +0000 (15:03 +0200)
committer= <=>
Thu, 24 Sep 2026 13:03:05 +0000 (15:03 +0200)
src/pacman/ecs/__init__.py
src/pacman/ecs/hierarchy.py
src/pacman/ecs/world.py

index b01cb872263bacda64a15f7f03c15fac5e5b7976..92a053e5fc1b010e85ac408307316d9c957f2a46 100644 (file)
@@ -191,11 +191,19 @@ def sprite_despawn_hook() -> RawComponentHook[WiggleSprite]:
     return inner
 
 
+def sprite_spawn_hook() -> RawComponentHook[WiggleSprite]:
+    def inner(arg: RawComponentArg[WiggleSprite]) -> None:
+        for ent, _ in arg:
+            print("spawn", ent)
+
+    return inner
+
+
 def unspawn_wiggle(
     queue: CommandQueue, q: Query[Entity, WiggleSprite]
 ) -> None:
-    lst = [e for _, e in zip(range(3), q, strict=False)]
-    queue.queue(lambda world: world.despawn_many(lst))
+    lst = [(e, WiggleSprite()) for _, e in zip(range(3), q, strict=False)]
+    queue.queue(lambda world: world.insert_many(WiggleSprite, lst))
 
 
 def close_on_empty(world: World, q: Query[Entity, WiggleSprite]) -> None:
@@ -215,6 +223,7 @@ if __name__ == "__main__":
             close_on_empty,
         )
         .with_hook("remove", WiggleSprite, sprite_despawn_hook)
+        .with_hook("insert", WiggleSprite, sprite_spawn_hook)
     )
     assets = list(Path("./asset").rglob("*.png"))
     root = world.spawn(
index 8be7129ef32a591ba4e63a92ce8aa8419e2510a5..fdaaa29dc5e2587c24742ca7b55b82678f7a1428 100644 (file)
@@ -1,7 +1,7 @@
-from collections.abc import Generator, Iterable
-from typing import cast, get_args
+from collections.abc import Callable, Generator, Iterable
+from typing import cast, get_args, override
 
-from pacman.ecs.world import Component, Entity, World
+from pacman.ecs.world import Component, Entity, FromWorld, World
 
 
 class Children(Component):
@@ -16,6 +16,18 @@ class Children(Component):
 __no_hook = False
 
 
+class Hierarchy(FromWorld):
+    @override
+    @classmethod
+    def extract_from_world(
+        cls, ty: type, world: "World"
+    ) -> Callable[[], Self | None]:
+        pass
+
+    def cleanup(self) -> None:
+        pass
+
+
 def get_parents(world: World, entity: Entity) -> Generator[Entity]:
     """Generate parents of entity including self"""
     yield entity
index c308d59a967f2a8485919772e5e093fde1cd686c..9b1014c65ddd2df824ed0d55352b4c8ca42d5154 100644 (file)
@@ -133,8 +133,12 @@ class Archetype:
         dst, comps_ty = self._compute_add(ty)
         comps = [components_iter(e) for _, e in components]
         positions = [self._positions[e] for e, _ in components]
+        moved_comps = []
         kv = {}
         for k in comps_ty:
+            if k in self._components:
+                lst = self._components[k]
+                moved_comps.append((k, [lst[i] for i in positions]))
             kv[k] = [next(e) for e in comps]
 
         def cb(ty: ComponentID | None) -> Iterable[Any]:
@@ -148,6 +152,11 @@ class Archetype:
         dst._extend(cb)
         self._discard(positions)
 
+        for k, lst in moved_comps:
+            hooks = self._world._components_cache[k][1]
+            hooks._remove(
+                zip((dst._entities[i] for i in itr), lst, strict=True)
+            )
         for k in comps_ty:
             lst = dst._components[k]
             hooks = self._world._components_cache[k][1]