class_name Scene
-@onready var _player: Player = %Player
-@onready var _debug: CanvasLayer = %debug
-@onready var _version: String = ProjectSettings.get_setting("application/config/version")
+@onready var player: Player = %Player
+@onready var model: PlayerModel = %Model
+@onready var debug: CanvasLayer = %debug
+@onready var version: String = ProjectSettings.get_setting("application/config/version")
func _ready() -> void:
- _debug.draw.add_vector(_player, "velocity", 1, 1, Color(0,1,0,1))
- _debug.draw.add_vector(_player, "_floor_normal", 1, 1, Color(0, 0, 1, 1))
- _debug.draw.add_vector(_player, "_last_movement_direction", 1, 1, Color(1,0,0,1))
+ debug.draw.add_vector(player, "velocity", 1, 1, Color(0,1,0,1))
+ #_debug.draw.add_vector(model, "floor_normal", 1, 1, Color(0, 0, 1, 1))
+ #_debug.draw.add_vector(model, "last_movement_direction", 1, 1, Color(1,0,0,1))
- _debug.stats.add_property(self, "_version", "")
- _debug.stats.add_property(_player, "velocity", "length")
- _debug.stats.add_property(_player, "_idle_time", "round")
+ debug.stats.add_property(self, "version", "")
+ debug.stats.add_property(player, "velocity", "length")
+ #debug.stats.add_property(model, "idle_time", "round")
func _input(event: InputEvent) -> void:
func get_player_input() -> InputPacket:
var p: InputPacket = InputPacket.new()
+ if Input.is_action_just_pressed("player-dash"):
+ p.actions.append("dash")
p.movement_direction = Input.get_vector("player-left", "player-right", "player-forward", "player-backward")
return p
class_name InputPacket
var movement_direction: Vector2 = Vector2.ZERO
+var actions: Array[String] = []
--- /dev/null
+extends Node
+class_name PlayerModel
+
+
+@export_group("Movement")
+@export var walk_speed := 8.0
+@export var dash_length := 10.0
+@export var air_speed := 3.0
+@export var acceleration := 30.0
+@export var rotation_speed := 10.0
+@export var idle_timeout := 5.0
+
+var idle_time := 0.0
+var floor_normal := Vector3.ZERO
+var ground_slope_input := 0.0
+
+@onready var _player: Player = $".."
+@onready var _camera: Camera3D = %camera
+
+
+func get_velocity_by_input(input_pkt: InputPacket, delta: float) -> Vector3:
+ var new_velocity: Vector3 = _player.velocity
+
+ if _player.is_on_floor():
+ # Get the XZ input direction based on player's input relative to the camera
+ var forward := _camera.global_basis.z
+ var right := _camera.global_basis.x
+ var move_direction := (
+ forward * input_pkt.movement_direction.y + right * input_pkt.movement_direction.x
+ ).normalized()
+ move_direction.y = 0
+
+ # if we're not stuck, then it's okay to set the velocity
+ floor_normal = _player.get_floor_normal()
+ ground_slope_input = (PI / 2) - new_velocity.angle_to(floor_normal)
+ new_velocity = new_velocity.move_toward(
+ move_direction * (walk_speed + ground_slope_input * walk_speed),
+ acceleration * delta
+ )
+ else:
+ new_velocity += _player.get_gravity() * air_speed * delta
+
+ return new_velocity
--- /dev/null
+uid://bwox6frn7fmgt
extends CharacterBody3D
class_name Player
-##########
-# settings
-##########
-
-@export_group("Movement")
-@export var walk_speed := 8.0
-@export var dash_length := 10.0
-@export var air_speed := 3.0
-@export var acceleration := 30.0
-@export var rotation_speed := 10.0
-@export var idle_timeout := 5.0
-
-######
-# init
-######
@onready var _input: InputHandler = %Input
-@onready var _camera: Camera3D = %camera
-@onready var _skin: AnimatedSkin = %skin
-
-var _last_movement_direction: Vector3 = rotation
-var _floor_normal := Vector3.ONE
-var _ground_slope_input := 0.0
-var _idle_time: float = 0.0
-var _player_speed: float = walk_speed
+@onready var _model: PlayerModel = %Model
-##########
-# movement
-##########
-
func _physics_process(delta: float) -> void:
var input_pkt := _input.get_player_input()
- velocity = _get_velocity_by_input(input_pkt, delta)
+ velocity = _model.get_velocity_by_input(input_pkt, delta)
move_and_slide()
-
-
-# Get the XZ input direction based on player's input relative to the camera
-func _get_player_move_direction(input_dir: Vector2) -> Vector3:
- var forward := _camera.global_basis.z
- var right := _camera.global_basis.x
- var move_direction := (forward * input_dir.y + right * input_dir.x).normalized()
- move_direction.y = 0
- return move_direction
-
-
-func _get_velocity_by_input(input_pkt: InputPacket, delta: float) -> Vector3:
- var new_velocity: Vector3 = velocity
-
- if is_on_floor():
- var move_dir := _get_player_move_direction(input_pkt.movement_direction)
-
- # if we're not stuck, then it's okay to set the velocity
- _floor_normal = get_floor_normal()
- _ground_slope_input = (PI / 2) - new_velocity.angle_to(_floor_normal)
- new_velocity = new_velocity.move_toward(
- move_dir * (_player_speed + _ground_slope_input * _player_speed),
- acceleration * delta
- )
- else:
- new_velocity += get_gravity() * air_speed * delta
-
- return new_velocity
-
-#########
-# actions
-#########
-
-func _player_dash():
- if _last_movement_direction != Vector3.ZERO:
- var dash_local_pos = _last_movement_direction * dash_length
- # TODO: check if valid position, crop the vector to last valid position
- global_position += dash_local_pos
-[gd_scene load_steps=6 format=3 uid="uid://cchu1yltrhuk3"]
+[gd_scene load_steps=7 format=3 uid="uid://cchu1yltrhuk3"]
[ext_resource type="PackedScene" uid="uid://dvkx3t15l7mfb" path="res://skin/prototype_skin.tscn" id="1_4flbx"]
[ext_resource type="Script" uid="uid://dcv34jq0jett0" path="res://player/player.gd" id="1_onrkg"]
[ext_resource type="Script" uid="uid://bspr3vafk6wi2" path="res://player/InputHandler.gd" id="3_g1dw6"]
[ext_resource type="Script" uid="uid://c5mn28v6ujngk" path="res://player/CameraHandler.gd" id="3_yw30f"]
+[ext_resource type="Script" uid="uid://bwox6frn7fmgt" path="res://player/model.gd" id="5_qjkh3"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_sh265"]
[node name="skin" parent="." instance=ExtResource("1_4flbx")]
unique_name_in_owner = true
-[node name="CameraPivot" type="Node3D" parent="."]
+[node name="CameraHandler" type="Node3D" parent="."]
unique_name_in_owner = true
script = ExtResource("3_yw30f")
-[node name="spring" type="SpringArm3D" parent="CameraPivot"]
+[node name="spring" type="SpringArm3D" parent="CameraHandler"]
unique_name_in_owner = true
transform = Transform3D(-1, -2.99003e-08, 8.21505e-08, 0, 0.939693, 0.34202, -8.74228e-08, 0.34202, -0.939693, 0, 1.52762, 0)
spring_length = 3.0
-[node name="camera" type="Camera3D" parent="CameraPivot/spring"]
+[node name="camera" type="Camera3D" parent="CameraHandler/spring"]
unique_name_in_owner = true
[node name="Input" type="Node" parent="."]
unique_name_in_owner = true
script = ExtResource("3_g1dw6")
+
+[node name="Model" type="Node" parent="."]
+unique_name_in_owner = true
+script = ExtResource("5_qjkh3")