画布层

视区和画布项

常规二维节点,例如 Node2DControl 两者都继承自 CanvasItem 它是所有二维节点的基础。CanvaSitems可以安排在树上。每个项都将继承其父项的转换。这意味着当父对象移动时,子对象也将移动。

canvasItem节点及其继承的节点是 Viewport ,并将通过它显示。

视区具有属性 Viewport.canvas_transform ,允许应用自定义 Transform2D 转换为它包含的CanvasItem层次结构。节点,例如 Camera2D 通过改变转换来工作。

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

但通常我们不想 一切 在游戏或应用程序中进行画布转换。例如:

  • 视差背景 :比舞台其他部分移动慢的背景。

  • UI :想象一个用户界面(UI)或平视显示器(HUD)叠加在我们的游戏世界视图上。我们需要一个生活计数器、分数显示和其他元素来保持它们的屏幕位置,即使我们对游戏世界的看法正在改变。

  • 过渡 :我们可能希望用于过渡(淡出、混合)的视觉效果保持在固定屏幕位置。

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

CanvasLayers

答案是 CanvasLayer ,这是一个节点,为其所有子级和孙子级添加单独的二维渲染层。默认情况下,视区子对象将在图层“0”绘制,而CanvasLayer将在任何数字图层绘制。数值较大的图层将绘制在数值较小的图层上方。CanvasLayers也有自己的转换,不依赖于其他层的转换。这样,当我们对游戏世界的看法发生变化时,用户界面就可以固定在屏幕空间中。

一个例子是创建视差背景。这可以通过层“-1”的CanvasLayer完成。在“1”层也可以创建带有点、生命计数器和暂停按钮的屏幕。

下面是它的外观图:

../../_images/canvaslayers.png

CanvasLayers独立于树的顺序,它们只依赖于它们的层号,因此它们可以在需要时被实例化。

注解

CanvasLayers不需要控制节点的绘制顺序。确保一个节点被正确地“在前面”或“在后面”绘制的标准方法是在场景面板中操纵节点的顺序。可能与直觉相反,场景面板中最顶部的节点绘制在 后面 在视区中的下方。二维节点还具有控制其绘图顺序的属性(请参见 Node2D.z_index