Triggers won't pause button on Android.

Hi.

I am using Godot 4.3 to create a small application to play music using a button. However I have a problem when I export the application to Android. The joysticks work great but not the triggers which when I press LT or RT start playing a fraction of a second before pausing again. Sometimes I modified the script which made LT and RT work well on Android but not the joysticks and buttons to make the play resume/pause button state work. I am using an Xbox Series controller which is perfectly functional on Android. Here is my script attached to the button.

extends Button # Le script est toujours attaché au bouton

Variables pour les icĂ´nes

@onready var bouton_play_icon = preload(“res://boutonplay.png”)
@onready var bouton_pause_icon = preload(“res://boutonpause.png”)

Récupérer l’AudioStreamPlayer

@onready var audio_player = $AudioStreamPlayer

Variables pour la gestion de la pause

var last_stream_position = 0.0
var is_playing = false # Pour garder une trace de l’état de lecture

Variables pour la gestion des joysticks

var joystick_deadzone = 0.5 # Zone morte réduite pour détecter les mouvements des joysticks
var joystick_input_delay = 0.2 # Temps minimum entre deux déclenchements
var time_since_last_joystick_input = 0.0 # Temps écoulé depuis la dernière action joystick

Variables pour LT et RT

var trigger_deadzone = 0.9 # Zone morte stricte pour LT/RT
var cooldown = 0.1 # Temps minimum entre deux déclenchements (en secondes)
var time_since_last_input = 0.0 # Temps écoulé depuis le dernier déclenchement
var lt_previous_pressed = false # État précédent de LT
var rt_previous_pressed = false # État précédent de RT

DĂ©tection de la plateforme

var is_android = OS.get_name() == “Android”

Fonction principale pour jouer/mettre en pause

func _toggle_play_pause():
if audio_player.is_playing():
last_stream_position = audio_player.get_playback_position()
audio_player.stop()
is_playing = false
set_button_icon(bouton_play_icon)
print(“Pause déclenchée”)
else:
audio_player.play()
audio_player.seek(last_stream_position)
is_playing = true
set_button_icon(bouton_pause_icon)
print(“Lecture déclenchée”)

Fonction appelée lorsque le son est terminé

func _on_audio_finished():
audio_player.play()
audio_player.seek(0.0)
is_playing = true
set_button_icon(bouton_pause_icon)

Fonction appelée chaque frame

func _process(delta):
time_since_last_input += delta # Incrémenter le cooldown des gâchettes
time_since_last_joystick_input += delta # Incrémenter le cooldown des joysticks

# Vérifier si une manette est connectée
if Input.get_connected_joypads().size() > 0:
	var joypad = Input.get_connected_joypads()[0]  # Première manette connectée

	# Gérer les gâchettes (LT/RT)
	_handle_triggers(joypad)

	# GĂ©rer les joysticks
	_handle_joysticks(joypad)

Gérer les gâchettes (LT et RT)

func _handle_triggers(joypad):
var lt_trigger = Input.get_joy_axis(joypad, 4) # LT
var rt_trigger = Input.get_joy_axis(joypad, 5) # RT

# Normalisation pour Android (LT/RT Ă  0.5 au repos)
if is_android:
	lt_trigger = max(0.0, lt_trigger - 0.5) * 2.0
	rt_trigger = max(0.0, rt_trigger - 0.5) * 2.0
else:
	lt_trigger = (lt_trigger + 1.0) / 2.0
	rt_trigger = (rt_trigger + 1.0) / 2.0

# VĂ©rifier les pressions
var lt_is_pressed = lt_trigger >= trigger_deadzone
var rt_is_pressed = rt_trigger >= trigger_deadzone

# DĂ©tection des changements d'Ă©tat
if time_since_last_input >= cooldown:
	if lt_is_pressed and not lt_previous_pressed:
		_toggle_play_pause()
		time_since_last_input = 0.0
	elif rt_is_pressed and not rt_previous_pressed:
		_toggle_play_pause()
		time_since_last_input = 0.0

# Mettre à jour les états précédents
lt_previous_pressed = lt_is_pressed
rt_previous_pressed = rt_is_pressed

GĂ©rer les joysticks (gauche et droit)

func _handle_joysticks(joypad):
var left_joystick = Vector2(Input.get_joy_axis(joypad, 0), Input.get_joy_axis(joypad, 1)) # Joystick gauche
var right_joystick = Vector2(Input.get_joy_axis(joypad, 2), Input.get_joy_axis(joypad, 3)) # Joystick droit

# VĂ©rifier les mouvements des joysticks
if time_since_last_joystick_input >= joystick_input_delay:
	if left_joystick.length() > joystick_deadzone:
		print("Joystick gauche activé :", left_joystick)
		_toggle_play_pause()
		time_since_last_joystick_input = 0.0
	elif right_joystick.length() > joystick_deadzone:
		print("Joystick droit activé :", right_joystick)
		_toggle_play_pause()
		time_since_last_joystick_input = 0.0

Gestion des entrées clavier/souris (ui_accept)

func _input(event):
if event.is_action_pressed(“ui_accept”):
_toggle_play_pause()
elif event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
_toggle_play_pause()

Initialisation

func _ready():
set_button_icon(bouton_play_icon)
audio_player.connect(“finished”, Callable(self, “_on_audio_finished”))

Finally I found the solution by myself so there is no need to help me anymore.

Maybe share the solution, so that when the thread shows up in a search, people don’t lose time reading it for nothing.
Cheers!

1 Like