Sorry I couldn't answer well that time.
Scene sctructure
Control <- script attached
Control
MoveButton - emit pressed & released signals connected to script
Control2
DashButton - emit pressed & released signals connected to script
Character
For every control node, in Inspector dock, go to Mouse > Filter
and set the field as Ignore
Source code is here.
*adding explanation
extends Control
# global_pos = current MoveButton touch position
# pos = normalized character direction.
# vec = variable for storing movement speed
var global_pos = Vector2.ZERO
var pos = Vector2.ZERO
var vec = Vector2.ZERO
# dash = dashmode, move = movemode
# If you want to add more buttons, you can use button_queue for more touch inputs
# touches = total touch points in screen (limited to 10 in _unhandled_input func)
# button_index = store which button is pressed with which index. If touch index is 3 and you pressed move button, button_index[3] = 0
var dash: bool = false
var move: bool = false
var button_queue = []
var touches = []
var button_index = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1]
# Character Sprite and calculated center of each Buttons.
onready var character = $Character
onready var btn_pos = [$Control.rect_position+Vector2(32,32), $Control2.rect_position+Vector2(32,32)]#[$Control/MoveButton.position, $Control2/DashButton.position]
func _ready() -> void:
set_process(true)
func _process(delta: float) -> void:
# only runs when move is true
if move == true:
pos = (global_pos - btn_pos[0]).normalized()
vec = Vector2.ZERO
if pos.y < 0:
if abs(pos.x*2.0) < abs(pos.y):
vec.y = -1
elif abs(pos.x*2.0) >= abs(pos.y) && abs(pos.y*2.0) >= abs(pos.x):
vec.y = -1
if pos.x < 0:
vec.x = -1
else:
vec.x = 1
else:
if pos.x < 0:
vec.x = -1
else:
vec.x = 1
else:
if abs(pos.x*2.0) < abs(pos.y):
vec.y = 1
elif abs(pos.x*2.0) >= abs(pos.y) && abs(pos.y*2.0) >= abs(pos.x):
vec.y = 1
if pos.x < 0:
vec.x = -1
else:
vec.x = 1
else:
if pos.x < 0:
vec.x = -1
else:
vec.x = 1
# you can change this part to increase/decrease/normalize speed of character
character.position += vec if dash == false else vec * 2
pass
func _on_TouchScreenButton_pressed() -> void: # pressed signal connected
move = true
button_queue.append(0)
func _on_TouchScreenButton_released() -> void: # released signal connected
move = false
func _on_TouchScreenButton2_pressed() -> void: # pressed signal connected
dash = true
func _on_TouchScreenButton2_released() -> void: # released signal connected
dash = false
func _unhandled_input(event):
if event is InputEventScreenTouch:
if event.is_pressed():
if touches.size() <= 10: # Ignore more than 10 stimultanous touches
touches.append(event.index)
if not button_queue.empty(): # check button queue if button is pressed
button_index[event.index] = button_queue[0]
button_queue.remove(0)
else: # released
for i in range(0, touches.size()):
if touches[i] == event.index:
touches.remove(i)
break
if event is InputEventScreenDrag: # dragging while button is pressed
if button_index[event.index] == 0:
global_pos = event.position
Above code can:
- get up to 10 touch inputs stimultanously
- move and dash character 8 direction
- you can still use events. And also you can manipulate anything you want.
functions connected to signals will always run faster than unhandledinput function