我的问题还没有出现,但我是为了预防而问,因为从我所看到的来看,似乎没有一个简单的方法,除非我没有看到它。
我正在用 GDScript 制作一个关于 Godot 的游戏(为了我的乐趣哈哈)(尽管我认为我更喜欢 C++)。我在比赛中拥有“能力”,很多,真的很多。我最终可能会将它们的描述放在 XML 或其他内容中,甚至将它们的其余信息放在上面,它们可能是“关键字”,以简化某些解释或循环机制。
为了避免重新解释所有内容,我计划检测这些内容,并相应地解释它们,但我想避免“检测所有内容”和“主要描述下的所有内容列表”。
所以,在“悬停时”,我看到了一些 UI 悬停的信号。 可能会使用 RichTextLabel 进行描述,除非出现更实际或更有用的东西。
知道我在问这个问题时我还没有尝试任何东西,只是想知道是否有比我想的更简单的方法。好吧,总而言之,我在开始做之前已经有时间了,而且如果 Godot 更新很多,答案也可能会改变很多。
所以问题是:您能否检测到 RichTextLabel 中特定文本/单词上的鼠标悬停(或其他鼠标交互),也许要感谢一些 BBCode?或者也许正如之前所说,有一些文本节点更实用(即使我对此表示怀疑)?
还没有,但从我所看到的来看,RichTextLabel 是唯一支持文本修改的,并且只是与节点其余部分的“文本差异”,因此可能是最有能力的,即使可能很远,因为他处理 BBCode 的能力,但如果我现在想到的是唯一的解决方案......
这将检测(X,Y)坐标中某些 BBCode 应答器(或自制应答器哈哈)的位置,以在这些关键字上放置“鼠标悬停检测框”,这意味着您需要获取单词的(X,Y)坐标在一个段落中,这也不容易处理,您需要计算每个字符的大小来计算一个简单单词的位置(X,Y)......所以是的,听起来很难做到。
也许引擎中永远不会有真正的答案,那么我想我必须在我猜的描述之后进入“关键字列表”。
使用
RichTextLabel
是这里更简单的方法。
如您所知,它与 BBCode 一起使用。现在,有多种方法可以填充它:
您可以在启用
text
的情况下设置 bbcode_enabled
属性,它会解析它。请参阅 RichTextLabel 中的 BBCode。
例如,这将是用红色写成的“hello”:
var label:RichTextLabel = $RichTextLabel
label.text = "[color=red]hello[/color]"
如果你不想设置它,而是想追加它,使用
append_text
会更高效(这样Godot就不必解析整个文本,而只解析新的部分):
var label:RichTextLabel = $RichTextLabel
label.append_text("[color=red]hello[/color]")
或者你可以通过代币来做到...
通过令牌设置 BBCode 的工作方式类似于堆栈机。您可以推送(打开)标签、附加文本和弹出(关闭)标签。
例如,这将是用红色写成的“hello”:
var label:RichTextLabel = $RichTextLabel
label.push_color(Color.RED)
label.add_text("hello")
label.pop()
注意:
clear
方法不会清除文本,而是弹出(关闭)所有当前推送(打开)的标签。
现在,有一个特定的标签可以让您做您想做的事。
text
,请使用 "[url=something]text[/url]"
。push_meta("something")
。这将创建一个“超链接”。更准确地说,它使一个项目缩进为可交互的,默认情况下,该项目内的文本将被格式化 - 类似于浏览器中的超链接。
当然,您可以控制格式)。您可能需要将 meta_underlined
设置为
false
以禁用默认下划线。我们感兴趣的是互动部分。虽然该标签默认不执行任何操作,但这就是重点:我们将定义它的功能。为此,我们需要处理来自
RichTextLabel
:的一些信号
meta_hover_started
:当鼠标指针开始悬停在其中一个“超链接”的内容上时。
meta_hover_ended
:当鼠标指针停止悬停在其中一个“超链接”的内容上时。
meta_clicked
:当用户点击其中一个“超链接”时。
好吧,这些信号会传递给您一个值(上面示例中的
"something"
),该值来自标签:
push_meta
创建它时,您可以从信号中传递所需的值作为参数。
push_meta
比使用文本有一个优势:“url”属性永远只是一个
String
,但是
push_meta
的参数是一个 Variant,你可以在那里传递任何东西,包括对
Object
的引用,或具有多个值的
Dictionary
。连接到这些信号的方法看起来像这样:
func _on_meta_clicked(meta):
prints(meta)
请参阅使用信号了解如何建立连接。