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
  • without debe 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:

NombreCoincide 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:

  1. La consulta recopila los esquemas de componentes requeridos
  2. Recopila los esquemas de componentes excluidos
  3. Itera las entidades coincidentes
  4. 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.