Godot/GDScript,有没有办法检测鼠标悬停、RichTextLabel 中的特定单词或任何其他文本相关节点?

问题描述 投票:0回答:1

我的问题还没有出现,但我是在预防,因为从我所看到的来看,似乎没有简单的方法,除非我没有看到它。

所以,我正在用 GDScript 制作一个关于 Godot 的游戏(为了我的乐趣,哈哈)(尽管我更喜欢 C++) 我的游戏中有“能力”,很多,真的很多,我最终可能会将它们的描述放在 XML 或其他内容中,甚至将它们的其余信息放在上面,它们可能是“关键字”来简化一些解释或循环机制。 为了避免重新解释所有内容,我计划检测这些内容,并相应地解释它们,但我想避免“检测所有内容”和“主要描述下的所有内容列表”。

所以,在“悬停时”,我看到了一些 UI 悬停的信号。 可能会使用 RichTextLabel 进行描述,除非出现更实际或更有用的东西。

知道我在问这个问题时我还没有尝试任何东西,只是想知道是否有比我想的更简单的方法......好吧,总而言之,我在开始之前有时间这样做,而且如果 Godot 更新很多,答案也可能会改变很多。

所以问题是:您能否检测到 RichTextLabel 中特定文本/单词上的鼠标悬停(或其他鼠标交互),也许要感谢一些 BBCode ?或者也许正如之前所说,有一些文本节点更实用(即使我对此表示怀疑)?

还没有,但从我所看到的来看,RichTextLabel 是唯一支持文本修改的,并且只是与节点其余部分的“文本差异”,因此可能是最有能力的,即使可能很远,因为他处理 BBCode 的能力,但如果我现在想到的是唯一的解决方案......

这将检测(X,Y)坐标中某些 BBCode 应答器(或自制应答器哈哈)的位置,以在这些关键字上放置“鼠标悬停检测框”,这意味着您需要获取单词的(X,Y)坐标在一个段落中,这也不容易处理,您需要计算每个字符的大小来计算一个简单单词的位置(X,Y)......所以是的,听起来很难做到。

也许引擎中永远不会有真正的答案,那么我想我必须在我猜的描述之后进入“关键字列表”......

提前感谢您的回答。

mouseover godot gdscript richtext
1个回答
0
投票

使用

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"

),该值来自标签:

    当您在文本中创建标签时,您可以设置“url”属性,您设置的值就是您将从信号中获取的值。
  • 当您使用
  • push_meta
     创建它时,您可以从信号中传递所需的值作为参数。
这里

push_meta

 比使用文本有一个优势:“url”属性永远只是一个 
String
,但是 
push_meta
 的参数是一个 Variant,你可以在那里传递任何东西,包括对对象的引用。 

连接到这些信号的方法看起来像这样:

func _on_meta_clicked(meta): prints(meta)
请参阅

使用信号了解如何建立连接。

© www.soinside.com 2019 - 2024. All rights reserved.