pyxen.world.all()

컴포넌트로 엔티티를 쿼리합니다.

world.all(*components, without=None)

쿼리와 일치하는 모든 엔티티에 대한 이터레이터를 반환합니다.

Pyxen ECS 시스템의 핵심입니다.


기본 사용법

for e in world.all("enemy"):
    e.health.value -= 1

"enemy" 컴포넌트를 가진 모든 엔티티를 순회합니다.

컴포넌트는 **이름 (문자열)**으로 식별됩니다.


다중 컴포넌트

여러 컴포넌트를 요구할 수 있습니다:

for e in world.all("position", "velocity"):
    e.position.x += e.velocity.x

컴포넌트를 모두 가진 엔티티만 반환합니다.

AND 쿼리로 생각하세요.


컴포넌트 제외 (without)

without 키워드를 사용하여 특정 컴포넌트를 가진 엔티티를 제외할 수 있습니다.

for e in world.all("enemy", without=("dead",)):
    attack(e)

의미:

  • "enemy"가 있어야 함
  • "dead"가 없어야 함

전체 구문

world.all(
    "required_component_1",
    "required_component_2",
    ...,
    without=("excluded_component_1", "excluded_component_2")
)
  • 필수 컴포넌트는 위치 인수
  • without는 튜플이어야 함

예시: Game of Life

for cell in world.all("cell"):
    if cell.alive and cell.next_alive:
        cell.color = (0.25, 0.15, 0.85, 1.0)

예시: 살아있는 셀만

for cell in world.all("cell", without=("dead",)):
    update(cell)

쿼리에서의 마커 컴포넌트

마커 컴포넌트 (불리언 전용 컴포넌트)도 동일하게 작동합니다.

e.enemy = True

그런 다음:

for e in world.all("enemy"):
    ...

마커는 쿼리에서 매우 효율적입니다.


쿼리에서의 내장 컴포넌트

내장 컴포넌트로 엔티티를 쿼리할 수 있습니다:

for e in world.all("sprite"):
    e.color = (1, 0, 0, 1)

지원되는 내장 컴포넌트 이름:

이름일치하는 엔티티
"sprite"스프라이트가 있는 (이미지 할당됨)
"body"그리드 바디가 있는 (충돌 바디)
"camera"카메라가 있는
"sound"효과음이 있는
"music"음악 스트림이 있는
"map"그리드 맵이 있는 (타일맵)

같은 쿼리에서 내장과 커스텀 컴포넌트를 혼합할 수 있습니다:

for e in world.all("sprite", "enemy"):
    e.color = (1, 0, 0, 1)

제외도 작동합니다:

for e in world.all("sprite", without=("body",)):
    ...

쿼리 동작

내부적으로:

  1. 필수 컴포넌트 스키마 수집
  2. 제외 컴포넌트 스키마 수집
  3. 일치하는 엔티티 순회
  4. Entity 핸들 yield

컴포넌트 이름이 존재하지 않으면:

  • 경고 로그
  • 쿼리는 계속 진행

중요 참고

컴포넌트 이름은 문자열이어야 함

world.all("health")

올바름.

world.all(health)

잘못됨.


without는 튜플이어야 함

world.all("enemy", without=("dead",))

올바름.

world.all("enemy", without="dead")

잘못됨.


반환값

world.all()은 이터레이터를 반환합니다.

다음과 같이 사용:

list(world.all("enemy"))

또는:

for e in world.all("enemy"):
    ...

안전 참고

필수 컴포넌트가 존재하지 않으면:

  • 경고 로그
  • 쿼리 계속

너무 많은 컴포넌트가 전달되면 엔진의 내부 제한이 적용됩니다.