容器

Anchors 是在GUI中处理基本多分辨率处理的不同纵横比的有效方法,

对于更复杂的用户界面,它们可能变得难以使用。

这通常是游戏的情况,如RPG、在线聊天、大亨或模拟。另一个可能需要更高级布局功能的常见情况是游戏内工具(或只是工具)。

所有这些情况都需要一个功能更强大的操作系统(如用户界面),具有高级的布局和格式。为此, Containers 更有用。

集装箱布局

容器提供了大量的布局能力(例如,godot编辑器用户界面完全是使用它们完成的):

../../_images/godot_containers.png

当A Container -使用了派生节点,所有子节点 Control 节点放弃自己的定位能力。这意味着 集装箱 将控制它们的位置,下次调整它们的父节点的大小时,任何手动更改这些节点的尝试都将被忽略或失效。

同样,当 集装箱 派生节点已调整大小,其所有子节点将根据它重新定位,其行为基于所使用的容器类型:

../../_images/container_example.gif

实例 HBoxContainer 调整子按钮的大小。

容器的真正优点是可以嵌套(作为节点),允许创建非常复杂的布局,轻松调整大小。

大小标志

向容器添加节点时,容器处理每个子级的方式主要取决于 大小标志 . 可以通过检查作为 集装箱 .

../../_images/container_size_flags.png

大小标志独立于垂直和水平大小,并非所有容器都使用它们(但大多数容器都使用它们):

  • Fill :确保控制 填充 集装箱内的指定区域。不管是控制 扩展 无论是否(见下文),它只会 fill 打开时的指定区域(默认为)。

  • 展开 :尝试尽可能多地使用父容器中的空间(在此每个轴中)。不展开的控件将被展开的控件推开。在这些膨胀之间,它们彼此之间的空间大小由 比率 (见下文)。

  • 收缩中心 展开(如果不填充)时,请尝试保持在展开区域的中心(默认情况下,它保持在左侧或顶部)。

  • 比率 扩展控件占可用空间的简单比率。带有“2”的控件将占用两倍于带有“1”的控件的可用空间。

建议尝试使用这些标志和不同的容器,以便更好地了解它们的工作方式。

容器类型

Godot提供了几种不同用途的集装箱:

集装箱

垂直或水平排列子控件(通过 HBoxContainerVBoxContainer )在与指定方向相反的方向(如,对于水平容器,垂直方向)中,它只扩展子对象。

../../_images/containers_box.png

这些容器利用 比率 儿童财产 展开 标志集。

网格容器

在网格布局中排列子控件(通过 GridContainer ,必须指定列的数量)。使用垂直和水平展开标志。

../../_images/containers_grid.png

保证金容器

子控件向此控件的边界展开(通过 MarginContainer )根据主题配置,将在页边距上添加填充。

../../_images/containers_margin.png

同样,请记住,页边距是 主题 值,因此如果需要单个控件,则需要在“常量覆盖”部分对其进行编辑:

../../_images/containers_margin_constants.png

标签容器

允许您将多个子控件堆叠在一起(通过 TabContainer ,只有 现在的 一个可见。

../../_images/containers_tab.png

改变 现在的 一个通过位于容器顶部的选项卡完成,方法是单击:

../../_images/containers_tab_click.gif

默认情况下,标题由节点名生成(尽管可以通过 TabContainer API)。

选项卡放置和 StyleBox 可以在中修改 TabContainer 主题替代。

拆分容器

只接受一个或两个子控件,然后将它们与除数并排放置(通过 HSplitContainerVSplitContainer )尊重水平和垂直标志,以及 比率 .

../../_images/containers_split.png

可以拖动除数来更改两个子对象之间的大小关系:

../../_images/containers_split_drag.gif

PanelContainer

绘制一个 StyleBox ,然后扩展子项以覆盖整个区域(通过 PanelContainer ,尊重 StyleBox 页边距)。它同时尊重水平和垂直大小标志。

../../_images/containers_panel.png

此容器用作顶级容器,或者只用于向版面的各个部分添加自定义背景。

ScrollContainer

接受单个子节点。如果此节点大于容器,则将添加滚动条以允许围绕该节点平移(通过 ScrollContainer )同时考虑垂直和水平大小标志,并且可以在属性中的每个轴上打开或关闭行为。

../../_images/containers_scroll.png

鼠标滚轮和触摸拖动(当触摸可用时)也是移动子控件的有效方法。

../../_images/containers_center_pan.gif

如上例所示,使用此容器的最常见方法之一是 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()