arcadetrucker/scripts/player.gd

56 lines
1.6 KiB
GDScript

extends CharacterBody3D
@export var acceleration: float = 5.0
@export var brake_intensity: float = 3.0
@export var strafe_speed: float = 10.0 # Speed for sideways movement
@export var gravity: float = 9.8
@export var max_speed: float = 30.0
var current_speed: float = 0.0
func _physics_process(delta: float) -> void:
# Apply gravity
if not is_on_floor():
velocity.y -= gravity * delta
# Get input direction
var input_forward = Input.get_action_strength("move_forward") - Input.get_action_strength("move_backward")
var input_strafe = Input.get_action_strength("turn_left") - Input.get_action_strength("turn_right")
# Handle acceleration and braking
if input_forward > 0:
# Accelerate forward
current_speed = move_toward(current_speed, max_speed, acceleration * delta)
elif input_forward < 0:
# Accelerate backward
current_speed = move_toward(current_speed, -max_speed / 2, acceleration * delta)
else:
# No input, gradually slow down
current_speed = move_toward(current_speed, 0, brake_intensity * delta)
# Get the forward and right vectors
var forward_direction = -global_transform.basis.z
var side_direction = global_transform.basis.x
# Calculate forward movement
var forward_movement = Vector3(
forward_direction.x * current_speed,
0,
forward_direction.z * current_speed
)
# Calculate strafe movement (sideways)
var strafe_movement = Vector3(
side_direction.x * input_strafe * strafe_speed,
0,
side_direction.z * input_strafe * strafe_speed
)
# Combine movements
var total_movement = forward_movement + strafe_movement
# Apply to velocity
velocity.z = total_movement.x
velocity.x = total_movement.z
move_and_slide()