Scene Graph
Les entités dans Pyxen peuvent être organisées en arbre — parents et enfants. C’est le scene graph. Il contrôle comment les entités héritent des transforms, comment la visibilité se propage et comment le rendu est ordonné.
Relations parent-enfant
N’importe quelle entity peut être parent ou enfant. Vous définissez la relation à la création ou par la suite :
# à la création
arm = world.spawn(x=10, y=0, parent=player)
# ou plus tard
arm.parent = player
Lorsqu’une entity a un parent :
- Sa position (
x,y) est relative au parent. Si le parent se déplace, l’enfant se déplace avec lui. - La rotation et l’échelle sont également héritées. Un enfant tourné de 10 degrés sur un parent tourné de 20 degrés apparaît à 30 degrés.
- Vous pouvez accéder aux enfants avec
entity.children.
Pour détacher une entity de son parent :
arm.parent = None
Layers
Chaque entity possède une layer (0–255). Les layers contrôlent l’ordre de rendu : les layers inférieures sont dessinées en premier, les layers supérieures sont dessinées par-dessus.
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"))
Au sein d’une layer, les entités sont triées par profondeur. La profondeur est déterminée par la position de l’entity dans le scene graph — les enfants plus profonds sont rendus après leurs parents.
Visibilité
Les entités ont deux propriétés de visibilité :
visible— indique si cette entity est configurée pour être affichée. C’est vous qui la contrôlez.is_visible— indique si cette entity est réellement rendue. Cela prend en compte la visibilité du parent.
enemy.visible = False # masque cette entity et tous ses enfants
Lorsque vous masquez un parent, tous ses enfants deviennent invisibles aussi, même si leur propre propriété visible est toujours True. Cela facilite la gestion de groupes entiers — masquez un panneau d’interface et tout ce qu’il contient disparaît.
Structure de scène typique
Un schéma courant consiste à organiser votre jeu en layers et en groupes :
def start():
# layer 0 : arrière-plan
world.spawn(layer=0, sprite=Sprite("tilemap"))
# layer 1 : entités de jeu
player = world.spawn(name="player", layer=1, sprite=Sprite("hero"))
weapon = world.spawn(parent=player, x=8, y=0, sprite=Sprite("sword"))
# layer 2 : interface
ui_root = world.spawn(name="ui", layer=2)
world.spawn(parent=ui_root, x=10, y=10, sprite=Sprite("heart"))
L’arme suit automatiquement le joueur. L’interface est toujours au premier plan. Masquer ui_root masque toute l’interface.