extends AirborneState class_name InairState @export var jump_buffer_time : float = 0.15 #appui sur saut juste avant d'atterrir : le saut part a l'atterrissage si l'appui date de moins de ce delai (en secondes) var _buffer_id : int = 0 #identifie le dernier appui bufferise, pour ne pas qu'un ancien minuteur annule un appui plus recent func on_air_enter() -> void: #saut coupe (bouton relache pendant la montee, voir JumpState) : on freine la montee, une seule fois if player.has_cut_jump: player.has_cut_jump = false if player.velocity.y > 0.0: player.velocity.y *= player.jump_cut_multiplier func handle_input() -> bool: if !input.jump_pressed(): return false #coyote jump : on vient de quitter le sol sans sauter, le saut reste permis un court instant #saut en l'air : il en reste (nb_jumps_in_air_allowed) var coyote : bool = player.coyote_jump_cooldown > 0.0 if coyote or player.nb_jumps_in_air_allowed > 0: player.coyote_jump_on = coyote #lu par JumpState.jump() : le coyote jump ne consomme pas de saut en l'air if request_transition(States.JUMP): return true player.coyote_jump_on = false #saut refuse (ex : etat bloque) : on ne laisse pas le drapeau traƮner return false buffer_jump() #plus de saut possible : on garde l'appui un instant pour l'atterrissage return false func buffer_jump() -> void: #jump_buff_on est consomme par GroundedState a l'atterrissage (-> JumpState). Il est retire apres jump_buffer_time #quel que soit l'etat dans lequel on se trouve, d'ou le minuteur du SceneTree et pas un compteur dans physics_update player.jump_buff_on = true _buffer_id += 1 var id : int = _buffer_id await get_tree().create_timer(jump_buffer_time).timeout if id == _buffer_id: player.jump_buff_on = false