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
withoutmuss 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:
| Name | Findet 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:
- Die Abfrage sammelt die erforderlichen Komponentenschemata
- Sammelt die ausgeschlossenen Komponentenschemata
- Iteriert über passende Entities
- 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.