diff --git a/princesse.gd b/princesse.gd index 6053646..505650b 100644 --- a/princesse.gd +++ b/princesse.gd @@ -16,14 +16,16 @@ var gravity: int = ProjectSettings.get("physics/2d/default_gravity") # Constantes de déplacement à pimper dans l'inspecteur # ################################################################################ -@export var WALKING_SPEED = 400 -@export var FALLING_SPEED = 400 -@export var JUMPING_SPEED = 400 +@export var WALKING_SPEED = 155 +@export var FALLING_SPEED = 230 +@export var JUMPING_SPEED = 220 +var DASH_SPEED = WALKING_SPEED * 2 @export var X_SPEED_TABLE = [0, 0.1, 0.15, 0.2, 0.3, 0.6, 0.9, 1] @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 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 @@ -76,6 +78,12 @@ var falling_step : int = -1 # Où en est la princess dans son acceleration de ch 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 ? +# Variables d'état relative au dash +var dashing : bool = false +var dash_step : int = -1 +var dash_direction_x : int = 1 +var dash_direction_y : int = 1 + ################################################################################ # # Gestion d'avec quoi Princesse collisionne @@ -93,7 +101,7 @@ func init_walk_state(): func walk(direction:int) -> float: # Fait marcher le personnage. - if kicking: + if kicking or dashing: init_walk_state() return velocity.x @@ -185,7 +193,7 @@ func walk(direction:int) -> float: func fall() -> float: # fait tomber princesse - if jumping or kicking: + if jumping or kicking or dashing: falling_step = -1 return velocity.y if is_on_floor_only(): @@ -210,7 +218,7 @@ func fall() -> float: func jump() -> float: # fait sauter princesse - if not jumping or kicking: + if not jumping or kicking or dashing: return velocity.y if not is_on_ceiling() and jump_key_counter > 0 and jump_key_counter % JUMPING_KEY_COUNTER_THRESHOLD == 0: @@ -226,24 +234,51 @@ func jump() -> float: end_jump() return velocity.y +func end_jump(): + # termine le saut de Princesse + jumping = false + jumping_step = -1 + jump_key_counter = 0 + func kick() -> void: - # fait sauter princesse - if not kicking: + # 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: kick_step = -1 kicking=false + velocity.rotated(0) + +func dash() -> void: + # fait dasher la princesse + if not dashing: + return + + if dash_step >= 0: + dash_step -= 1 + var doubley = 1 + var doublex = 1 + if abs(dash_direction_y) and not abs(dash_direction_x): + doubley=1.1 + if abs(dash_direction_x) and not abs(dash_direction_y): + doublex=1.1 + velocity.y = DASH_SPEED_TABLE[dash_step] * DASH_SPEED * dash_direction_y * doubley + velocity.x = DASH_SPEED_TABLE[dash_step] * DASH_SPEED * dash_direction_x * doublex + else: + cancel_dash() + +func cancel_dash() -> void: + dash_step = -1 + dashing=false -func end_jump(): - # termine le saut de Princesse - jumping = false - jumping_step = -1 - jump_key_counter = 0 func choose_animation_orientation() -> void: # Oriente l'animation correctement en fonction de laquelle on joue et de @@ -277,7 +312,8 @@ func move_and_handle_collisions() -> void: layer_of_collision = PhysicsServer2D.body_get_collision_layer(tile_rid) if layer_of_collision == PICS_BLOCK_LAYER: get_tree(). reload_current_scene() - + if dashing and not is_on_floor(): + cancel_dash() func get_coyote(table: Array): var result = false @@ -339,6 +375,34 @@ func read_input() -> void: if kicking: direction = kick_direction + if Input.is_action_just_pressed("dash" + action_suffix): + if not dashing: + dashing = true + dash_step = DASH_SPEED_TABLE.size()-1 + var axis_x = Input.get_axis( + "move_left" + action_suffix, + "move_right" + action_suffix + ) + if not is_zero_approx(axis_x): + if axis_x < 0: + dash_direction_x = -1 + else: + dash_direction_x = 1 + else: + dash_direction_x = 0 + var axis_y = Input.get_axis( + "move_up" + action_suffix, + "move_down" + action_suffix + ) + if not is_zero_approx(axis_y): + if axis_y < 0: + dash_direction_y = -1 + else: + dash_direction_y = 1 + else: + dash_direction_y = 0 + print("dash x", axis_x, "y", axis_y) + func compute_state() -> void: # Met à jour une partie de l'état de la princesse # gestion du coyote time sur le contact au sol @@ -378,6 +442,7 @@ func _physics_process(delta: float) -> void: velocity.y = fall() velocity.x = walk(direction) kick() + dash() move_and_handle_collisions() play_animation() diff --git a/princesse.tscn b/princesse.tscn index 806bf32..6b7e86b 100644 --- a/princesse.tscn +++ b/princesse.tscn @@ -204,9 +204,6 @@ collision_mask = 113 slide_on_ceiling = false floor_constant_speed = true script = ExtResource("1_dkp7s") -WALKING_SPEED = 155 -FALLING_SPEED = 230 -JUMPING_SPEED = 220 KICK_JUMP_LIMITER = 0.7 COYOTE_LENGTH = 5 WALK_INCR_AIR = 4 diff --git a/project.godot b/project.godot index b07ef8e..8506cc9 100644 --- a/project.godot +++ b/project.godot @@ -39,7 +39,7 @@ move_left={ , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null) ] } -crouch={ +move_down={ "deadzone": 0.5, "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":0,"key_label":4194322,"unicode":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":12,"pressure":0.0,"pressed":true,"script":null)