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:
61
princesse.gd
61
princesse.gd
@@ -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:
|
||||
|
||||
@@ -262,9 +262,11 @@ collision_mask = 241
|
||||
slide_on_ceiling = false
|
||||
floor_constant_speed = true
|
||||
script = ExtResource("1_dkp7s")
|
||||
FALLING_SPEED = 220
|
||||
JUMPING_SPEED = 230
|
||||
KICK_JUMP_LIMITER = 0.7
|
||||
COYOTE_LENGTH = 5
|
||||
COYOTE_LENGTH = 7
|
||||
COYOTE_GRAB_LENGTH = 10
|
||||
WALK_INCR_AIR = 4
|
||||
|
||||
[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="."]
|
||||
|
||||
Reference in New Issue
Block a user