From: Clifton Palmer Date: Tue, 6 May 2025 10:12:52 +0000 (+0300) Subject: Added Model to round out MVC implementation X-Git-Url: http://git.purplebirdman.com/frog-ninja.git/commitdiff_plain/3aebb768a5eef14badd98369da99ee151d2a060b?ds=sidebyside Added Model to round out MVC implementation --- diff --git a/Scene.gd b/Scene.gd index 749e948..b43d72f 100644 --- a/Scene.gd +++ b/Scene.gd @@ -2,19 +2,20 @@ extends Node3D 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: diff --git a/player/InputHandler.gd b/player/InputHandler.gd index 35a0aee..109b804 100644 --- a/player/InputHandler.gd +++ b/player/InputHandler.gd @@ -8,5 +8,7 @@ func get_camera_input_direction() -> Vector2: 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 diff --git a/player/InputPacket.gd b/player/InputPacket.gd index 0599e1d..e3a354f 100644 --- a/player/InputPacket.gd +++ b/player/InputPacket.gd @@ -2,3 +2,4 @@ extends Node class_name InputPacket var movement_direction: Vector2 = Vector2.ZERO +var actions: Array[String] = [] diff --git a/player/model.gd b/player/model.gd new file mode 100644 index 0000000..c2d8c78 --- /dev/null +++ b/player/model.gd @@ -0,0 +1,43 @@ +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 diff --git a/player/model.gd.uid b/player/model.gd.uid new file mode 100644 index 0000000..4ef3c81 --- /dev/null +++ b/player/model.gd.uid @@ -0,0 +1 @@ +uid://bwox6frn7fmgt diff --git a/player/player.gd b/player/player.gd index ce43a78..6e32bcd 100644 --- a/player/player.gd +++ b/player/player.gd @@ -1,76 +1,12 @@ 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 diff --git a/player/player.tscn b/player/player.tscn index 4d86286..4814692 100644 --- a/player/player.tscn +++ b/player/player.tscn @@ -1,9 +1,10 @@ -[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"] @@ -19,18 +20,22 @@ shape = SubResource("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")