#godot #gdscript
Вопрос:
Я перепробовал все результаты Google, которые кажутся актуальными, и не могу найти решение для того, что, я уверен, проще, чем я это делаю. Существует вероятность, что все результаты устарели, поскольку официальные документы, похоже, не предлагают того, что я вижу в предложениях о результатах поиска.
Когда мышь входит в область 2D, я хочу, чтобы курсор мыши изменился на курсор, указывающий рукой. Когда я выхожу из Area2D, я хочу, чтобы он вернулся к указателю. Я не собираюсь использовать пользовательские курсоры, только базовые, уже реализованные в GODOT.
Я знаю, как использовать сигналы, настроенные на мышь/поддерживаемые мышью. Я просто не могу определить правильный код и местоположение для внесения изменений.
Ответ №1:
Когда мышь входит в область 2D, я хочу, чтобы курсор мыши изменился на курсор, указывающий рукой. Когда я выхожу из Area2D, я хочу, чтобы он вернулся к указателю. Я не собираюсь использовать пользовательские курсоры, только базовые, уже реализованные в GODOT.
Для этого вам нужны функции Input.set_default_cursor_shape
и Input.get_current_cursor_shape
.
Я знаю, как использовать сигналы, настроенные на мышь/поддерживаемые мышью. Я просто не могу определить правильный код и местоположение для внесения изменений.
Вы помещаете код в любые обработчики сигналов, которые вы подключили. Напоминаю, что вы можете подключить сигналы из IDE на панели «Узел», вкладка «Сигналы». И в коде вы должны увидеть, что зеленый значок рядом с функцией подключен к сигналу. См. также Сигналы.
Например, я подключил их к одному и тому же скрипту 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
. Значения. Примечание: Похоже, в текущей бета-версии есть ошибка, из-за которой они не заполняются автоматически.
Причина, по которой может не работать параметр настроена/настроена мышь.
Предполагая, что они правильно подключены.
Если есть какие — либо Control
(например, a Container
или фон), перекрывающие a Node2D
, такие как an Area2D
, независимо от того, находится ли он спереди или сзади визуально. Это предотвратит его получение ввода. Таким образом, вы должны установить свое mouse_filter
значение Control
Ignore
к.
И убедитесь collision_layer
, что и collision_mask
Area2D
не пусто (0), input_pickable
верно, и, конечно Area2D
, у этого есть действительное CollisionShape2D
или CollisionPolygon2D
. В противном случае mouse_entered/mouse_exited не будет работать.
Кроме того, я напоминаю вам обратить внимание на любые ошибки, о которых сообщает среда IDE.
Ответ №2:
Одна вещь, которую я рекомендую вам сделать, это сделать Area2D
как дочерний элемент корневого узла (скорее всего, a Node2D
) переименовать новый Area2D
в то, что вы хотите (до тех пор, пока он не будет назван Area2D
. Ради того, чтобы научить вас, я собираюсь переименовать его в CursorBox) и прикрепить сценарий к этому новому Area2D
. Добавьте CollisionShape2D
узел в качестве дочернего элемента Area2D
, установите форму в виде круга и установите радиус 0,5. Затем перейдите в правый верхний угол и нажмите кнопку «Узел». Подключите «Область введена» и «Область удалена» к окну курсора. Внутри вашего скрипта убедитесь, что ваши функции выглядят так, как я написал ниже.
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
Проверка мыши просто для того, чтобы проверить, работает ли она, очевидно, поместите туда свой код, все, что вам нужно вставить. Я бы предположил, что у вас есть какая-то анимация, которую вы хотите воспроизвести, или что-то в этом роде. Если у вас есть еще какие-либо вопросы, просто ответьте, и мы посмотрим, что еще мы можем сделать, чтобы исправить это.