princesse: kick mural activé

La princesse peut kicker depuis le mur! Sans pour autant que ça lui
donne la capacité de remonter au mur, en kickant elle tombe
progressivement vers le bas. Le joueur ne peut rien y faire.
This commit is contained in:
Thomas Lavocat
2023-04-29 20:26:32 +02:00
parent 4411cf825e
commit 976059c134

View File

@@ -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()