-extends CharacterBody3D
+class_name Player extends CharacterBody3D
-@onready var _skin: Node3D = $skin
+# class variables
+@export_category("Movement")
+@export var _walk_speed := 5.0
+@export var _jump_speed := 9.0
+@export var _fall_speed := 2.0
+@export var _locked_z := true
+@export_category("Camera")
+@export var _camera_distance := 5.0
+@export var _dof_blur_far_distance := 5.0
+@export var _camera_pivot_rotate_y := 0.0
-const SPEED = 5.0
-const JUMP_VELOCITY = 4.5
+
+var _last_movement_direction := Vector3.RIGHT
+@onready var _skin: KnightSkin = $skin
+@onready var _camera_pivot: Node3D = $"camera-pivot"
+@onready var _spring_arm: SpringArm3D = $"camera-pivot/SpringArm3D"
+@onready var _camera: Camera3D = $"camera-pivot/SpringArm3D/Camera3D"
+@onready var _camera_attr: CameraAttributes = _camera.attributes
+
+
+# inherited functions
+func _ready() -> void:
+ _spring_arm.spring_length = _camera_distance
+ _camera_attr.dof_blur_far_distance = _dof_blur_far_distance
+ _camera_pivot.rotate_y(_camera_pivot_rotate_y)
+
+
+func _input(event: InputEvent) -> void:
+ if event.is_action_released("player-jump"):
+ if velocity.y > 0:
+ velocity.y = 0
+ elif event.is_action_pressed("player-attack"):
+ _skin.attack()
func _physics_process(delta: float) -> void:
# Add the gravity.
if not is_on_floor():
- velocity += get_gravity() * delta
+ velocity += get_gravity() * _fall_speed * delta
+ _process_player_input(delta)
+ _process_player_skin(delta)
+
+ move_and_slide()
+
+
+# my functions
+func _process_player_input(_delta: float) -> void:
# Handle jump.
- if Input.is_action_just_pressed("ui_accept") and is_on_floor():
- velocity.y = JUMP_VELOCITY
+ if Input.is_action_just_pressed("player-jump") and is_on_floor():
+ velocity.y = _jump_speed
# Get the input direction and handle the movement/deceleration.
# As good practice, you should replace UI actions with custom gameplay actions.
- var input_dir := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
- var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
+ var input_dir := Input.get_vector("player-left", "player-right", "player-up", "player-down")
+ var direction := -(transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
+
if direction:
- velocity.x = direction.x * SPEED
- velocity.z = -direction.z * SPEED
+ velocity.x = direction.x * _walk_speed
+ if not _locked_z:
+ velocity.z = direction.z * _walk_speed
+ _last_movement_direction = direction
else:
- velocity.x = move_toward(velocity.x, 0, SPEED)
- velocity.z = move_toward(velocity.z, 0, SPEED)
+ velocity.x = 0
+ velocity.z = 0
- move_and_slide()
+func _process_player_skin(_delta: float) -> void:
+ _skin.global_rotation.y = Vector3.BACK.signed_angle_to(_last_movement_direction, Vector3.UP)
+
if is_on_floor():
- _skin.forward(velocity.length())
- _skin.global_rotation.y = Vector3.FORWARD.signed_angle_to(direction, Vector3.UP)
+ _skin.move(velocity.length())
else:
_skin.fall()