extends PlayerState class_name AirborneState #base des etats en l'air (Jump, Inair), comme GroundedState pour le sol. Chaque etat enfant ne decrit que ses differences : # - on_air_enter() : ce qui se passe a l'entree (JumpState saute, InairState applique un saut coupe) # - check_apex() : condition pour changer d'etat en l'air (JumpState -> InairState quand le perso commence a descendre) # - handle_input() : les inputs propres a l'etat (saut, relachement du saut...) #le reste est commun : gravite, minuteurs de saut, atterrissage, collision avec un mur, controle en l'air. #---------- cycle de vie ---------- func on_enter() -> void: if player.floor_snap_length != 0.0: player.floor_snap_length = 0.0 #sinon le perso reste colle au sol on_air_enter() func on_air_enter() -> void: pass #---------- boucle ---------- func physics_update(delta : float) -> void: if check_air_transitions(delta): return player.gravity_apply(delta) if handle_input(): return move(delta) func check_air_transitions(delta : float) -> bool: #atterrissage : retour a l'etat au sol correspondant a la derniere allure (marche / course) if player.is_on_floor(): return request_ground_state(player.move_dir != Vector2.ZERO) tick_air_timers(delta) if check_apex(): return true #si active, coupe la vitesse horizontale quand le perso touche un mur if player.is_on_wall() and player.hit_wall_cut_velocity: player.velocity.x = 0.0 player.velocity.z = 0.0 return false func tick_air_timers(delta : float) -> void: if player.jump_cooldown > 0.0: player.jump_cooldown -= delta if player.coyote_jump_cooldown > 0.0: player.coyote_jump_cooldown -= delta func check_apex() -> bool: return false #JumpState surcharge func handle_input() -> bool: return false #Jump et Inair surchargent #---------- controle en l'air ---------- func move(delta : float) -> void: player.move_dir = input.read_move_dir() if !player.move_dir or player.is_on_floor(): return #selon la derniere allure au sol (marche ou course), on choisit la courbe correspondante pour les valeurs en l'air var idx : int = player.locomotion #WALK = 0, RUN = 1 : l'index de la courbe correspondante if idx >= player.in_air_move_speed.size() or idx >= player.in_air_accel.size(): return #courbes non assignees var speed : float = player.in_air_move_speed[idx].sample(player.velocity.length()) var accel : float = player.in_air_accel[idx].sample(player.velocity.length()) accelerate(speed, accel, delta)