pyxen.world.all()

Entities nach Komponente abfragen.

world.all(*components, without=None)

Gibt einen Iterator über alle Entities zurück, die der Abfrage entsprechen.

Dies ist der Kern von Pyxens ECS-System.


Grundlegende Verwendung

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

Dies iteriert über alle Entities, die die "enemy"-Komponente haben.

Komponenten werden per Name (String) identifiziert.


Mehrere Komponenten

Du kannst mehrere Komponenten verlangen:

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

Dies gibt nur Entities zurück, die beide Komponenten haben.

Denke daran als:

UND-Abfrage

Komponenten ausschließen (without)

Du kannst Entities ausschließen, die bestimmte Komponenten haben, mit dem without-Keyword.

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

Das bedeutet:

  • Muss "enemy" haben
  • Darf "dead" NICHT haben

Vollständige Syntax

world.all(
    "required_component_1",
    "required_component_2",
    ...,
    without=("excluded_component_1", "excluded_component_2")
)
  • Erforderliche Komponenten sind positionelle Argumente
  • without muss ein Tupel sein

Beispiel: 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)

Beispiel: Nur lebende Zellen

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

Marker-Components in Abfragen

Marker-Components (rein boolesche Komponenten) funktionieren genau gleich.

e.enemy = True

Dann:

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

Marker sind extrem effizient in Abfragen.


Eingebaute Components in Abfragen

Du kannst Entities nach ihren eingebauten Komponenten abfragen:

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

Die folgenden eingebauten Komponentennamen werden unterstützt:

NameFindet Entities mit
"sprite"Einem Sprite (zugewiesenes Bild)
"body"Einem Grid-Body (Kollisionskörper)
"camera"Einer Kamera
"sound"Einem Soundeffekt
"music"Einem Musik-Stream
"map"Einer Grid-Map (Tilemap)

Du kannst eingebaute und eigene Komponenten in derselben Abfrage mischen:

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

Ausschluss funktioniert ebenfalls:

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

Abfrage-Verhalten

Intern:

  1. Die Abfrage sammelt die erforderlichen Komponentenschemata
  2. Sammelt die ausgeschlossenen Komponentenschemata
  3. Iteriert über passende Entities
  4. Gibt Entity-Handles zurück

Wenn ein Komponentenname nicht existiert:

  • Eine Warnung wird protokolliert
  • Die Abfrage läuft trotzdem weiter

Wichtige Hinweise

Komponentennamen müssen Strings sein

world.all("health")

Korrekt.

world.all(health)

Falsch.


without muss ein Tupel sein

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

Korrekt.

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

Falsch.


Was zurückgegeben wird

world.all() gibt einen Iterator zurück.

Du kannst:

list(world.all("enemy"))

Oder:

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

Sicherheitshinweise

Wenn eine erforderliche Komponente nicht existiert:

  • Eine Warnung wird protokolliert
  • Die Abfrage läuft weiter

Wenn zu viele Komponenten übergeben werden, greift die interne Obergrenze der Engine.