Найти тему
Игровой движок Godot engine

№5. Input. Ловим нажатие кнопок.

Наверное одна из самых замороченных, на первый взгляд тем — работа с кнопками управления. Клавиатура, мышка, джойстики.

Для работы с управлением , будь то кнопки клавиатуры , или мышки, есть функция _input(event).

Внутри неё мы проверяем, что нажал пользователь, и уже делаем с этими данными всё что нам нужно.

Но прежде чем мы начнем изучать непосредственно код, стОит упомянуть, что инпут так же можно использовать в функции _process. Например если нам надо производить какие то манипуляции с объектом с постоянно нажатой кнопкой мышки или клавиатуры. Но, об этом чуть позже.

Посмотреть на текущую раскладку кнопок можно в настройках проекта — Project > Project Settings > Input Map.

По умолчанию в годо уже расписаны некоторые кнопки , например стрелочки, enter , home, page_up, page_down и прочие.
Я добавил новую кнопку «clicker», это нажатие на левую кнопку мышки.

Итак, давайте разберемся как отслеживается нажатие кнопки. Будем ловить клик мышкой.

Для этого в функции func _input(event): пишем код :

if Input.is_action_pressed("clicker"):
print("click")

Когда мы пишем is_action_pressed, годо сам выдаст нам все доступные кнопки из раскладки. И нам надо будет просто выбрать необходимую из списка.

Запускаем, жмем по левой кнопке мышки и видим результат :

-2

Когда вы писали код, вы могли заметить, что годо помимо is_action_pressed предлагает нам is_action_just_pressed и is_action_just_released.

is_action_pressed — повторяет действие пока мышка зажата
is_action_just_pressed — действие происходит единажды по нажатию кнопки
is_action_just_released — действие происходит единажды по отпусканию кнопки

Резонный вопрос — почему наше действие не повторяется ?
Всё потому, что в таком случае нам надо вынести инпут в _process. Только там наш код будет обрабатываться постоянно.

Ловим кнопки которых нет в настройках приложения

Что делать, если мы хотим отлавливать кнопки мышки без добавления их в раскладку ?
Тут нет ничего сложного.

Пишем следующий код :
if InputEventMouseButton and event.is_pressed() and event.button_index == BUTTON_LEFT:

В этой строке происходит следующее : Идет проверка на нажатие кнопки мышки и проверка на то, что нажата именно левая кнопка.

Если мы не уточним последний пункт, то код будет срабатывать на нажатие ЛЮБОЙ кнопки мышки.
Если мы не укажем событие is_pressed, то будет отлавливаться как клик так и отпускание кнопки мышки.

Стоит отметить , что данный код не будет работать в функции _process, так как будет требовать аргумент event. Поэтому в _process как правило используется написание кода без участия event.
Например
if Input.is_mouse_button_pressed(BUTTON_LEFT):
или if Input.is_action_pressed("clicker"):

Отловить нажатие определенной кнопки клавиатуры так же не составляет труда.

Пишем — if Input.is_key_pressed():
В скобочках нам надо указать либо кнопку (в виде KEY_name), либо код кнопки, который можно подсмотреть в справке к годо. Например код 16777221 это нажатие на кнопку Enter. (она же KEY_ENTER)

Если же вам надо отлавливать нажатие любой кнопки клавиатуры, то можно написать следующий код :

if InputEventKey and event.is_pressed():

Как видим годо дает нам очень много вариантов работы с управлением. Главное тут не увязнуть :)

-3