diff --git a/princesse.gd b/princesse.gd index cbe4e10..07e760c 100644 --- a/princesse.gd +++ b/princesse.gd @@ -25,18 +25,19 @@ var DASH_SPEED = WALKING_SPEED * 2 @export var X_SPEED_DECEL = [0, 0.1, 0.6, 1] @export var FALL_SPEED_TABLE = [0, 0.1, 0.15, 0.2, 0.3, 0.6, 0.9, 1] @export var JUMP_SPEED_TABLE = [0, 0.1, 0.2, 0.5, 0.6, 0.7, 0.8, 0.9, 1] -@export var KICK_SPEED_TABLE = [0.6, 0.7, 0.8, 0.9, 1, 1, 1, 1, 1, 1] +@export var KICK_SPEED_TABLE = [0.6, 0.7, 0.8, 0.9, 1, 1, 1, 1, 1, 1, 1] @export var DASH_SPEED_TABLE = [0.5, 0.6, 0.7, 0.8, 0.9, 1, 1, 1, 1, 1, 2, 2, 2] # Nombre d'incrément à rajouter lorsque la touche de saut est maintenue @export var JUMPING_COUNTER_REFILL = 2 # Tous les combien d'incréments rajouter un refill sur le compteur @export var JUMPING_KEY_COUNTER_THRESHOLD = 3 -@export var KICK_JUMP_LIMITER = 0.75 +@export var KICK_JUMP_LIMITER = 0.65 # Nombre de frames coyote durant lesquelle le joueur peut encore sauter # sans encore être au sol -@export var COYOTE_LENGTH := 15 +@export var COYOTE_LENGTH := 5 +@export var COYOTE_GRAB_LENGTH := 15 # Différence de vitesse de ralentissement entre le sol et l'air @export var WALK_INCR_GROUND : int = 1 @@ -75,11 +76,14 @@ var kick_direction : int = 1 # Coyote time var coyote_ground = [] +var coyote_grab = [] # variable d'état relative à la gravité var falling_step : int = -1 # Où en est la princess dans son acceleration de chute ? # Variables d'état relative à l'accroche au mur +var pressing_wall_left = false # Princesse est elle en contact avec un mur à gauche? +var pressing_wall_right = false # Princesse est elle en contact avec un mur droite ? var pressing_wall = false # Princesse est elle en contact avec un mur ? var grab_wall = false # Je joueur veut-il et peut-il s'accrocher au mur ? @@ -290,7 +294,7 @@ func choose_animation_orientation() -> void: else: animation.scale.x = -1.0 - if grab_wall: + if get_coyote(coyote_grab): if wall_detect_left.is_colliding(): animation.scale.x = 1 elif wall_detect_right.is_colliding(): @@ -327,23 +331,21 @@ func read_input() -> void: if locked: return - # Le joueur veut-il et peut-il s'accrocher au mur ? - grab_wall = pressing_wall and Input.is_action_pressed("grab" + action_suffix) - # Le joueur veut-il sauter ou kicker ? if Input.is_action_just_pressed("jump" + action_suffix): # Peut-il sauter ? if ground_far_detect.is_colliding() or (is_on_floor() or get_coyote(coyote_ground)): need_jump=true - # Peut-il kicker ? - if grab_wall: - if not kicking: - kicking=true - kick_step = KICK_SPEED_TABLE.size()-1 - if wall_detect_left.is_colliding(): - kick_direction = 1 - else: - kick_direction = -1 + else: + # Peut-il kicker ? + if get_coyote(coyote_grab): + if not kicking: + kicking=true + kick_step = KICK_SPEED_TABLE.size()-1 + if wall_detect_left.is_colliding(): + kick_direction = 1 + else: + kick_direction = -1 # Dès qu'il peut et veut sauter, déclencher le saut if need_jump and (is_on_floor() or get_coyote(coyote_ground)): need_jump = false @@ -377,8 +379,18 @@ func read_input() -> void: else: if kicking: direction = kick_direction - # Ne pas marcher si on s'accroche au mur - walking = walking and not grab_wall + + # Le joueur veut-il et peut-il s'accrocher au mur ? + if pressing_wall: + grab_wall = ( + (pressing_wall_left and walking and direction == -1) + or + (pressing_wall_right and walking and direction == 1) + ) + else: + grab_wall = false + + walking = walking and not get_coyote(coyote_grab) if Input.is_action_just_pressed("dash" + action_suffix): @@ -432,8 +444,17 @@ func compute_state() -> void: if coyote_ground.size() > COYOTE_LENGTH: coyote_ground.remove_at(0) + # Met à jour une partie de l'état de la princesse + # gestion du coyote time sur le contact au sol + coyote_grab.append(grab_wall) + if coyote_grab.size() > COYOTE_GRAB_LENGTH: + coyote_grab.remove_at(0) + # gestion de l'état de la pression au mur - pressing_wall = not is_on_floor() and (wall_detect_left.is_colliding() or wall_detect_right.is_colliding()) + pressing_wall_left = not is_on_floor() and wall_detect_left.is_colliding() + pressing_wall_right = not is_on_floor() and wall_detect_right.is_colliding() + pressing_wall = pressing_wall_left or pressing_wall_right + func get_new_animation() -> String: # Renvoie la bonne annimation en fonction de l'état de la princesse @@ -446,7 +467,7 @@ func get_new_animation() -> String: animation_new = "idle" else: if velocity.y > 0.0: - if grab_wall: + if get_coyote(coyote_grab): animation_new = "wall_stick" else: if walking_step > 0: diff --git a/princesse.tscn b/princesse.tscn index d955d80..4e279be 100644 --- a/princesse.tscn +++ b/princesse.tscn @@ -262,9 +262,11 @@ collision_mask = 241 slide_on_ceiling = false floor_constant_speed = true script = ExtResource("1_dkp7s") +FALLING_SPEED = 220 JUMPING_SPEED = 230 KICK_JUMP_LIMITER = 0.7 -COYOTE_LENGTH = 5 +COYOTE_LENGTH = 7 +COYOTE_GRAB_LENGTH = 10 WALK_INCR_AIR = 4 [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]