Using Containers
锚点 是处理图形用户界面中基本多分辨率处理的不同纵横比的有效方法,
对于更复杂的用户界面,它们可能会变得难以使用.
这通常是游戏的情况下,如角色扮演类、在线聊天、大富翁类或模拟类游戏.另一个需要更高级布局功能的常见情况是游戏内工具(或者仅仅是工具).
这些情况需要一个更强大的类似操作系统的用户界面,具有先进的布局和格式.为此, 容器 更有用.
容器布局
容器提供了巨大的布局能力(例如,Godot编辑器的用户界面就是完全使用它们完成的):
当使用 容器 派生节点时,所有 控件 子节点放弃了自己的定位能力.这意味着 Container容器 将控制它们的位置,任何手动更改这些节点的尝试,都将在它们的父节点下一次调整大小时被忽略或失效.
同样,当一个 Container 派生的节点被调整大小时,它的所有子节点将根据它重新定位,其行为基于所用的容器类型:
例如 HBoxContainer 调整子按钮的大小.
容器的真正优势在于它们可以嵌套(作为节点),允许创建非常复杂的布局,调整毫不费力.
大小标志
当向容器添加节点时,容器对待每个子元素的方式,主要取决于它们的 size flags尺寸标记 .通过检查 容器 的子控件,可以找到这些标记.
尺寸标记独立于垂直和水平尺寸,并不是所有容器都使用它们(但大多数容器都使用):
Fill填充: 确保控件 fills填充 容器内指定的区域.无论控件是否 expands扩展 (见下面),当此选项被选中时(默认情况),只 填充 指定区域.
Expand扩展: 试图在父容器中尽可能多地使用空间(在每个轴中).不展开的控件会被展开的控件推开.在扩展的控件之间,它们相互占用的空间大小由 Ratio 决定(见下文).
Shrink Center收缩中心 当扩展时(如果不填充),尽量保持在扩展区域的中心(默认情况下,它仍然位于左侧或顶部).
Ratio比例 扩展控件之间,相互占用可用空间的简单比例.一个比例为”2”的控件,将占用比例为”1”控件的两倍可用空间.
建议使用这些标记和不同的容器进行试验,以便更好地了解它们是如何工作的.
容器类型
Godot提供了几种开箱即用的容器类型,因为它们有不同的用途:
Box容器
垂直或水平排列子控件(通过 水平盒子容器 和 垂直盒子容器 ).在指定方向的相反方向(如水平容器的垂直方向),只是扩大了子节点的范围.
这些容器使用 Ratio比例 属性,用于设置 Expand扩展 标记的子容器.
Grid Container网格容器
在网格布局中排列子控件(通过 网格容器 ,必须指定列的数量).同时使用垂直和水平扩展标记.
Margin Container边距容器
子控件被扩展到该控件的边界(通过 边距容器 ).根据主题配置,将在页边距上添加填充.
同样,请记住,边距是一个 Theme 值,所以它们需要从每个控件的常量重写部分进行编辑:
Tab Container标签容器
允许您将多个子控件堆叠在一起(通过 选项卡容器),只有 current当前 可见.
通过点击位于容器顶部的选项卡,来标记 current当前 选项卡:
默认情况下,标题是由节点名称生成的(尽管它们可以通过 TabContainer API被重写).
在 TabContainer选项卡容器 主题覆盖中,可以修改选项卡位置和 StyleBox盒子样式 等内容.
Split Container拆分容器
只接受一两个子控件,然后将它们与除数并排放置(通过 水平分割容器 和 垂直分割容器).同时考虑水平和垂直标记,以及 Ratio比例 .
可以拖动除数来改变两个子元素之间的大小关系:
PanelContainer
绘制 StyleBox样式盒子 的简单容器,然后将子节点扩大到整个区域(通过 面板容器 ,考虑 样式盒子 的边距).它同时考虑水平和垂直尺寸标记.
这个容器作为顶层非常有用,或者只是为布局各个部分添加自定义背景.
ScrollContainer
接受一个单独的子节点.如果这个节点比容器大,将添加滚动条以允许移动节点(通过 滚动条容器).考虑垂直和水平尺寸标识,该行为可以在属性中的每个轴上打开或关闭.
鼠标滚轮和触摸拖动(当触摸可用时)也是平移子控件的有效方法.
在上面的例子中,使用此容器最常见的方法之一,是将 VBoxContainer垂直盒子容器 作为子容器一起使用.
ViewportContainer
这是一个特殊的控件,它只接受单个 Viewport视窗 节点作为子节点,它会像显示图像一样显示它(通过 视窗容器).
创建自定义容器
可以使用脚本轻松地创建自定义容器.下面是一个简单容器的例子,它适合于其矩形大小的子容器:
GDScript
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 children re-sort
queue_sort()