From: = <=> Date: Thu, 24 Sep 2026 13:03:05 +0000 (+0200) Subject: Hook fix X-Git-Url: https://git.uwuaxy.net/?a=commitdiff_plain;h=0f56e1cf01e11da91fa183765adf93cef2ef9941;p=axy%2Fft%2Fpacman.git Hook fix --- diff --git a/src/pacman/ecs/__init__.py b/src/pacman/ecs/__init__.py index b01cb87..92a053e 100644 --- a/src/pacman/ecs/__init__.py +++ b/src/pacman/ecs/__init__.py @@ -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( diff --git a/src/pacman/ecs/hierarchy.py b/src/pacman/ecs/hierarchy.py index 8be7129..fdaaa29 100644 --- a/src/pacman/ecs/hierarchy.py +++ b/src/pacman/ecs/hierarchy.py @@ -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 diff --git a/src/pacman/ecs/world.py b/src/pacman/ecs/world.py index c308d59..9b1014c 100644 --- a/src/pacman/ecs/world.py +++ b/src/pacman/ecs/world.py @@ -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]