diff --git a/princesse.gd b/princesse.gd index 1c83a4e..709f538 100644 --- a/princesse.gd +++ b/princesse.gd @@ -32,7 +32,7 @@ var DASH_SPEED = WALKING_SPEED * 2 @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.5, 0.6, 0.7, 0.8, 0.9, 1, 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] +@export var DASH_SPEED_TABLE = [0.5, 0.6, 0.7, 0.8, 0.9, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3] # Nombre d'incrément à rajouter lorsque la touche de saut est maintenue @export var JUMPING_COUNTER_REFILL = 2 @@ -154,8 +154,10 @@ func init_walk_state(): init_decel = false func walk(direction:int) -> float: - # Fait marcher le personnage. - if kicking or dashing: + # Fait marcher le personnage + + # Le personnage ne se déplace pas dans les cas suivants: + if kicking or kicking or dashing or get_coyote(coyote_grab): init_walk_state() return velocity.x @@ -257,7 +259,7 @@ func walk(direction:int) -> float: func fall() -> float: # fait tomber princesse if jumping or kicking or dashing: - falling_step = -1 + stop_fall() return velocity.y var intertia = 0 if velocity.y < 0: @@ -276,7 +278,7 @@ func fall() -> float: falling_step = -1 return velocity.y else: - if grab_wall and not crouch: + if get_coyote(coyote_grab) and not crouch: falling_step = max(falling_step-1, 1) else: if intertia < 0 and intertia + FALL_SPEED_TABLE[falling_step] * FALLING_SPEED >0: @@ -284,6 +286,9 @@ func fall() -> float: falling_step = min(falling_step+1, FALL_SPEED_TABLE.size()-1) return intertia + FALL_SPEED_TABLE[falling_step] * FALLING_SPEED +func stop_fall() -> void: + falling_step = -1 + func jump() -> float: # fait sauter princesse if not jumping or kicking or dashing: @@ -311,26 +316,25 @@ func end_jump(): func kick() -> void: # fait kicker la princesse if not kicking or dashing: - kick_step -= 1 - kicking = false return if kick_step > 0: kick_step -= 1 velocity.y = KICK_SPEED_TABLE[kick_step] * JUMPING_SPEED * -1 * KICK_JUMP_LIMITER velocity.x = KICK_SPEED_TABLE[kick_step] * WALKING_SPEED * kick_direction - velocity.rotated(45) else: + cancel_kick() + +func cancel_kick() -> void: kick_step = -1 kicking=false - velocity.rotated(0) func dash() -> void: # fait dasher la princesse if not dashing: return - if dash_step >= 0: + if dash_step > 0: dash_step -= 1 velocity.y = DASH_SPEED_TABLE[dash_step] * DASH_SPEED * dash_direction_y velocity.x = DASH_SPEED_TABLE[dash_step] * DASH_SPEED * dash_direction_x @@ -365,6 +369,11 @@ func play_animation() -> void: animation.play() func move_and_handle_collisions() -> void: + if kicking or dashing: + end_jump() + if dashing: + cancel_kick() + # Bouge Princesse et réagis aux éléments avec lesquels elle rentre en collision move_and_slide() for i in get_slide_collision_count(): @@ -391,7 +400,7 @@ func read_input() -> void: # Le joueur veut-il sauter ou kicker ? if Input.is_action_just_pressed("jump" + action_suffix): # Peut-il sauter ? - if collide_ground_far_detect or (is_on_floor() or get_coyote(coyote_ground)): + if not kicking and collide_ground_far_detect or (is_on_floor() or get_coyote(coyote_ground)): need_jump=true else: need_jump=false @@ -399,14 +408,12 @@ func read_input() -> void: if get_coyote(coyote_grab): if not kicking: kicking=true + coyote_grab = [false] kick_step = KICK_SPEED_TABLE.size()-1 - if grab_wall: - if pressing_wall_left: - kick_direction = 1 - else: - kick_direction = -1 + if pressing_wall_left: + kick_direction = 1 else: - kick_direction = direction + 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 @@ -461,16 +468,21 @@ func read_input() -> void: (pressing_wall_right and direction == 1) ) ) + else: + # Désactivation du grab wall + if walking: + if pressing_wall_left and direction == 1: + grab_wall = false + if pressing_wall_right and direction == -1: + grab_wall = false + if kicking or dashing: + grab_wall = false else: grab_wall = false if Input.is_action_just_pressed("dash" + action_suffix): if not dashing and available_dashs > 0: - Input.start_joy_vibration(0, 1, 0.5, 0.2) - available_dashs -=1 - dashing = true - dash_fart.emit() var axis_x = Input.get_axis( "move_left" + action_suffix, "move_right" + action_suffix @@ -485,17 +497,7 @@ func read_input() -> void: else: dash_direction_x = 1 else: - # Si le joueur tient le mur, alors, il ne faut pas dasher dans - # dans le mur en cas de dash - if grab_wall: - direction = -direction - # Si le joueur n'appuye sur rien, alors dasher en avant par - # défaut - dash_direction_x = direction - # Si le joueur spécifie une commande, alors, ne pas supposer - # Qu'il veuille aller en avant - if not is_zero_approx(axis_y): - dash_direction_x = 0 + dash_direction_x = 0 if not is_zero_approx(axis_y): if axis_y < 0: dash_direction_y = -1 @@ -503,12 +505,19 @@ func read_input() -> void: dash_direction_y = 1 else: dash_direction_y = 0 - # Limiter le dash en diagonnale car sinon il est trop grand - # par rapport à un dash dans une seule direction - if dash_direction_x and dash_direction_y: - dash_step = DASH_SPEED_TABLE.size()-3 - else: - dash_step = DASH_SPEED_TABLE.size()-1 + + # Ne dasher que si une direction est donnée avec le joystick + if dash_direction_x or dash_direction_y: + Input.start_joy_vibration(0, 1, 0.5, 0.2) + available_dashs -=1 + dashing = true + dash_fart.emit() + # Limiter le dash en diagonnale car sinon il est trop grand + # par rapport à un dash dans une seule direction + if dash_direction_x and dash_direction_y: + dash_step = DASH_SPEED_TABLE.size()-2 + else: + dash_step = DASH_SPEED_TABLE.size()-1 func compute_state() -> void: collide_ground_far_detect = ground_far_detect.is_colliding() or ground_far_detect2.is_colliding() @@ -541,7 +550,6 @@ func compute_state() -> void: ) 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 var animation_new: String @@ -572,8 +580,6 @@ func _physics_process(_delta: float) -> void: velocity.y = jump() velocity.y = fall() velocity.x = walk(direction) - if grab_wall: - velocity.x *= 0.3 kick() dash() move_and_handle_collisions() diff --git a/princesse.tscn b/princesse.tscn index 650d928..804fb0c 100644 --- a/princesse.tscn +++ b/princesse.tscn @@ -434,7 +434,7 @@ script = ExtResource("1_dkp7s") JUMPING_SPEED = 230 KICK_JUMP_LIMITER = 0.75 COYOTE_LENGTH = 7 -COYOTE_GRAB_LENGTH = 4 +COYOTE_GRAB_LENGTH = 20 WALK_INCR_AIR = 4 [node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]