画布层¶
视区和画布项¶
常规二维节点,例如 Node2D 或 Control 两者都继承自 CanvasItem 它是所有二维节点的基础。CanvaSitems可以安排在树上。每个项都将继承其父项的转换。这意味着当父对象移动时,子对象也将移动。
canvasItem节点及其继承的节点是 Viewport ,并将通过它显示。
视区具有属性 Viewport.canvas_transform ,允许应用自定义 Transform2D 转换为它包含的CanvasItem层次结构。节点,例如 Camera2D 通过改变转换来工作。
像滚动这样的效果最好通过操纵画布转换属性来实现。这种方法比移动根画布项(以及整个场景)更有效。
但通常我们不想 一切 在游戏或应用程序中进行画布转换。例如:
视差背景 :比舞台其他部分移动慢的背景。
UI :想象一个用户界面(UI)或平视显示器(HUD)叠加在我们的游戏世界视图上。我们需要一个生活计数器、分数显示和其他元素来保持它们的屏幕位置,即使我们对游戏世界的看法正在改变。
过渡 :我们可能希望用于过渡(淡出、混合)的视觉效果保持在固定屏幕位置。
如何在一个场景树中解决这些问题?
CanvasLayers¶
答案是 CanvasLayer ,这是一个节点,为其所有子级和孙子级添加单独的二维渲染层。默认情况下,视区子对象将在图层“0”绘制,而CanvasLayer将在任何数字图层绘制。数值较大的图层将绘制在数值较小的图层上方。CanvasLayers也有自己的转换,不依赖于其他层的转换。这样,当我们对游戏世界的看法发生变化时,用户界面就可以固定在屏幕空间中。
一个例子是创建视差背景。这可以通过层“-1”的CanvasLayer完成。在“1”层也可以创建带有点、生命计数器和暂停按钮的屏幕。
下面是它的外观图:
CanvasLayers独立于树的顺序,它们只依赖于它们的层号,因此它们可以在需要时被实例化。
注解
CanvasLayers不需要控制节点的绘制顺序。确保一个节点被正确地“在前面”或“在后面”绘制的标准方法是在场景面板中操纵节点的顺序。可能与直觉相反,场景面板中最顶部的节点绘制在 后面 在视区中的下方。二维节点还具有控制其绘图顺序的属性(请参见 Node2D.z_index )