Для простой обработки ввода (например, нажатие и отпускание) вам нужно сопоставить ввод с действиями. Вы можете добавить действия через «Настройки проекта -> Карта ввода» или InputMap синглтон.
В «Настройки проекта -> Карта ввода» вы можете сопоставить ввод с помощью мыши, клавиатуры и контроллера с действиями.
Для сенсорных экранов вы можете использовать TouchScreenButton и установить его action
. При нажатии или отпускании он отправляет это событие действия вниз по дереву сцены через _input()
. TouchScreenButton скрывает логику, необходимую для записи в _input()
для обработки нажатий и отпусканий, например: новый ли этот указатель пальца? указатель какого пальца переместил последний кадр? находится ли эта область пальца в пределах области ввода? и более. Имея преимущество перед простой кнопкой, также генерируя действие и не имея текстуры, поскольку использует форму для обнаружения ввода.
Таким образом, создается отношение «один ко многим» между действиями и входными данными, например:
my_action -> left mouse button pressed,
-> controller r1 pressed,
-> right half of touch screen pressed,
-> control-shift-f pressed
Использование действия
func _input(event):
if not event.is_action('my_action'):
return
if event.is_action_pressed('my_action'):
start_something()
else:
stop_something()
Идти дальше
Поскольку в публикации была указана клавиатура и сенсорный ввод, я рассмотрел только отображение действий при нажатии и отпускании. Однако вы также можете сопоставить сложные входные данные, такие как жесты, с действиями. Вы можете наследовать от InputEvent или любого из его подклассов для расширения или создания нового события. Вы можете сопоставить новый класс события с действием, а затем вручную обработать ввод, чтобы найти событие. Затем вы останавливаете распространение события, формируете событие из вашего нового класса событий, а затем вызываете Input.parse_input_event(my_new_event)
, чтобы отправить его вниз по дереву.
Настраиваемое действие
# SomeLeafNode.gd
class MyEvent extends InputEvent:
var my_custom_message = 'Hello, World'
func _ready():
InputMap.add_action('my_event')
InputMap.action_add_event('my_event', MyEvent.new())
func _input(event):
# ... logic to see if event could be MyEvent
get_tree().set_input_as_handled()
var my_event = MyEvent.new()
my_event.my_custom_message = 'Caught my event!'
Input.parse_input_event(my_event)
# SomeInputHandlingGameplayNode.gd
func _input(event):
if event.is_action('my_event'):
print(event.my_custom_message) # prints 'Caught my event!'
person
hola
schedule
12.09.2019