シーングラフ

Pyxenのエンティティはツリー構造に整理できます — 親と子。これがシーングラフです。エンティティがどのようにトランスフォームを継承し、可視性がどのように伝播し、描画がどのように順序付けられるかを制御します。

親子関係

どのエンティティも親や子になれます。関係は生成時または後から設定できます:

# 生成時に
arm = world.spawn(x=10, y=0, parent=player)

# または後から
arm.parent = player

エンティティに親がある場合:

エンティティを親から切り離すには:

arm.parent = None

レイヤー

すべてのエンティティにはレイヤー(0〜255)があります。レイヤーは描画順を制御します:低いレイヤーが先に描画され、高いレイヤーが上に描画されます。

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"))

レイヤー内では、エンティティは深度でソートされます。深度はシーングラフ内のエンティティの位置で決まります — 深い子は親の後に描画されます。

可視性

エンティティには2つの可視性プロパティがあります:

enemy.visible = False  # このエンティティとすべての子を非表示

親を非表示にすると、子自身のvisibleプロパティがTrueであっても、すべての子が見えなくなります。これにより、グループ全体の切り替えが簡単になります — UIパネルを非表示にすれば、その中のすべてが消えます。

典型的なシーン構造

ゲームをレイヤーとグループに整理する一般的なパターン:

def start():
    # レイヤー0:背景
    world.spawn(layer=0, sprite=Sprite("tilemap"))

    # レイヤー1:ゲームエンティティ
    player = world.spawn(name="player", layer=1, sprite=Sprite("hero"))
    weapon = world.spawn(parent=player, x=8, y=0, sprite=Sprite("sword"))

    # レイヤー2:UI
    ui_root = world.spawn(name="ui", layer=2)
    world.spawn(parent=ui_root, x=10, y=10, sprite=Sprite("heart"))

武器はプレイヤーに自動的に追従します。UIは常に最前面です。ui_rootを非表示にすれば、UI全体が非表示になります。