场景图
Pyxen 中的实体可以组织成树状结构——父节点和子节点。这就是场景图。它控制实体如何继承变换、可见性如何传播以及渲染顺序。
父子关系
任何实体都可以是父节点或子节点。你可以在生成时或之后设置关系:
# at spawn
arm = world.spawn(x=10, y=0, parent=player)
# or later
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 # hide this entity and all its children
当你隐藏一个父节点时,它所有的子节点也会变得不可见,即使子节点自己的 visible 属性仍然是 True。这使得切换整个组变得容易——隐藏一个 UI 面板,里面的一切都会消失。
典型场景结构
一个常见的模式是将游戏组织成图层和分组:
def start():
# layer 0: background
world.spawn(layer=0, sprite=Sprite("tilemap"))
# layer 1: game entities
player = world.spawn(name="player", layer=1, sprite=Sprite("hero"))
weapon = world.spawn(parent=player, x=8, y=0, sprite=Sprite("sword"))
# layer 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。