Files
godot-demo-projects/misc/multitouch_view/TouchHelper.gd
2017-12-07 03:42:48 +01:00

46 lines
1.3 KiB
GDScript

# This will track the position of every pointer in its public `state` property, which is a
# Dictionary, in which each key is a pointer id (integer) and each value its position (Vector2).
# It works by listening to input events not handled by other means.
# It also remaps the pointer indices coming from the OS to the lowest available to be friendlier.
# It can be conveniently setup as a singleton.
extends Node
var state = {}
var _os2own = {}
func _ready():
set_process_unhandled_input(true)
func _unhandled_input(event):
if event.type == InputEvent.SCREEN_TOUCH:
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] = Vector2(event.x, event.y)
_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
elif event.type == InputEvent.SCREEN_DRAG:
# Move
if _os2own.has(event.index): # Defensively discard index if not known
var ptr_id = _os2own[event.index]
state[ptr_id] = Vector2(event.x, event.y)
return true
return false
func _find_free_pointer_id():
var used = state.keys()
var i = 0
while i in used:
i += 1
return i