Приклади введення

Вступ

У цьому уроці ви дізнаєтеся, як використовувати систему вхідних подій Godot InputEvent для захоплення вводу гравця. Є багато різних типів введення, які ваша гра може використовувати - клавіатура, геймпад, миша і т. д. - і багато різних способів перетворити ці введення в дії у вашій грі. Цей документ покаже вам деякі з найбільш поширених сценаріїв, які ви можете використовувати як відправні точки для власних проектів.

Примітка

Детально робота системи вхідних подій Godot розглянута в Використання inputEvent.

Події та опитування

Іноді ви хочете, щоб ваша гра реагувала на певну вхідну подію - наприклад, натискання кнопки "стрибка". В інших ситуаціях ви можете хотіти, щоб щось відбувалося, коли натиснута клавіша, наприклад, рух. У першому випадку можна скористатися функцією _input(), яка буде викликатися при виникненні вхідної події. Для другого випадку Godot надає синглтон Input, який можна використовувати для запиту стану вводу.

Приклади:

func _input(event):
    if event.is_action_pressed("jump"):
        jump()


func _physics_process(delta):
    if Input.is_action_pressed("move_right"):
        # Move as long as the key/button is pressed.
        position.x += speed * delta

Це дає вам гнучкість для змішування та поєднання типів введення.

В решті цього уроку ми зосередимося на захопленні окремих подій у _input().

Вхідні події

Вхідні події - це об'єкти, які успадковуються від InputEvent. Залежно від типу події об'єкт міститиме певні властивості, пов'язані з цією подією. Щоб побачити, як насправді виглядають події, додайте вузол і прикріпіть такий скрипт:

extends Node


func _input(event):
    print(event.as_text())

При натисканні клавіші, переміщенні мишку та виконанні іншого введення, ви можете бачити, що кожна подія прокручується у вікні виводу. Ось приклад виводу:

A
InputEventMouseMotion : button_mask=0, position=(108, 108), relative=(26, 1), speed=(164.152496, 159.119843), pressure=(0), tilt=(0, 0)
InputEventMouseButton : button_index=BUTTON_LEFT, pressed=true, position=(108, 107), button_mask=1, doubleclick=false
InputEventMouseButton : button_index=BUTTON_LEFT, pressed=false, position=(108, 107), button_mask=0, doubleclick=false
S
F
Alt
InputEventMouseMotion : button_mask=0, position=(108, 107), relative=(0, -1), speed=(164.152496, 159.119843), pressure=(0), tilt=(0, 0)

Як бачите, результати дуже різні для різних типів введення. Події клавіш навіть друкуються як символи, за які вони відповідають. Для прикладу, розглянемо вхідну події клавіші мишки InputEventMouseButton. Вона успадковується від наступних класів:

  • InputEvent - базовий клас для всіх вхідних подій

  • InputEventWithModifiers - додає можливість перевірити, чи натиснуті модифікатори, такі як Shift, або Alt.

  • InputEventMouse - додає властивості події мишки, такі як position

  • InputEventMouseButton - містить індекс клавіші, яка була натиснута, чи це було подвійне клацання і т. д.

Порада

Рекомендовано тримати посилання на клас відкритим під час роботи з подіями, щоб ви могли перевірити доступні властивості та методи типу події.

Ви можете зіткнутися з помилками, при спробі отримати доступ до тої властивості типу введення, якої він не містить , наприклад, викликати position з InputEventKey. Щоб уникнути цього, спочатку перевіряйте тип події:

func _input(event):
    if event is InputEventMouseButton:
        print("mouse button event at ", event.position)

InputMap (карта введення)

Карта введення InputMap є найбільш гнучким способом обробки різних вводів. Ви використовуєте її, створюючи іменовані вхідні дії, яким можна призначити будь-яку кількість вхідних подій, таких як натискання клавіш, або клацання мишкою. Новий проект Godot містить ряд уже визначених дій за замовчуванням. Щоб переглянути їх і додати власні, відкрийте вікно Проект -> Параметри проекту та перейдіть на вкладку Карта введення:

../../_images/inputs_inputmap.png

Захоплення дій

Визначивши дії, ви можете обробити їх у своїх скриптах, використовуючи is_action_pressed() та is_action_released(), передаючи назву дії, яку ви шукаєте:

