Canvas Layers(画布层)

Viewport (视窗) 和 Canvas Item (画布项)

常规2D节点, 如 Node2DControl 都继承自 CanvasItem , 它是所有2D节点的基础.CanvasItem 被组织成树状结构, 同时继承它们父节点的变换. 这意味着在移动父节点时, 子节点也会被移动.

CanvasItem 节点和继承他们的节点, 都作为 Viewport 的直接或间接子节点放置, 并将通过它显示.

Viewport 具有属性 Viewport.canvas_transform , 它允许对它所包含的CanvasItem层级施加一个自定义的 Transform2D 变换. 如 Camera2D 的主要工作方式就是改变那个Transform2D变换.

像滚动这样的效果最好是通过操纵画布transform变换属性来实现。这种方法比移动根画布项(以及整个场景)更有效。

通常情况下, 我们不希望游戏中的 所有东西 都受到画布变换的影响. 相应的例子有:

  • Parallax Backgrounds(视差背景) : 比场景其他部分移动得慢的背景.

  • 用户界面 : 想象一个UI(用户界面)或HUD(平视显示器) 叠加在我们的游戏世界视图上. 我们想要生命计数器, 分数显示等东西保持其屏幕位置, 即使当游戏世界中的视角正在改变时他们也不动.

  • Transitions(转场) : 我们应该希望用于转场的效果(淡入淡出之类的东西)也保持在固定的位置.

如何在单个场景树中解决这些问题?

CanvasLayer(画布层)

答案是 CanvasLayer , 它是一个节点, 为所有子代和孙代添加一个单独的2D渲染层.Viewport的子节点默认在图层 "0 " 处绘制, 而CanvasLayer将在任何数字层处绘制. 数字较大的图层将绘制在数字较小的图层之上.CanvasLayers也有自己的变换, 不依赖于其他层的变换. 这使得当我们对游戏世界的观察发生变化时,UI可以固定在屏幕空间中.

比如说创建Parallax Background(视差背景). 这可以通过层为 "-1" 的CanvasLayer完成. 带有分数, 生命计数器和暂停按钮的屏幕也可以创建在编号为 "1" 的层中.

下面是它的图示:

../../_images/canvaslayers.png

CanvasLayer 独立于树顺序, 它们仅依赖于它们的层数, 因此可以只在需要时让它们实例化.

注解

CanvasLayer 不需要控制节点的绘制顺序. 确保节点被正确绘制在 "前面" 或 "后面" 的标准方法是操作场景面板中节点的顺序. 也许违反直觉, 场景面板中最上面的节点绘制在视图端口中较低的节点 后面 . 二维节点也有控制其绘图顺序的属性(参考 Node2D.z_index ).