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:
98
princesse.gd
98
princesse.gd
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user