From f9c93b0d288c293c13e5c695c10349a331984189 Mon Sep 17 00:00:00 2001 From: pkruszynski <69171579+pkruszynski@users.noreply.github.com> Date: Tue, 4 Aug 2020 00:20:11 +0100 Subject: [PATCH] Fix for multitouch_view --- mobile/multitouch_view/Main.gd | 10 +++++----- mobile/multitouch_view/README.md | 2 +- mobile/multitouch_view/TouchHelper.gd | 17 ++++------------- .../screenshots/multitouch.png | Bin 1604 -> 15778 bytes visual_script/multitouch_view/TouchHelper.gd | 17 ++++------------- 5 files changed, 14 insertions(+), 32 deletions(-) diff --git a/mobile/multitouch_view/Main.gd b/mobile/multitouch_view/Main.gd index d31d612d..14a89e33 100644 --- a/mobile/multitouch_view/Main.gd +++ b/mobile/multitouch_view/Main.gd @@ -9,14 +9,14 @@ func _draw(): # Get the touch helper singleton. var touch_helper = get_node("/root/TouchHelper") # Draw every pointer as a circle. - for ptr_id in touch_helper.state.keys(): - var pos = touch_helper.state[ptr_id] - var color = _get_color_for_ptr_id(ptr_id) + for ptr_index in touch_helper.state.keys(): + var pos = touch_helper.state[ptr_index] + var color = _get_color_for_ptr_index(ptr_index) color.a = 0.75 draw_circle(pos, 40.0, color) # Just a way of getting different colors. -func _get_color_for_ptr_id(id): - var x = (id % 7) + 1 +func _get_color_for_ptr_index(index): + var x = (index % 7) + 1 return Color(float(bool(x & 1)), float(bool(x & 2)), float(bool(x & 4))) diff --git a/mobile/multitouch_view/README.md b/mobile/multitouch_view/README.md index bf1378e5..33068e11 100644 --- a/mobile/multitouch_view/README.md +++ b/mobile/multitouch_view/README.md @@ -1,6 +1,6 @@ # Multitouch View with GDScript -Simple debugger for multitouch input. Shows red dots everywhere you press. +Simple debugger for multitouch input. Shows colored dots everywhere you press. Language: GDScript diff --git a/mobile/multitouch_view/TouchHelper.gd b/mobile/multitouch_view/TouchHelper.gd index 13aeb541..ab14b298 100644 --- a/mobile/multitouch_view/TouchHelper.gd +++ b/mobile/multitouch_view/TouchHelper.gd @@ -1,29 +1,20 @@ extends Node # 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). +# Dictionary, in which each key is a pointer index (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. var state = {} -var _os2own = {} 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 = state.size() - state[ptr_id] = event.position - _os2own[event.index] = ptr_id + state[event.index] = event.position 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) + state.erase(event.index) get_tree().set_input_as_handled() elif event is InputEventScreenDrag: # Movement. - if _os2own.has(event.index): # Defensively discard index if not known. - var ptr_id = _os2own[event.index] - state[ptr_id] = event.position + state[event.index] = event.position get_tree().set_input_as_handled() diff --git a/mobile/multitouch_view/screenshots/multitouch.png b/mobile/multitouch_view/screenshots/multitouch.png index 5010f3e4b7362a1e0785ef2cad30d5f8672ee3c7..0161035e7981f4a391dc5a8d7eea8f8d5b5d6247 100644 GIT binary patch literal 15778 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 OL0W3M4@&P_zy4qIp~iCn literal 1604 zcmeAS@N?(olHy`uVBq!ia0y~yV1B{Cz!bs33=}zbz(yQMeGc#mag|jv5|`ExmsXdO zm6wpwl8}*=kkLHG!6PXnE3KfVu4kvAZ?9$Oq-o$FuWBT%pe?6jprB?fDI+H-D<>hV zCMl~fDW@SNuPLXjFRyAStE8u>ZXye0s~Ad1%V;Vq%P8u|sThig%Zo}ViipdJNGK?( zn<}Uo$tvq9YM5%Os~?{{SxHq@MowKsTuE9^ZQHi(HMI?5Qfh)Cvch5tQ)69b#=Ff) z@{m^4kx|l>QPgd=acHx3>a=%hu(nr{m)A6K%*wA+P*%yvDO1ugP0lDx%_eNzu-V3UbE_3ssclJHzZ1)J(Q-+h(BQstoi#W0JSK3quF1tOt<8S>O>_3=E`= zAk6r+`K>2VkiEpy*OmPVGY6}*Mr15Q15ijdGbEzKIX^cyHLnE7WngeFN=+EaktaqI1k-M-9>A})dHZ6|~lx;`*!_{Z(cvZLkduXC2F zJ@>BG>49QmfPh3{?IzYO(&5%;T=dFjoQ!#8FmdOVM5W@Dhh3fpwfCNz%EvudTb9je zx>Ziex{`<&F)ue<*m)^&Ve!(#PS3sA7czH3m55n|TXD#G02K*XO#muWC{eh$^OEBW zhegFpn=ddfWOicry95$wfN=U=fz&v_xC^;uTl7iaUk?^&tAne(s8iXYQK&r0A92 zfO%B`7#42Nz1mxmJgNitCM-0XFEqNq!^4SP2pDKBd@A5D5wKDyd7uIo;E)A#RsfB1 zVsGJtaKWB-Vh4o)-x06v>JU+f7Y7WNMhim}6?9$7P*HIw77l^k4*-L?VDiF54^t99-v7M91oBH1}Q|sU&PCAz{CWJ7mH;j+0ZoT7r09ooZ!5{ z39byB;MQ`0V&k>|FhK$FZGLd9$bIqNE(^pmKr9W!Qcr@nO8{wcAQl6%MSxfchy{R{ z?@01?t}WTyS?M443=Hno%&+Y9w%fmVIPv!W^~WDS*Y2