シーングラフ
Pyxenのエンティティはツリー構造に整理できます — 親と子。これがシーングラフです。エンティティがどのようにトランスフォームを継承し、可視性がどのように伝播し、描画がどのように順序付けられるかを制御します。
親子関係
どのエンティティも親や子になれます。関係は生成時または後から設定できます:
# 生成時に
arm = world.spawn(x=10, y=0, parent=player)
# または後から
arm.parent = player
エンティティに親がある場合:
- 位置(
x、y)は親からの相対位置になります。親が移動すると、子も一緒に移動します。 - 回転とスケールも継承されます。20度回転した親の上で10度回転した子は、30度で表示されます。
entity.childrenで子にアクセスできます。
エンティティを親から切り離すには:
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つの可視性プロパティがあります:
visible— このエンティティを表示するかどうか。あなたが制御します。is_visible— このエンティティが実際に描画されるかどうか。親の可視性を考慮します。
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全体が非表示になります。