Reproductible et à pas fixe. Toujours le même temps pour accélérer et décélérer. Si c'est pas beau ça!
107 lines
3.5 KiB
GDScript
107 lines
3.5 KiB
GDScript
extends CharacterBody2D
|
|
|
|
## The player listens for input actions appended with this suffix.[br]
|
|
## Used to separate controls for multiple players in splitscreen.
|
|
@export var action_suffix := ""
|
|
|
|
var gravity: int = ProjectSettings.get("physics/2d/default_gravity")
|
|
@onready var platform_detector := $PlatformDetector as RayCast2D
|
|
@onready var animation := $AnimatedSprite2D as AnimatedSprite2D
|
|
@onready var animation_player := $AnimationPlayer as AnimationPlayer
|
|
@onready var camera := $Camera2D as Camera2D
|
|
var _double_jump_charged := false
|
|
|
|
@export var WALKING_SPEED = 400
|
|
@export var X_SPEED_TABLE = [0, 0.1, 0.15, 0.2, 0.3, 0.6, 0.9, 1]
|
|
@export var X_SPEED_DECEL = [0, 0.1, 0.6, 1]
|
|
@export var X_SPEED_AIR_DECEL =[0, 0.2, 0.6, 0.8, 0.9, 0.9, 1,
|
|
1.1, 1.1, 1.1, 1.2, 1.2, 1.2,
|
|
1.2, 1.2, 1.3, 1.4, 1.5, 1.6,
|
|
1.8, 1.9, 3]
|
|
@export var FALL_SPEED_TABLE = [0, 0.4]
|
|
@export var JUMP_SPEED_TABLE = [0, 0.4, 0.8, 1.2, 1.6, 2, 2.4, 2.8, 3, 3, 4, 5]
|
|
@export var KICK_SPEED_TABLE = [0, 0.2, 0.4, 0.6, 1, 1.6, 2.4, 3]
|
|
|
|
|
|
# Nombre d'inréments composant un saut
|
|
@export var JUMPING_COUNTER = 20
|
|
# 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
|
|
|
|
# Nombre de frames coyote durant lesquelle le joueur peut encore sauter
|
|
# sans encore être au sol
|
|
@export var COYOTE_LENGTH := 20
|
|
|
|
var walking : bool = false
|
|
var walking_step: int = -1
|
|
var init_decel: bool = true
|
|
|
|
func walk(direction:int) -> int:
|
|
var table = X_SPEED_TABLE
|
|
if walking:
|
|
walking_step = min(walking_step+1, table.size() -1)
|
|
init_decel = true
|
|
else:
|
|
table = X_SPEED_DECEL
|
|
if init_decel:
|
|
walking_step = min(walking_step, table.size() - 1)
|
|
init_decel = false
|
|
|
|
if walking_step > 0:
|
|
var speed = table[walking_step] * WALKING_SPEED
|
|
if not walking:
|
|
walking_step-=1
|
|
return speed * direction
|
|
return 0
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if Input.is_action_just_pressed("jump" + action_suffix):
|
|
pass
|
|
elif Input.is_action_just_released("jump" + action_suffix) and velocity.y < 0.0:
|
|
# The player let go of jump early, reduce vertical momentum.
|
|
pass
|
|
# Fall.
|
|
velocity.y = minf(400, velocity.y + gravity * delta)
|
|
|
|
walking = Input.is_action_pressed("move_left" + action_suffix) or Input.is_action_pressed("move_right" + action_suffix)
|
|
velocity.x = walk(
|
|
Input.get_axis(
|
|
"move_left" + action_suffix,
|
|
"move_right" + action_suffix
|
|
)
|
|
)
|
|
|
|
if not is_zero_approx(velocity.x):
|
|
if velocity.x > 0.0:
|
|
animation.scale.x = 1.0
|
|
else:
|
|
animation.scale.x = -1.0
|
|
|
|
floor_stop_on_slope = not platform_detector.is_colliding()
|
|
move_and_slide() # Character is colliding
|
|
|
|
var anim := get_new_animation(false)
|
|
if anim != animation.animation:
|
|
animation.animation = anim
|
|
animation.play()
|
|
|
|
|
|
func get_new_animation(is_shooting := false) -> String:
|
|
var animation_new: String
|
|
if is_on_floor():
|
|
if walking_step > 0:
|
|
animation_new = "walk"
|
|
else:
|
|
animation_new = "idle"
|
|
else:
|
|
if velocity.y > 0.0:
|
|
if walking_step > 0:
|
|
animation_new = "falling_diagonals"
|
|
else:
|
|
animation_new = "falling_straight"
|
|
else:
|
|
animation_new = "jumping"
|
|
return animation_new
|