princesse/accroche: appuyer contre le mur suffit

Plutôt que d'enfoncer une touche spéciale pour s'accrocher au mur,
utiliser le joystick ainsi que sa direction pour avoir la friction au
mur.

Rajout d'un coyote time permettant d'avoir suffisament d'aisance pour
wall kicker.
This commit is contained in:
Thomas Lavocat
2023-05-08 19:26:17 +02:00
parent 9a1beaa40b
commit 7d7ea8542f
2 changed files with 44 additions and 21 deletions

View File

@@ -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: