Godot 有“HVBoxContainer”吗?

Jac*_*cob 3 gdscript godot

想象一下角色扮演游戏,您可能需要提供一系列按钮。用户可能会进入一个房间,他们必须从一系列选项(按钮)中进行选择。是否有一种容器/面板可以水平显示可点击的按钮,但如果需要的话可以换行?

我能想到的描述这种情况的最佳类比是,想象一下需要单击背包中的一个项目,但每个项目的宽度可能不同。(我可以使它们的高度相同,但宽度会有所不同)

.---[My Backpack]------.
| aaa  bbb  cccc ddd   |
| ee  fff  g           |
|                      |
|                      |
`----------------------'
Run Code Online (Sandbox Code Playgroud)

(选项来自数据库,因此在编译时未知一个房间中可能有多少选项,因此我需要以编程方式添加选项。)

这个 godot 文档的最底部介绍了自定义容器布局,但我不清楚这在实践中如何工作

The*_*aot 6

Godot 3.5 或更高版本的流容器

\n

Godot 3.5(目前处于测试阶段)引入了HFlowContainer并将VFlowContainer服务于所描述的目的。

\n

HFlowContainer填充一行,当它们溢出时,它将添加一个新行并在那里继续。它们VFlowContainer将以类似的方式工作,但有列。

\n
\n

Godot 3.5 之前的流容器

\n

对于旧版本的 Godot,您可以使用HFlowContainer插件,您可以在资源库(此处)中找到它。请注意,没有VFlowContainer对应项。

\n

由于资源库中的所有内容都是免费且开源的,因此请随意阅读代码并对其进行修改,如果您想进行自己的自定义,可以将其作为起点Container

\n
\n

打造您自己的定制Container

\n

制定一个习惯的要点Container是它必须定位它的孩子。

\n

对于这种效果,您可以NOTIFICATION_SORT_CHILDREN_notification方法中做出反应。您可能还想对 做出反应NOTIFICATION_RESIZED

\n

您可以拥有一个方法(我将调用该方法layout),您可以在收到通知时调用该方法:

\n
func _notification(what):\n    if what == NOTIFICATION_SORT_CHILDREN:\n        layout()\n
Run Code Online (Sandbox Code Playgroud)\n

并且还从定义必须如何组织其子项的属性的layoutsetter ( ) 中进行调用。要从以外的任何地方调用,您可能需要使用来防止任何可能的重新布局循环挂起或使游戏崩溃。setgetContainerlayout_notificationcall_deferred("layout")

\n
\n

layout方法将迭代可见的子项Control并用于get_combined_minimum_size计算它们的大小。

\n

像这样的东西:

\n
func layout() -> void:\n    # \xe2\x80\xa6\n    for child in get_children():\n        var control := child as Control\n        if not is_instance_valid(control) or not control.visible:\n            continue\n\n        var size := control.get_combined_minimum_size()\n    # \xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n

然后使用该信息计算子节点 s 的位置和大小Control。当 s 有Control增长空间时,您可能需要根据它们的 来将其分割size_flags_stretch_ratio

\n

一旦确定了位置和大小Control,就可以使用fit_child_in_rect来定位它们,这将考虑增长和大小标志。

\n

因此,除了最简单的Containers 之外,您将需要迭代孩子们Control两次。为此,您可能会发现使用辅助数据结构来临时存储它们很有用。

\n