func _input(event):
    if event.is_action_pressed("my_action"):
        print("my_action occurred!")

Події клавіатури

Події клавіатури фіксуються в InputEventKey. Хоча рекомендується використовувати дії введення, можуть бути випадки, коли ви хочете переглянути саме події клавіатури. Для прикладу давайте перевіримо клавішу T:

func _input(event):
    if event is InputEventKey and event.pressed:
        if event.scancode == KEY_T:
            print("T was pressed")

Порада

Перегляньте @GlobalScope_KeyList, щоб ознайомитися зі списком констант сканкоду.

Попередження

Через примару клавіатури не всі введення клавіш можуть бути зареєстровані одночасно, якщо натиснути занадто багато клавіш разом. Завдяки своєму розташуванню на клавіатурі, деякі клавіші більш схильні до ставати привидами, ніж інші. Деякі клавіатури мають анти-примарний захист на апаратному рівні, але ця функція, як правило, відсутня на клавіатурах низького класу та клавіатурах ноутбуків.

В результаті рекомендується використовувати розкладку клавіатури за замовчуванням, яка призначена для гарної роботи клавіатурі, без примар. Дивіться це питання на Gamedev Stack Exchange для отримання додаткової інформації.

Модифікатори клавіатури

Властивості модифікатора успадковуються від InputEventWithModifiers. Вони дозволяють перевірити наявність комбінацій модифікаторів за допомогою логічних властивостей. Давайте уявимо, що ви хочете, щоб одна річ відбулася, коли натиснута T, але зовсім інша, коли натиснуті Shift + T:

func _input(event):
    if event is InputEventKey and event.pressed:
        if event.scancode == KEY_T:
            if event.shift:
                print("Shift+T was pressed")
            else:
                print("T was pressed")

Порада

Перегляньте @GlobalScope_KeyList, щоб ознайомитися зі списком констант сканкоду.

Події мишки

Події миші випливають з класу InputEventMouse і розділені на два типи: InputEventMouseButton та InputEventMouseMotion. Зауважте, що це означає, що всі події мишки міститимуть властивість position.

Кнопки мишки

Захоплення кнопок мишки дуже схоже на обробку подій клавіш. @GlobalScope_ButtonList містить список констант BUTTON_* для кожної можливої кнопки, які повідомляються у властивості події button_index. Завбачте, що коліщатко прокрутки також вважається кнопкою - двома кнопками, якщо бути точним, причому BUTTON_WHEEL_UP і BUTTON_WHEEL_DOWN (прокрутка вверх-вниз) є окремими подіями.

func _input(event):
    if event is InputEventMouseButton:
        if event.button_index == BUTTON_LEFT and event.pressed:
            print("Left button was clicked at ", event.position)
        if event.button_index == BUTTON_WHEEL_UP and event.pressed:
            print("Wheel up")

Рух мишки

Події InputEventMouseMotion відбуваються щоразу, коли мишка рухається. Ви можете знайти відстань переміщення у властивості relative.

Ось приклад використання подій мишки для перетягування вузла Sprite:

extends Node


var dragging = false
var click_radius = 32 # Size of the sprite.


func _input(event):
    if event is InputEventMouseButton and event.button_index == BUTTON_LEFT:
        if (event.position - $Sprite.position).length() < click_radius:
            # Start dragging if the click is on the sprite.
            if not dragging and event.pressed:
                dragging = true
        # Stop dragging if the button is released.
        if dragging and not event.pressed:
            dragging = false

    if event is InputEventMouseMotion and dragging:
        # While dragging, move the sprite with the mouse.
        $Sprite.position = event.position

Сенсорні події

Якщо використовується сенсорний пристрій, можна генерувати сенсорні події. InputEventScreenTouch еквівалентний події клацання мишки, а InputEventScreenDrag працює так само, як і рух мишки.

Порада

Щоб перевірити сенсорні події на пристрої без сенсорного екрана, відкрийте вікно Параметри проекту та перейдіть до розділу Пристрої вводу/вказівки. Увімкніть "Emulate Touch From Mouse" ("Емулювати дотик від миші"), і ваш проект інтерпретуватиме клацання та рух мишки, як сенсорні події.