씬 그래프
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"))
레이어 내에서 엔티티는 깊이로 정렬됩니다. 깊이는 씬 그래프에서 엔티티의 위치에 의해 결정됩니다 — 깊은 자식이 부모 다음에 렌더링됩니다.
가시성
엔티티에는 두 가지 가시성 속성이 있습니다:
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가 숨겨집니다.