déplacement: décélération en changement de direction

Le personnage doit perdre en vélocité sur l'axe précédant lorsque
le jour demande de changer de direction pour avoir un effet smooth
de déplacement.

La stratégie choisie consite à détecter qu'un changement de direction
est en cours puis de remettre l'index d'accélération à son état
d'initialisation et de laisser accélérer le personnage classiquement.

Sauf que lorsque l'on va calculer sa vitesse, l'on va rajouter la
vélocité déjà présente ce qui aura pour effet de smoother tout ça.
This commit is contained in:
Thomas Lavocat
2023-04-29 14:59:07 +02:00
parent 07369a7ebf
commit 66293d6bb2

View File

@@ -37,7 +37,8 @@ var walking_step: int = -1
@export var WALK_INCR_GROUND : int = 1
@export var WALK_INCR_AIR : int = 3
var walk_incr_reserve : int = 0
var init_decel: bool = false
var init_decel: bool = true
var init_direction_change = true
# variables d'état relatives au saut
var jumping : bool = false
@@ -66,6 +67,17 @@ func walk(direction:int) -> float:
if is_on_wall():
walking_step = min(walking_step, 1)
# Un changement de direction implique de perdre la vélocité dans la direction
# précédente avant de repartir dans la direction que l'on veut.
# ça ne change rien pour le nombre de frames nécéssaires pour accélérer dans
# tous les cas. Mais le feeling est meilleur.
var direction_change: bool = (direction > 0 and velocity.x < 0) or (direction < 0 and velocity.x > 0)
if direction_change:
if init_direction_change:
init_direction_change = false
walking_step = -1
else:
init_direction_change = true
# Si le joueur décide de marcher alors, le compteur de pas doit s'incrémenter
# Si le joueur ne veut plus marcher, alors, le compteur de pas décrémente
@@ -97,7 +109,11 @@ func walk(direction:int) -> float:
if walk_incr_reserve >= threshold:
walk_incr_reserve = 0
walking_step-=1
return speed * direction
if direction_change and walking:
# dans le cas du changement de direction,
return speed * direction + velocity.x
else:
return speed * direction
return velocity.x