Godot-Web-Test/player.gd

57 lines
2.2 KiB
GDScript

extends CharacterBody2D
# Movement parameters
const MAX_SPEED = 200.0 # Maximum horizontal speed of the character
const ACCELERATION = 1500.0 # Normal acceleration rate
const RAPID_ACCELERATION = 8000.0 # Acceleration rate when rapidly changing direction
const GROUND_DECELERATION = 3000.0 # Normal deceleration rate
const RAPID_DECELERATION = 8000.0 # Deceleration rate when rapidly changing direction
const AIR_DECELERATION = 500.0 # Deceleration rate when in the air
const JUMP_FORCE = 500.0 # The force applied when jumping
const GRAVITY = 2000.0 # Gravity force applied each frame
const JUMP_BUFFER_TIME = 0.1 # Time window for the jump buffer (in seconds)
var jump_buffer_timer = 0.0 # Timer for the jump buffer duration
var last_input_direction = 0 # Stores the last horizontal input direction
func _physics_process(delta):
# Update the jump buffer timer
if jump_buffer_timer > 0:
jump_buffer_timer -= delta
# Horizontal Movement Input
var input_direction = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
# Rapid Direction Change Detection
var is_rapid_change = input_direction != 0 and sign(input_direction) != sign(last_input_direction)
last_input_direction = input_direction if input_direction != 0 else last_input_direction
# Horizontal Movement Logic
if input_direction != 0:
# Apply rapid acceleration if changing direction quickly, otherwise normal acceleration
var acceleration = RAPID_ACCELERATION if is_rapid_change else ACCELERATION
velocity.x += acceleration * input_direction * delta
velocity.x = clamp(velocity.x, -MAX_SPEED, MAX_SPEED)
elif velocity.x != 0:
# Apply rapid deceleration if changing direction quickly, otherwise normal or air deceleration
var decel = RAPID_DECELERATION if is_rapid_change else ( GROUND_DECELERATION if is_on_floor() else AIR_DECELERATION)
decel *= delta
velocity.x -= decel * sign(velocity.x)
if abs(velocity.x) <= decel:
velocity.x = 0
# Jump Input Handling
if Input.is_action_just_pressed("ui_accept"):
jump_buffer_timer = JUMP_BUFFER_TIME
# Jumping Logic
if jump_buffer_timer > 0 and is_on_floor():
velocity.y = -JUMP_FORCE
jump_buffer_timer = 0
# Gravity Application
velocity.y += GRAVITY * delta
# Character Movement
move_and_slide()