pyxen.world.all()
Consulta entidades por componente.
world.all(*components, without=None)
Devuelve un iterador sobre todas las entidades que coincidan con la consulta.
Este es el núcleo del sistema ECS de Pyxen.
Uso básico
for e in world.all("enemy"):
e.health.value -= 1
Esto itera sobre todas las entidades que tienen el componente "enemy".
Los componentes se identifican por nombre (cadena).
Múltiples componentes
Puedes requerir múltiples componentes:
for e in world.all("position", "velocity"):
e.position.x += e.velocity.x
Esto devuelve solo entidades que tienen ambos componentes.
Piénsalo como:
consulta AND
Excluir componentes (without)
Puedes excluir entidades que tengan componentes específicos usando la palabra clave without.
for e in world.all("enemy", without=("dead",)):
attack(e)
Esto significa:
- Debe tener
"enemy" - NO debe tener
"dead"
Sintaxis completa
world.all(
"required_component_1",
"required_component_2",
...,
without=("excluded_component_1", "excluded_component_2")
)
- Los componentes requeridos son argumentos posicionales
withoutdebe ser una tupla
Ejemplo: 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)
Ejemplo: solo celdas vivas
for cell in world.all("cell", without=("dead",)):
update(cell)
Componentes marcadores en consultas
Los componentes marcadores (componentes solo booleanos) funcionan exactamente igual.
e.enemy = True
Luego:
for e in world.all("enemy"):
...
Los marcadores son extremadamente eficientes en consultas.
Componentes integrados en consultas
Puedes consultar entidades por sus componentes integrados:
for e in world.all("sprite"):
e.color = (1, 0, 0, 1)
Los siguientes nombres de componentes integrados están soportados:
| Nombre | Coincide con entidades que tienen |
|---|---|
"sprite" | Un sprite (imagen asignada) |
"body" | Un grid body (cuerpo de colisión) |
"camera" | Una cámara |
"sound" | Un efecto de sonido |
"music" | Un flujo de música |
"map" | Un grid map (tilemap) |
Puedes mezclar componentes integrados y personalizados en la misma consulta:
for e in world.all("sprite", "enemy"):
e.color = (1, 0, 0, 1)
La exclusión también funciona:
for e in world.all("sprite", without=("body",)):
...
Comportamiento de la consulta
Internamente:
- La consulta recopila los esquemas de componentes requeridos
- Recopila los esquemas de componentes excluidos
- Itera las entidades coincidentes
- Produce identificadores
Entity
Si un nombre de componente no existe:
- Se registra una advertencia
- La consulta continúa igualmente
Notas importantes
Los nombres de componentes deben ser cadenas
world.all("health")
Correcto.
world.all(health)
Incorrecto.
without debe ser una tupla
world.all("enemy", without=("dead",))
Correcto.
world.all("enemy", without="dead")
Incorrecto.
Qué devuelve
world.all() devuelve un iterador.
Puedes:
list(world.all("enemy"))
O:
for e in world.all("enemy"):
...
Notas de seguridad
Si un componente requerido no existe:
- Se registra una advertencia
- La consulta continúa
Si se pasan demasiados componentes, se aplica el límite interno del motor.