同时使用 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!'
我一直在尝试开发可在 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!'