batrix/scripts/player/player_movement.gd

51 lines
1.5 KiB
GDScript

class_name PlayerMovement
extends RefCounted
@export var _move_speed: float = 10
@export var _move_acceleration: float = 100
@export var _move_deceleration: float = 50
@export var _fall_speed: float = 20
@export var _fall_acceleration: float = 25
var move_input: Vector2
var _move_direction: Vector3
func movement(
velocity: Vector3, delta: float, is_on_floor: bool, can_move: bool
) -> Vector3:
velocity = _lateral_movement(velocity, delta, can_move)
velocity = _vertical_movement(velocity, delta, is_on_floor)
return velocity
func _lateral_movement(velocity: Vector3, delta: float, can_move: bool) -> Vector3:
move_input = Input.get_vector("move_left", "move_right", "move_up", "move_down")
if move_input.length() > 0 and can_move:
_move_direction = Vector3(move_input.x, 0, move_input.y).normalized().rotated(
Vector3.UP, Referencer.main_camera.rotation.y
)
var new_velocity := _move_direction * _move_speed
new_velocity.y = velocity.y
velocity = velocity.move_toward(new_velocity, _move_acceleration * delta)
else:
var new_velocity := Vector3.ZERO
new_velocity.y = velocity.y
velocity = velocity.move_toward(new_velocity, _move_deceleration * delta)
return velocity
func _vertical_movement(velocity: Vector3, delta: float, is_on_floor: bool) -> Vector3:
if not is_on_floor:
var new_velocity := velocity
new_velocity.y = -_fall_speed
velocity = velocity.move_toward(new_velocity, _fall_acceleration * delta)
else:
velocity.y = 0
return velocity