Szenengraph
Entitäten in Pyxen können in einem Baum organisiert werden — Eltern und Kinder. Das ist der Szenengraph. Er steuert, wie Entitäten Transformationen erben, wie sich Sichtbarkeit ausbreitet und wie die Render-Reihenfolge bestimmt wird.
Eltern-Kind-Beziehungen
Jede Entität kann ein Elternteil oder ein Kind sein. Du setzt die Beziehung beim Erzeugen oder später:
# beim Erzeugen
arm = world.spawn(x=10, y=0, parent=player)
# oder später
arm.parent = player
Wenn eine Entität ein Elternteil hat:
- Ihre Position (
x,y) ist relativ zum Elternteil. Wenn sich das Elternteil bewegt, bewegt sich das Kind mit. - Rotation und Skalierung werden ebenfalls geerbt. Ein Kind, das 10 Grad auf einem Elternteil rotiert ist, das 20 Grad rotiert ist, erscheint bei 30 Grad.
- Du kannst auf Kinder mit
entity.childrenzugreifen.
Um eine Entität von ihrem Elternteil zu lösen:
arm.parent = None
Ebenen
Jede Entität hat eine Ebene (0–255). Ebenen steuern die Render-Reihenfolge: niedrigere Ebenen werden zuerst gezeichnet, höhere Ebenen darüber.
background = world.spawn(layer=0, sprite=Sprite("sky"))
player = world.spawn(layer=1, sprite=Sprite("hero"))
ui = world.spawn(layer=2, sprite=Sprite("health_bar"))
Innerhalb einer Ebene werden Entitäten nach Tiefe sortiert. Die Tiefe wird durch die Position der Entität im Szenengraph bestimmt — tiefere Kinder werden nach ihren Eltern gerendert.
Sichtbarkeit
Entitäten haben zwei Sichtbarkeitseigenschaften:
visible— ob diese Entität als sichtbar gesetzt ist. Das steuerst du.is_visible— ob diese Entität tatsächlich gerendert wird. Dies berücksichtigt die Sichtbarkeit des Elternteils.
enemy.visible = False # verstecke diese Entität und alle ihre Kinder
Wenn du ein Elternteil versteckst, werden alle seine Kinder ebenfalls unsichtbar, auch wenn ihre eigene visible-Eigenschaft noch True ist. Das macht es einfach, ganze Gruppen umzuschalten — verstecke ein UI-Panel und alles darin verschwindet.
Typische Szenenstruktur
Ein gängiges Muster ist, dein Spiel in Ebenen und Gruppen zu organisieren:
def start():
# Ebene 0: Hintergrund
world.spawn(layer=0, sprite=Sprite("tilemap"))
# Ebene 1: Spielentitäten
player = world.spawn(name="player", layer=1, sprite=Sprite("hero"))
weapon = world.spawn(parent=player, x=8, y=0, sprite=Sprite("sword"))
# Ebene 2: UI
ui_root = world.spawn(name="ui", layer=2)
world.spawn(parent=ui_root, x=10, y=10, sprite=Sprite("heart"))
Die Waffe folgt dem Spieler automatisch. Die UI ist immer oben. Das Verstecken von ui_root versteckt die gesamte UI.