entering/exiting Area2d 时更改鼠标光标

Change mouse cursor when entering/exiting Area2d

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

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

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

When the mouse enters an Area2D, I want the mouse cursor to change to the hand pointing cursor. When I exit the Area2D, I want it to change back to the pointer. I am not looking to use custom cursors, just the basic ones already implemented in GODOT.

为此,您需要的函数是 Input.set_default_cursor_shapeInput.get_current_cursor_shape

I know how to use mouse_entered/mouse_exited signals. I just can't determine the correct code and location to make the change happen.

您将代码放在您连接的任何信号处理程序中。我提醒您,您可以在“节点”面板的“信号”选项卡中连接来自 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 - 不管它是否在前面或在视觉上落后。它将阻止它接受输入。因此,您必须将 Controlmouse_filter 设置为 Ignore

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

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

我建议您可以做的一件事是将 Area2D 作为根节点的子节点(很可能是 Node2D)将新的 Area2D 重命名为您想要的任何名称想要(只要它没有命名为 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

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