Godot索引和键盘同时使用

时间:2019-09-08 18:17:57

标签: godot

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

在Godot样品菜单中尝试了一些样品。他们都没有帮助。键盘或触摸屏均可

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

1 个答案:

答案 0 :(得分:0)

对于简单的输入处理(例如,按下和释放),您需要将输入映射到动作。您可以通过“项目设置->输入映射”或InputMap单例添加动作。

从“项目设置->输入映射”中,可以将鼠标,键盘和控制器输入映射到操作。

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

走得更远

由于帖子指定了键盘和触摸输入,因此我仅介绍了按下和释放输入动作映射。但是,您也可以将复杂的输入(如手势)映射到动作。您可以继承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!'