Helper node for making Godot engine games react to different gestures on mobile. Godot Engine is an awesome free software game engine that you should check out!
As I found out, detecting gestures is really hard, and there are probably better algorithms out there than the ones I hacked together for this. While it seems to be acceptably accurate for the projects I'm working on, it could probably use a lot of improvement and extra features, so suggestions and/or pull-requests are welcome!
Instance the scene
GodotGesture.tscnsomewhere in your scene hierarchy
Attach events for the ones being listened to
Godot Gesture is entirely signal based.
double_tap(position)- Tap twice somewhere on the screen
tap(position)- A single tap on the screen, called the first time the screen is tapped.
touches_changed(touch_count)- Called whenever the number of fingers currently touching the screen changes.
twisted(position, is_clockwise)- Clockwise or counter-clockwise two-finger "twist" motion
pinched(position, is_inward)- Inward or outward pinch (e.g. zoom) gesture.
dragged(position, drag_vector)- Two finger drag event.
These are called when one of the
listen_for_debounced_* properties is
enabled. It is called
debounce_time_ms from after when the event
actually occurred. They are not called if the event is actually part of
one of the above events (e.g., if the drag or tap later turns out to be
a multi-touch or double tap event). This is useful for distinguishing
between multitouch events and taps or drags by themselves.
single_tap(event)- A single finger, stray tap
single_drag(event)- A single finger, stray drag
Fine control over threshholds for detecting the various events is available via exported script variables. Checking for each event type can be turned on or off with the following events:
listen_for_multi_drag = true
listen_for_multi_pinch = true
listen_for_multi_twist = true
This is useful if you only care about certain events, and other events are getting detected instead (e.g. you only care about pinch, but drag or twist events are getting registered instead).
double_tap_thresh_ms = 500- Maximum separation in miliseconds for click event
double_tap_thresh_distance = 100- Maximum separation between taps for a double tap event to be considered
twist_precision = 150- Higher means more twist events
pinch_precision = 70- Lower means more pinch events
drag_precision = 215- Higher means more drag events
drag_threshhold = 10- Filters brief "drag" events
deobunce_time_ms = 600- How long debounced events are cached before being triggered. If you are listening to
double_tap, make sure this is a little longer than
These probably are not very useful unless you are debugging, or
intending to contribute to
debug_right_click_enabled = false- For debugging / development only: Combine this with Godot's simulate touch events project setting (set
true) to test gestures on the computer. Right click to "plant" an "extra finger" in a location, and right click again to lift it up. All events except for 2 finger drag can be tested this way (since dragging requires 2 fingers both moving).
debug_show_clicks_and_drag = false- For debugging / development only: Creates symbols on screen to show where events are getting noticed