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