X-Git-Url: http://git.purplebirdman.com/knight.git/blobdiff_plain/14955fc67047f5f1fde5c1cb2570ca5e6de5c439..b1d5b8a1f4c7a5b464003f35ed37733b65bba25d:/player/player.gd diff --git a/player/player.gd b/player/player.gd index 54b838e..6099c08 100644 --- a/player/player.gd +++ b/player/player.gd @@ -1,37 +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 + +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"): + 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() * 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 = move_toward(velocity.x, 0, SPEED) - velocity.z = move_toward(velocity.z, 0, SPEED) + velocity.x = 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.FORWARD.signed_angle_to(direction, Vector3.UP) + _skin.move(velocity.length()) else: _skin.fall()