容器¶
Anchors 是在GUI中处理基本多分辨率处理的不同纵横比的有效方法,
对于更复杂的用户界面,它们可能变得难以使用。
这通常是游戏的情况,如RPG、在线聊天、大亨或模拟。另一个可能需要更高级布局功能的常见情况是游戏内工具(或只是工具)。
所有这些情况都需要一个功能更强大的操作系统(如用户界面),具有高级的布局和格式。为此, Containers 更有用。
集装箱布局¶
容器提供了大量的布局能力(例如,godot编辑器用户界面完全是使用它们完成的):
当A Container -使用了派生节点,所有子节点 Control 节点放弃自己的定位能力。这意味着 集装箱 将控制它们的位置,下次调整它们的父节点的大小时,任何手动更改这些节点的尝试都将被忽略或失效。
同样,当 集装箱 派生节点已调整大小,其所有子节点将根据它重新定位,其行为基于所使用的容器类型:
实例 HBoxContainer 调整子按钮的大小。
容器的真正优点是可以嵌套(作为节点),允许创建非常复杂的布局,轻松调整大小。
大小标志¶
向容器添加节点时,容器处理每个子级的方式主要取决于 大小标志 . 可以通过检查作为 集装箱 .
大小标志独立于垂直和水平大小,并非所有容器都使用它们(但大多数容器都使用它们):
Fill :确保控制 填充 集装箱内的指定区域。不管是控制 扩展 无论是否(见下文),它只会 fill 打开时的指定区域(默认为)。
展开 :尝试尽可能多地使用父容器中的空间(在此每个轴中)。不展开的控件将被展开的控件推开。在这些膨胀之间,它们彼此之间的空间大小由 比率 (见下文)。
收缩中心 展开(如果不填充)时,请尝试保持在展开区域的中心(默认情况下,它保持在左侧或顶部)。
比率 扩展控件占可用空间的简单比率。带有“2”的控件将占用两倍于带有“1”的控件的可用空间。
建议尝试使用这些标志和不同的容器,以便更好地了解它们的工作方式。
容器类型¶
Godot提供了几种不同用途的集装箱:
集装箱¶
垂直或水平排列子控件(通过 HBoxContainer 和 VBoxContainer )在与指定方向相反的方向(如,对于水平容器,垂直方向)中,它只扩展子对象。
这些容器利用 比率 儿童财产 展开 标志集。
保证金容器¶
子控件向此控件的边界展开(通过 MarginContainer )根据主题配置,将在页边距上添加填充。
同样,请记住,页边距是 主题 值,因此如果需要单个控件,则需要在“常量覆盖”部分对其进行编辑:
标签容器¶
允许您将多个子控件堆叠在一起(通过 TabContainer ,只有 现在的 一个可见。
改变 现在的 一个通过位于容器顶部的选项卡完成,方法是单击:
默认情况下,标题由节点名生成(尽管可以通过 TabContainer API)。
选项卡放置和 StyleBox 可以在中修改 TabContainer 主题替代。
拆分容器¶
只接受一个或两个子控件,然后将它们与除数并排放置(通过 HSplitContainer 和 VSplitContainer )尊重水平和垂直标志,以及 比率 .
可以拖动除数来更改两个子对象之间的大小关系:
PanelContainer¶
绘制一个 StyleBox ,然后扩展子项以覆盖整个区域(通过 PanelContainer ,尊重 StyleBox 页边距)。它同时尊重水平和垂直大小标志。
此容器用作顶级容器,或者只用于向版面的各个部分添加自定义背景。
ScrollContainer¶
接受单个子节点。如果此节点大于容器,则将添加滚动条以允许围绕该节点平移(通过 ScrollContainer )同时考虑垂直和水平大小标志,并且可以在属性中的每个轴上打开或关闭行为。
鼠标滚轮和触摸拖动(当触摸可用时)也是移动子控件的有效方法。
如上例所示,使用此容器的最常见方法之一是 VBoxContainer 像孩子一样。
ViewportContainer¶
这是一个特殊控件,只接受一个 视区 节点作为子节点,并将其显示为图像(通过 ViewportContainer )
创建自定义容器¶
可以使用脚本轻松创建自定义容器。下面是一个简单容器的示例,它使子容器适合其矩形大小:
extends Container
func _notification(what):
if (what==NOTIFICATION_SORT_CHILDREN):
# Must re-sort the children
for c in get_children():
# Fit to own size
fit_child_in_rect( c, Rect2( Vector2(), rect_size ) )
func set_some_setting():
# Some setting changed, ask for childre re-sort
queue_sort()