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",)):
...
쿼리 동작
내부적으로:
- 필수 컴포넌트 스키마 수집
- 제외 컴포넌트 스키마 수집
- 일치하는 엔티티 순회
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"):
...
안전 참고
필수 컴포넌트가 존재하지 않으면:
- 경고 로그
- 쿼리 계속
너무 많은 컴포넌트가 전달되면 엔진의 내부 제한이 적용됩니다.