Изменение курсора мыши при входе/выходе из Area2d

#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
 

Проверка мыши просто для того, чтобы проверить, работает ли она, очевидно, поместите туда свой код, все, что вам нужно вставить. Я бы предположил, что у вас есть какая-то анимация, которую вы хотите воспроизвести, или что-то в этом роде. Если у вас есть еще какие-либо вопросы, просто ответьте, и мы посмотрим, что еще мы можем сделать, чтобы исправить это.