Индексирование Godot и клавиатура одновременно

Я пытался разработать игру с клавиатурой и сенсорным индексированием, в которую можно было бы играть в браузерах ПК и на телефоне. Как я могу индексировать?

Пробовал несколько образцов в меню Godot Sample. Ни один из них не помог. Либо для клавиатуры, либо для сенсорного экрана

func _unhandled_input(event):
    if event is InputEventScreenTouch:
        if event.pressed:
            # Down
            if !_os2own.has(event.index): # Defensively discard index if already known
                var ptr_id = _find_free_pointer_id()
                state[ptr_id] = event.position
                _os2own[event.index] = ptr_id
        else:
            # Up
            if _os2own.has(event.index): # Defensively discard index if not known
                var ptr_id = _os2own[event.index]
                state.erase(ptr_id)
                _os2own.erase(event.index)
        return true

Нужно трогать и нажимать на игру. И для APK, и для HTML


person Bitdom8    schedule 08.09.2019    source источник
comment
Не могли бы вы подробнее рассказать о том, что пытаетесь реализовать?   -  person hola    schedule 10.09.2019
comment
Я хочу иметь возможность использовать как клавиатуру, так и сенсорную панель, и мне нужно кодировать. Спасибо   -  person Bitdom8    schedule 11.09.2019


Ответы (1)


Для простой обработки ввода (например, нажатие и отпускание) вам нужно сопоставить ввод с действиями. Вы можете добавить действия через «Настройки проекта -> Карта ввода» или 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
comment
Это великолепно после нескольких попыток, у вас все настроено. Спасибо - person Bitdom8; 17.09.2019
comment
Я пробовал это, но немного потребляет память. Те, кто внедряет, могут использовать его, зная, что - person Bitdom8; 23.09.2019
comment
@ Bitdom8 Я рада, что это сработало для вас. Сколько это потребляет для вас? На что похожа ваша реализация? - person hola; 28.10.2019
comment
Ну после годот 3.3 все пошло ровнее. Спасибо. Бес точно такой же, как и ваш - person Bitdom8; 04.05.2021