diff --git a/princesse.gd b/princesse.gd index d7af78b..37045fe 100644 --- a/princesse.gd +++ b/princesse.gd @@ -23,7 +23,7 @@ var gravity: int = ProjectSettings.get("physics/2d/default_gravity") @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, 0.2, 0.4, 0.6, 1, 1.6, 2.4, 3] +@export var KICK_SPEED_TABLE = [0.6, 0.7, 0.8, 0.9, 1, 1, 1, 1, 1, 1] # Nombre d'incrément à rajouter lorsque la touche de saut est maintenue @export var JUMPING_COUNTER_REFILL = 2 @@ -59,6 +59,11 @@ var need_jump : bool = false # Le joueur veut-il sauter et peut il ? var jumping_step : int = -1 # Où en est la princesse dans son tableau d'accel var jump_key_counter : int = 0 # Où en est-on du refil ? +# variables d'état relatives au kick mural +var kicking : bool = false +var kick_step : int = -1 +var kick_direction : int = 1 + # Coyote time var coyote_ground = [] @@ -80,6 +85,8 @@ const CHEESE_LAYER = 1 << (6 - 1) # collision layer 7 -> fromages var layer_of_collision = null func walk(direction:int) -> float: + if kicking: + return velocity.x # Fait marcher le personnage. # Si le personnage est dans l'air, il aura une friction plus faible lors de @@ -109,24 +116,16 @@ func walk(direction:int) -> float: # X_SPEED_TABLE pour l'accélération # X_SPEED_DECEL pour la décélération var table = X_SPEED_TABLE - if walking: - walking_step = min(walking_step+1, X_SPEED_TABLE.size() -1) - init_decel = true - else: - # Lors de la première frame de la décélération, initialiser la valeur - # du compteur d'incrément en haut du tableau de décélération + if not walking: table = X_SPEED_DECEL - if init_decel: - walking_step = min(walking_step, X_SPEED_DECEL.size() - 1) - init_decel = false # dans le cas où le personnage est propulsé par une force extérieure et - # qu'il n'y a pas d'input du joueur pour permettre au personnage de ralentir - # il va bien falloir s'y coller, sinon, il va glisser indéfiniment. + # qu'il n'y a pas d'input du joueur. Lorsque le joueur va vouloir reprendre + # la main, il faut démarrer à la bonne vélocité var abs_v_x = abs(velocity.x) if abs_v_x != 0 and walking_step == -1: # trouver l'indice le plus proche de la vitesse courante - for index in range(0, X_SPEED_DECEL.size()-1): + for index in range(0, table.size()-1): var speed_i = table[walking_step] * WALKING_SPEED var speed_i1 = table[walking_step+1] * WALKING_SPEED # lorsque l'on a trouvé l'indice le bon endroit dans le tableau, alors @@ -135,7 +134,19 @@ func walk(direction:int) -> float: walking_step = index+1 # si rien n'est trouvé, alors on initialise l'indice au maximum possible if walking_step == -1: - walking_step = X_SPEED_DECEL.size() - 1 + walking_step = table.size() - 1 + + if walking: + walking_step = min(walking_step+1, X_SPEED_TABLE.size() -1) + init_decel = true + else: + # Lors de la première frame de la décélération, initialiser la valeur + # du compteur d'incrément en haut du tableau de décélération + if init_decel: + walking_step = min(walking_step, X_SPEED_DECEL.size() - 1) + init_decel = false + + # Si le compteur d'incrément est supérieur ou égal à zéro, c'est qu'il # faut bouger, donc il est nécéssaire en premier temps de récupérer la vitesse @@ -159,7 +170,7 @@ func walk(direction:int) -> float: func fall() -> float: # fait tomber princesse - if jumping: + if jumping or kicking: falling_step = -1 return velocity.y if is_on_floor_only(): @@ -184,7 +195,7 @@ func fall() -> float: func jump() -> float: # fait sauter princesse - if not jumping: + if not jumping or kicking: return velocity.y if not is_on_ceiling() and jump_key_counter > 0 and jump_key_counter % JUMPING_KEY_COUNTER_THRESHOLD == 0: @@ -200,6 +211,19 @@ func jump() -> float: end_jump() return velocity.y +func kick() -> void: + # fait sauter princesse + if not kicking: + return + + if kick_step > 0: + kick_step -= 1 + velocity.y = KICK_SPEED_TABLE[kick_step] * JUMPING_SPEED * -1 * 0.5 + velocity.x = KICK_SPEED_TABLE[kick_step] * WALKING_SPEED * kick_direction + else: + kick_step = -1 + kicking=false + func end_jump(): # termine le saut de Princesse jumping = false @@ -245,11 +269,21 @@ func read_input() -> void: # 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 ? + + # 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 coyote_ground[0]): 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 # Dès qu'il peut et veut sauter, déclencher le saut if need_jump and (is_on_floor() or coyote_ground[0]): need_jump = false @@ -263,21 +297,26 @@ func read_input() -> void: jump_key_counter += 1 else: jump_key_counter = 0 + # Le joueur veut-il marcher ? walking = ( Input.is_action_pressed("move_left" + action_suffix) or - Input.is_action_pressed("move_right" + action_suffix) + Input.is_action_pressed("move_right" + action_suffix) ) # Calculer dans quelle direction il veut marcher - var axis = Input.get_axis( - "move_left" + action_suffix, - "move_right" + action_suffix - ) - if not is_zero_approx(axis): - if axis < 0: - direction = -1 - else: - direction = 1 + if walking: + var axis = Input.get_axis( + "move_left" + action_suffix, + "move_right" + action_suffix + ) + if not is_zero_approx(axis): + if axis < 0: + direction = -1 + else: + direction = 1 + else: + if kicking: + direction = kick_direction func compute_state() -> void: # Met à jour une partie de l'état de la princesse @@ -287,7 +326,7 @@ func compute_state() -> void: coyote_ground.remove_at(0) # gestion de l'état de la pression au mur - pressing_wall = wall_detect_left.is_colliding() or wall_detect_right.is_colliding() + pressing_wall = not is_on_floor() and (wall_detect_left.is_colliding() or wall_detect_right.is_colliding()) func _physics_process(delta: float) -> void: @@ -297,6 +336,9 @@ func _physics_process(delta: float) -> void: velocity.y = jump() velocity.y = fall() velocity.x = walk(direction) + if not is_zero_approx(velocity.x): + print(" walk velocity ", velocity.x ) + kick() move_and_handle_collisions()