51 lines
1.5 KiB
GDScript
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
|