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(平视显示器) 叠加在我们的游戏世界视图上。我们想要生命计数器,分数显示等东西保持其屏幕位置,即使当游戏世界中的视角正在改变时他们也不动。
  • 转换 :我们应该希望用于转换场景的效果(淡入淡出之类的东西)也保持在固定的位置。

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

CanvasLayer(画布层)

答案是 CanvasLayer ,这是一个为其所有子项和它们的孩子们添加单独的2D渲染层的节点。 Viewport的子项默认在图层“0”处绘制,而CanvasLayer会在任何图层号的图层绘制。 数字较大的图层将被绘制在数字较小的图层之上。 CanvasLayer也有自己的变换,它不依赖于其他层的变换。 这允许UI在世界移动时相对屏幕保持固定。

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

下面是它的图示:

../../_images/canvaslayers.png

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

注解

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