How to do virtual joystick and fire button in a 2D Space Shooter Game for Android mobile phones

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By Ataman

I am a beginner and been watching tutorials in YouTube for a 2D Space Shooter game. I plan to develop one for mobile phones. However, all videos I have seen used the keyboard for movement, so I searched for one creating a virtual joystick. I have seen one and successfully integrated it with the code. So now, I have a virtual joystick and a fire button (TouchScreenButton) which are both child nodes of a canvas layer. Since I cannot test both at the same time because there is only 1 mouse pointer, I have included a spacebar to also call the fire/attack functionality.

During testing in the Godot Engine and Android Virtual Device, there seems to have no issues at all, both buttons are working well separately. However, when I tested it in an actual mobile phone, whenever the player was moving using the joystick and then I press the fire button, the player will stop moving. It seems they cannot function at the same time. But when I hold down the fire button for continuous firing, then I move the player with the joystick it can move.

Here is the script for the joystick (Joystick.gd)

extends Area2D

onready var bigCircle = $BigCircle
onready var smallCircle = $BigCircle/SmallCircle

onready var max_distance = $CollisionShape2D.shape.radius

var touched = false

func _input(event):
	if event is InputEventScreenTouch:
		var distance = event.position.distance_to(bigCircle.global_position)
		if not touched:
			if distance < max_distance:
				touched = true
		else:
			smallCircle.position = Vector2.ZERO
			touched = false

func _process(_delta):
	if touched:
		smallCircle.global_position = get_global_mouse_position()
		#clamp small circle
		smallCircle.position = bigCircle.position + (smallCircle.position - bigCircle.position).limit_length(max_distance)

func get_velocity():
	var joystickVelocity = Vector2.ZERO
	joystickVelocity.x = smallCircle.position.x / max_distance
	joystickVelocity.y = smallCircle.position.y / max_distance
	return joystickVelocity

Here is the code snippet in the player scene where the joystick and fire button (named Attack) functions can be called:

func _physics_process(delta):
	velocity = $UI/Joystick.get_velocity()
	velocity = velocity.normalized() * speed
	
	position += velocity * delta

	# make sure sprite within screen, adjusted to size of image
	var viewRect := get_viewport_rect()
	position.x = clamp(position.x, 23, viewRect.size.x - 23)
	position.y = clamp(position.y, 23, viewRect.size.y - 23)
	
	# used for testing using spacebar for Fire
	if Input.is_action_pressed("fire") and fireDelayTimer.is_stopped():
		fireDelayTimer.start(fireDelay)
		shoot.play()
		for child in firingPositions.get_children():
			var bullet := plBullet.instance()
			bullet.global_position = child.global_position
			get_tree().current_scene.add_child(bullet)

func _on_Attack_pressed():
	if fireDelayTimer.is_stopped():
		fireDelayTimer.start(fireDelay)
		shoot.play()
		for child in firingPositions.get_children():
			var bullet := plBullet.instance()
			bullet.global_position = child.global_position
			get_tree().current_scene.add_child(bullet)

Basically, how can I implement where the player can continuously move while firing in a mobile phone (multitouch)

yeah, i’m having kinda of the same problem. i posted on reddit

https://www.reddit.com/r/godot/comments/xt3plh/game_doesnt_allow_touch_two_different_joysticks/?utm_source=share&utm_medium=web2x&context=3

viniciused26 | 2022-10-01 20:00