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_shape
和 Input.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
- 不管它是否在前面或在视觉上落后。它将阻止它接受输入。因此,您必须将 Control
的 mouse_filter
设置为 Ignore
。
并确保Area2D
的collision_layer
和collision_mask
不为空(0),input_pickable
为真,当然还有Area2D
具有有效的 CollisionShape2D
或 CollisionPolygon2D
。否则 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
鼠标检查只是为了看看它是否有效,显然把你的代码放在那里,无论你需要放什么。我想你有一些你想播放的动画或其他东西。如果您还有任何问题,请回复,我们将看看我们还能做些什么来解决它。
我已经尝试了每一个看起来相关的 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_shape
和 Input.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
- 不管它是否在前面或在视觉上落后。它将阻止它接受输入。因此,您必须将 Control
的 mouse_filter
设置为 Ignore
。
并确保Area2D
的collision_layer
和collision_mask
不为空(0),input_pickable
为真,当然还有Area2D
具有有效的 CollisionShape2D
或 CollisionPolygon2D
。否则 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
鼠标检查只是为了看看它是否有效,显然把你的代码放在那里,无论你需要放什么。我想你有一些你想播放的动画或其他东西。如果您还有任何问题,请回复,我们将看看我们还能做些什么来解决它。