为什么这个 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 之前。因此专家组可以涵盖文本。为避免这种情况,请将标签移动到场景树中面板下方。我没有你使用的相同字体文件,但我用不同的字体复制了视频中的设置,除了标签的位置,它对我来说很好。
这就是全部,请参阅评论以了解更多信息。
工作时 Control
s 场景树中较低的部分在顶部。 你可以假装这是抽签顺序。除了 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).
为什么这段代码不起作用?
我不知道如何描述发生了什么,但这是代码。
</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 之前。因此专家组可以涵盖文本。为避免这种情况,请将标签移动到场景树中面板下方。我没有你使用的相同字体文件,但我用不同的字体复制了视频中的设置,除了标签的位置,它对我来说很好。
这就是全部,请参阅评论以了解更多信息。
工作时 Control
s 场景树中较低的部分在顶部。 你可以假装这是抽签顺序。除了 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).