如何解决在 godot 中按住屏幕触摸
我不确定我是否以正确的方式做事,但我开始在 PC 上测试我的 3D 游戏草稿,然后将其导出到 android。
首先,当我按住鼠标左键时,我希望我的播放器跟随我的鼠标指针,所以我这样做了:
func _physics_process(delta):
if Input.is_action_pressed("click"):
position_2D = get_viewport().get_mouse_position()
# then,project ray from camera to get a position_3D and move...
然后,当我想通过在Android上添加触摸屏支持来转换鼠标按钮时,我找到了InputEventScreenTouch
,但是在_physics_process
中找不到如何使用它,所以我把所有在_input(event)
:
func _input(event):
if event.is_action_pressed("click"):
position_2D = get_viewport().get_mouse_position()
elif event is InputEventScreenTouch and event.is_pressed():
position_2D = get_viewport().get_canvas_transform().affine_inverse().xform(event.position)
问题是它只检测一次按下事件,所以不会为每一帧更新位置。
我想我需要将它放回 _physics_process
,但由于我没有 event
实例,我不知道该怎么做。
任何指针?也许我做错了。
解决方法
首先,知道您可以通过触摸模拟鼠标输入,您会在项目设置 -> 输入设备 -> 指向中找到该选项。它不会进行多点触控,但这通常是更简单的方法。特别是如果您想保留您的 _physics_process
代码。
无论如何,让我们谈谈处理触摸输入。您需要注意两个事件:InputEventScreenTouch
和 InputEventScreenDrag
。 你错过了第二个。当然还有保持鼠标支持InputEventMouse
(有两种InputEventMouseButton
和InputEventMouseMotion
)。
事实上,我会在我的代码中这样做:
if !(event is InputEventScreenDrag)\
and !(event is InputEventScreenTouch)\
and !(event is InputEventMouse):
return
对于多点触控支持,您可以通过索引区分每个触控。除了鼠标没有索引。概括地说,我们可以将鼠标视为索引 0,这导致我们:
var touch_index = 0;
if !(event is InputEventMouse):
touch_index = event.get_index()
要知道用户是否在拖动,您可以这样检查:
var is_drag = event is InputEventScreenDrag or event is InputEventMouseMotion
如果不是拖动,则是按下或释放事件。您可以通过检查 event.is_pressed()
来区分这两者。 我需要重申,event.is_pressed()
仅在 is_drag
为假时才相关。让我这样说:
var is_drag = event is InputEventScreenDrag or event is InputEventMouseMotion
var is_press = !is_drag and event.is_pressed()
var is_release = !is_drag and !event.is_pressed()
顺便说一下,对于鼠标,您可以使用 button_mask
来确定按下了哪些按钮。例如:
var is_left_click = event is InputEventMouse\
and ((event as InputEventMouse).button_mask & BUTTON_LEFT) != 0
例如,如果您只想计算左键点击次数,您可能需要将该逻辑添加到 is_press
。
最后对于位置 event.position
有效,即使对于鼠标也是如此。如果您想要某个 CanvasItem
(Node2D
或 Control
)在本地坐标中的位置,您可以使用 make_input_local
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。