Canvas Layers(画布层)

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

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

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

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

类似与滚动的效果最好通过操作Viewport的画布变换( Viewport.canvas_transform )属性来实现。这种方法比移动根节点CanvasItem(也就是整个场景) 更有效。

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

  • 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 )。