同时使用 Godot 索引和键盘

Godot indexing and keyboard both at the same time

我一直在尝试开发可在 PC 浏览器和 phone 上玩的键盘和触摸索引游戏。如何索引?

在 Godot 示例菜单中尝试了一些示例。 None 人提供了帮助。键盘或触摸屏

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

对于简单的输入处理(例如按下和释放),您需要将输入映射到操作。您可以通过 "Project Settings -> Input Map" 或 InputMap 单例添加操作。

从 "Project Settings -> Input Map" 您可以将鼠标、键盘和控制器输入映射到操作。

对于触摸屏,您可以使用 TouchScreenButton 并将其设置为 action。当按下或释放时,它将通过 _input() 将该动作事件发送到场景树中。 TouchScreenButton 隐藏了需要在 _input() 中编写的逻辑来处理 按下和释放 ,例如:这个手指索引是新的吗?最后一帧哪个手指食指移动了?这个手指区域在输入区域的边界内吗?和更多。同时还具有优于普通 Button 的优势,因为它还发出一个动作并且可以没有纹理,因为它使用 Shape 进行输入检测。

因此这创建了从操作到输入的一对多关系,例如:

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()

更进一步

由于 post 指定了键盘和触摸输入,我只介绍了按下和释放输入动作映射。但是,您也可以将手势等复杂输入映射到动作。您可以继承 InputEvent 或其任何子classes 以扩展或创建新事件。您可以将新事件 class 映射到操作,然后手动处理输入以查找事件。然后你停止事件的传播,从你的新事件 class 中形成事件,然后调用 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!'