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”))