为什么这个 gdscript 对话框代码不起作用?

Why doesn't this gdscript dialog box code work?

为什么这段代码不起作用? 我不知道如何描述发生了什么,但这是代码。 </p> <pre><code>extends Node2D onready var dialog_box = get_node("DialogBox") func _ready(): ShowDialog("Example") func ShowDialog(text, font = "DTM-Mono.ttf", time = 0.25): var textbox = dialog_box.get_node("Text") var dynamic_font = DynamicFont.new() dynamic_font.font_data = load("res://Supply (do not delete)/Fonts/" + str(font)) textbox.add_font_override("font", dynamic_font) for character in text: textbox.text = textbox.text + character yield(get_tree().create_timer(time), "timeout")

好吧,Theraot 已经做出了回答,所以请改为查看他的回答,但如果您想看看我是如何解释的,请看这里。

首先,Theraot 问我

这是字体的特殊之处吗?什么是 DialogBox(是 WindowDialog 吗?我没看到你叫 popup)?鉴于您不知道如何描述问题,能否提供视频?

我回复了

@Theroat 这是一个包含对话框文本的节点和一个矩形,文本在该矩形上只是为了看起来不错。 dialog_box 我的意思不是弹出窗口,它只是一个传说中的对话框。

我按照他的要求发送了一个视频:https://drive.google.com/file/d/18QrOOw_FZ3MgboVrv59b4sDrFG-AxlmR/view?usp=sharing

他回复了

关于视频,我希望看到它 运行。但是,我注意到您提供的视频中有一些内容。 Label 在场景树中位于 Panel 之前。因此专家组可以涵盖文本。为避免这种情况,请将标签移动到场景树中面板下方。我没有你使用的相同字体文件,但我用不同的字体复制了视频中的设置,除了标签的位置,它对我来说很好。

这就是全部,请参阅评论以了解更多信息。

工作时 Controls 场景树中较低的部分在顶部。 你可以假装这是抽签顺序。除了 2D batching。但这好像是抽奖顺序。

在这个场景树中,我们有一个 Label 和一个 Panel 兄弟姐妹,顺序是这样的。像这样:

DialogBox
├ Text:Label
└ Container:Panel

因此,Panel 将出现在 Label 之上。意思是 Label 会在 Panel 后面(假设它们位于同一区域。它们确实是,因为这是制作 RPG 风格 dialog/text 盒子的尝试.).


使 Label 可见的一个简单解决方案是重新组织场景树,如下所示:

DialogBox
├ Container:Panel
└ Text:Label

但是,我将建议一个不同的解决方案。像这样重新组织场景树:

DialogBox
└ Container:Panel
  └ Text:Label

原因是子节点是相对于父节点定位的。因此,当您移动 Panel 时,它也会移动 Label例如,如果框有时应该出现在屏幕顶部,有时出现在屏幕底部,则只需移动 Panel.

我还想提一下,如果您在 Control 上设置 rect_clip_content,它会将子项遮盖到其矩形。也就是说,子元素超出父矩形的任何部分都将不可见。 您可能想要也可能不想要。


当我们讨论移动节点的话题时。您可以导出 NodePath variables and set them in the inspector panel to reference other nodes (example).

顺便说一句,当使用 Node2D 时,有一个 z_index property. Also, you can use a YSort node to deal with fake depth (example).