]> Untitled Git - frog-ninja.git/blob - player/player.gd
Added CameraHandler, InputHandler
[frog-ninja.git] / player / player.gd
1 extends CharacterBody3D
2 class_name Player
3
4 ##########
5 # settings
6 ##########
7
8 @export_group("Movement")
9 @export var walk_speed := 8.0
10 @export var dash_length := 10.0
11 @export var air_speed := 3.0
12 @export var acceleration := 30.0
13 @export var rotation_speed := 10.0
14 @export var idle_timeout := 5.0
15
16 ######
17 # init
18 ######
19
20 @onready var _input: InputHandler = %Input
21 @onready var _camera: Camera3D = %camera
22 @onready var _skin: AnimatedSkin = %skin
23
24 var _last_movement_direction: Vector3 = rotation
25 var _floor_normal := Vector3.ONE
26 var _ground_slope_input := 0.0
27 var _idle_time: float = 0.0
28 var _player_speed: float = walk_speed
29
30
31 ##########
32 # movement
33 ##########
34
35 func _physics_process(delta: float) -> void:
36         var input_pkt := _input.get_player_input()
37         velocity = _get_velocity_by_input(input_pkt, delta)
38         move_and_slide()
39
40
41 # Get the XZ input direction based on player's input relative to the camera
42 func _get_player_move_direction(input_dir: Vector2) -> Vector3:
43         var forward := _camera.global_basis.z
44         var right := _camera.global_basis.x
45         var move_direction := (forward * input_dir.y + right * input_dir.x).normalized()
46         move_direction.y = 0
47         return move_direction
48
49
50 func _get_velocity_by_input(input_pkt: InputPacket, delta: float) -> Vector3:
51         var new_velocity: Vector3 = velocity
52         
53         if is_on_floor():
54                 var move_dir := _get_player_move_direction(input_pkt.movement_direction)
55                 
56                 # if we're not stuck, then it's okay to set the velocity
57                 _floor_normal = get_floor_normal()
58                 _ground_slope_input = (PI / 2) - new_velocity.angle_to(_floor_normal)
59                 new_velocity = new_velocity.move_toward(
60                         move_dir * (_player_speed + _ground_slope_input * _player_speed),
61                         acceleration * delta
62                         )
63         else:
64                 new_velocity += get_gravity() * air_speed * delta
65
66         return new_velocity
67
68 #########
69 # actions
70 #########
71
72 func _player_dash():
73         if _last_movement_direction != Vector3.ZERO:
74                 var dash_local_pos = _last_movement_direction * dash_length
75                 # TODO: check if valid position, crop the vector to last valid position
76                 global_position += dash_local_pos