【问题标题】:Change mouse cursor when entering/exiting Area2d进入/退出 Area2d 时更改鼠标光标
【发布时间】:2021-08-13 21:46:19
【问题描述】:

我已经尝试了所有看起来相关的谷歌结果,但找不到解决方案,我确信它比我做的更简单。有可能所有结果都已过时,因为官方文档似乎没有提供我在搜索结果建议中看到的内容。

当鼠标进入Area2D时,我希望鼠标光标变为手形光标。当我退出 Area2D 时,我希望它变回指针。我不打算使用自定义光标,只是已经在 GODOT 中实现的基本光标。

我知道如何使用 mouse_entered/mouse_exited 信号。我只是无法确定进行更改的正确代码和位置。

【问题讨论】:

    标签: godot gdscript


    【解决方案1】:

    当鼠标进入Area2D时,我希望鼠标光标变为手形光标。当我退出 Area2D 时,我希望它变回指针。我不打算使用自定义光标,只是已经在 GODOT 中实现的基本光标。

    为此,您想要的功能是Input.set_default_cursor_shapeInput.get_current_cursor_shape

    我知道如何使用 mouse_entered/mouse_exited 信号。我只是无法确定进行更改的正确代码和位置。

    您将代码放置在您连接的任何信号处理程序中。我提醒您,您可以在“节点”面板的“信号”选项卡中连接来自 IDE 的信号。 在代码中,你应该看到 func 旁边的绿色图标连接到一个信号。另见Signals

    例如,我将它们连接到同一 Area2D 中的脚本,并添加了以下代码:

    func _on_Area2D_mouse_entered() -> void:
        Input.set_default_cursor_shape(Input.CURSOR_POINTING_HAND)
    
    func _on_Area2D_mouse_exited() -> void:
        Input.set_default_cursor_shape(Input.CURSOR_ARROW)
    

    或者如果你想存储之前的CursorShape,你可以这样做:

    var old_cursor_shape:int = Input.CURSOR_ARROW
    
    func _on_Area2D_mouse_entered() -> void:
        old_cursor_shape = Input.get_current_cursor_shape()
        Input.set_default_cursor_shape(Input.CURSOR_POINTING_HAND)
    
    func _on_Area2D_mouse_exited() -> void:
        Input.set_default_cursor_shape(old_cursor_shape)
    

    有关值,请参阅CursorShape注意:当前测试版中似乎存在一个错误,导致这些无法自动完成。


    mouse_entered/mouse_exited 可能不起作用的原因。

    假设它们连接正确。

    如果有任何Control(例如Container 或背景)与Node2D 重叠 - 例如Area2D - 无论它在视觉上是在前面还是后面。它将阻止它接受输入。因此,您必须将其mouse_filterControl 设置为Ignore

    并确保Area2Dcollision_layercollision_mask 不为空(0),input_pickable 为真,当然Area2D 具有有效的CollisionShape2DCollisionPolygon2D。否则 mouse_entered/mouse_exited 将不起作用。

    另外,我提醒您注意 IDE 报告的任何错误。

    【讨论】:

      【解决方案2】:

      我建议您可以做的一件事是将Area2D 作为根节点的子节点(很可能是Node2D)将新的Area2D 重命名为您想要的任何名称(只要它不是) t 命名为Area2D。为了教你,我将把它重命名为 CursorBox)并将脚本附加到新的Area2D。添加一个CollisionShape2D 节点作为Area2D 的子节点,将形状设置为圆形,并将半径设置为0.5。接下来,转到右上角并按节点按钮。将“Area Entered”和“Area Exited”连接到CursorBox。在你的脚本中,确保你的函数看起来像我在下面写的那样。

      extends Area2D
      var mouseCheck = false
      func _on_CursorBox_area_entered(area):
          if area.name == ("Area2D"): #This `Area2D` its looking for would be the buttons Area2D
              mouseCheck = true
      func _on_CursorBox_area_exited(area):
          if area.name == ("Area2D"):
              mouseCheck = false
      

      鼠标检查只是在那里看看它是否有效,显然把你的代码放在那里,无论你需要放什么。我想你有一些你想要播放的动画或其他东西。如果您还有其他问题,请回复,我们会看看我们还能做些什么来解决它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-09
        • 2010-11-16
        • 1970-01-01
        • 2018-12-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        • 2012-07-12
        相关资源
        最近更新 更多