]> Untitled Git - knight.git/blobdiff - player/player.gd
Added head tilting, spike
[knight.git] / player / player.gd
index 1c483fa4bf22e5c99ebf689c90e11c98b77b0a04..6099c08953ca721801f81b09e405f5357077dfd1 100644 (file)
@@ -1,47 +1,84 @@
-extends CharacterBody3D
+class_name Player extends CharacterBody3D
 
 
-@onready var _skin: Node3D = $skin
+# class variables
+@export_category("Movement")
+@export var _walk_speed := 4.0
+@export var _jump_speed := 9.0
+@export var _fall_speed := 2.0
 
+@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 * 3
-const FALL_SPEED = 2.0
 
+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
 
-var _last_movement_direction := Vector3.FORWARD
+
+# 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("ui_accept"):
-               velocity.y = 0
+       if event.is_action_released("player-jump"):
+               if velocity.y > 0:
+                       velocity.y = 0
+       elif event.is_action_pressed("player-attack"):
+               if Input.is_action_pressed("player-up"):
+                       _skin.attack_up()
+                       _last_movement_direction = Vector3.FORWARD
+               elif Input.is_action_pressed("player-down") and not is_on_floor():
+                       _skin.attack_down()
+                       _last_movement_direction = Vector3.FORWARD
+               else:
+                       _skin.attack_neutral()
+       elif event.is_action_pressed("player-up"):
+               _last_movement_direction = Vector3.FORWARD
 
 
 func _physics_process(delta: float) -> void:
        # Add the gravity.
        if not is_on_floor():
-               velocity += get_gravity() * FALL_SPEED * 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()
-       if direction:
-               velocity.x = direction.x * SPEED
-               velocity.z = direction.z * SPEED
+       var input_dir := Input.get_vector("player-left", "player-right", "player-up", "player-down")
+       var direction := -(transform.basis * Vector3(input_dir.x, input_dir.y, 0)).normalized()
+       
+       _skin.head_tilt(direction.y)
+       
+       if direction.x:
+               velocity.x = direction.x * _walk_speed
                _last_movement_direction = direction
        else:
                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.BACK, Vector3.UP)
        if is_on_floor():
-               _skin.forward(velocity.length())
-               _skin.global_rotation.y = Vector3.BACK.signed_angle_to(_last_movement_direction, Vector3.UP)
+               _skin.move(velocity.length())
        else:
                _skin.fall()