From 3701448ba7e2410adf79dd4a326c0d47a9cc8240 Mon Sep 17 00:00:00 2001 From: Clifton Palmer Date: Tue, 6 May 2025 16:56:55 +0300 Subject: [PATCH] Refactored and added Fall state --- main.tscn | 2 +- Scene.gd => map/Scene.gd | 0 Scene.gd.uid => map/Scene.gd.uid | 0 map/cube.tscn | 19 ++++++++++++++++ map/grid_material.tres | 10 +++++++++ map/ramp.tscn | 21 ++++++++++++++++++ test.tscn => map/test.tscn | 22 ++++++++++--------- player/fall.gd | 7 ++++++ player/fall.gd.uid | 1 + player/{ => input}/CameraHandler.gd | 0 player/{ => input}/CameraHandler.gd.uid | 0 player/{ => input}/InputHandler.gd | 0 player/{ => input}/InputHandler.gd.uid | 0 player/{ => input}/InputPacket.gd | 0 player/{ => input}/InputPacket.gd.uid | 0 player/model.gd | 3 ++- player/{ => moves}/Move.gd | 11 ++++++---- player/{ => moves}/Move.gd.uid | 0 player/{ => moves}/dash.gd | 5 ----- player/{ => moves}/dash.gd.uid | 0 player/{ => moves}/idle.gd | 0 player/{ => moves}/idle.gd.uid | 0 player/{ => moves}/walk.gd | 29 ++++++++++++++++++++++--- player/{ => moves}/walk.gd.uid | 0 player/player.gd | 11 +++++----- player/player.tscn | 17 ++++++++++----- 26 files changed, 123 insertions(+), 35 deletions(-) rename Scene.gd => map/Scene.gd (100%) rename Scene.gd.uid => map/Scene.gd.uid (100%) create mode 100644 map/cube.tscn create mode 100644 map/grid_material.tres create mode 100644 map/ramp.tscn rename test.tscn => map/test.tscn (78%) create mode 100644 player/fall.gd create mode 100644 player/fall.gd.uid rename player/{ => input}/CameraHandler.gd (100%) rename player/{ => input}/CameraHandler.gd.uid (100%) rename player/{ => input}/InputHandler.gd (100%) rename player/{ => input}/InputHandler.gd.uid (100%) rename player/{ => input}/InputPacket.gd (100%) rename player/{ => input}/InputPacket.gd.uid (100%) rename player/{ => moves}/Move.gd (67%) rename player/{ => moves}/Move.gd.uid (100%) rename player/{ => moves}/dash.gd (82%) rename player/{ => moves}/dash.gd.uid (100%) rename player/{ => moves}/idle.gd (100%) rename player/{ => moves}/idle.gd.uid (100%) rename player/{ => moves}/walk.gd (62%) rename player/{ => moves}/walk.gd.uid (100%) diff --git a/main.tscn b/main.tscn index 92b1859..d9bdbd8 100644 --- a/main.tscn +++ b/main.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=3 format=3 uid="uid://xtdsp4hhl70p"] [ext_resource type="Script" uid="uid://jbyuxajvi3x1" path="res://main.gd" id="1_ig7tw"] -[ext_resource type="PackedScene" uid="uid://cootj2rfyviyb" path="res://test.tscn" id="2_0xm2m"] +[ext_resource type="PackedScene" uid="uid://cootj2rfyviyb" path="res://map/test.tscn" id="2_0xm2m"] [node name="Main" type="Node"] script = ExtResource("1_ig7tw") diff --git a/Scene.gd b/map/Scene.gd similarity index 100% rename from Scene.gd rename to map/Scene.gd diff --git a/Scene.gd.uid b/map/Scene.gd.uid similarity index 100% rename from Scene.gd.uid rename to map/Scene.gd.uid diff --git a/map/cube.tscn b/map/cube.tscn new file mode 100644 index 0000000..2984a63 --- /dev/null +++ b/map/cube.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=4 format=3 uid="uid://iwl88y3l713o"] + +[ext_resource type="Material" uid="uid://dt1upwj08kd0w" path="res://map/grid_material.tres" id="1_w8p6k"] + +[sub_resource type="BoxMesh" id="BoxMesh_tgywu"] + +[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_w8p6k"] +data = PackedVector3Array(-0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5) + +[node name="Cube" type="Node3D"] + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("BoxMesh_tgywu") +surface_material_override/0 = ExtResource("1_w8p6k") + +[node name="StaticBody3D" type="StaticBody3D" parent="MeshInstance3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/StaticBody3D"] +shape = SubResource("ConcavePolygonShape3D_w8p6k") diff --git a/map/grid_material.tres b/map/grid_material.tres new file mode 100644 index 0000000..5cdca8e --- /dev/null +++ b/map/grid_material.tres @@ -0,0 +1,10 @@ +[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dt1upwj08kd0w"] + +[ext_resource type="Texture2D" uid="uid://c8cfruu4iw5at" path="res://texture/grid.png" id="1_h25oc"] + +[resource] +albedo_color = Color(0.46, 0.46, 0.46, 1) +albedo_texture = ExtResource("1_h25oc") +uv1_scale = Vector3(0.5, 0.5, 0.5) +uv1_triplanar = true +uv1_world_triplanar = true diff --git a/map/ramp.tscn b/map/ramp.tscn new file mode 100644 index 0000000..f5cf67b --- /dev/null +++ b/map/ramp.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=4 format=3 uid="uid://b2qh1x7ulhhua"] + +[ext_resource type="Material" uid="uid://dt1upwj08kd0w" path="res://map/grid_material.tres" id="1_pbta4"] + +[sub_resource type="PrismMesh" id="PrismMesh_nxhg3"] +size = Vector3(1, 1.78, 1) + +[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_pbta4"] +data = PackedVector3Array(0, 0.89, 0.5, 0.5, -0.89, 0.5, -0.5, -0.89, 0.5, 0, 0.89, -0.5, -0.5, -0.89, -0.5, 0.5, -0.89, -0.5, 0, 0.89, 0.5, 0, 0.89, -0.5, 0.5, -0.89, 0.5, 0, 0.89, -0.5, 0.5, -0.89, -0.5, 0.5, -0.89, 0.5, 0, 0.89, -0.5, 0, 0.89, 0.5, -0.5, -0.89, -0.5, 0, 0.89, 0.5, -0.5, -0.89, 0.5, -0.5, -0.89, -0.5, -0.5, -0.89, 0.5, 0.5, -0.89, 0.5, -0.5, -0.89, -0.5, 0.5, -0.89, 0.5, 0.5, -0.89, -0.5, -0.5, -0.89, -0.5) + +[node name="Ramp" type="Node3D"] + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 0, 0, 0) +mesh = SubResource("PrismMesh_nxhg3") +surface_material_override/0 = ExtResource("1_pbta4") + +[node name="StaticBody3D" type="StaticBody3D" parent="MeshInstance3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="MeshInstance3D/StaticBody3D"] +shape = SubResource("ConcavePolygonShape3D_pbta4") diff --git a/test.tscn b/map/test.tscn similarity index 78% rename from test.tscn rename to map/test.tscn index 8b52abd..6bf5574 100644 --- a/test.tscn +++ b/map/test.tscn @@ -1,11 +1,13 @@ -[gd_scene load_steps=14 format=3 uid="uid://cootj2rfyviyb"] +[gd_scene load_steps=15 format=3 uid="uid://cootj2rfyviyb"] -[ext_resource type="Script" uid="uid://ccournv7m7l4y" path="res://Scene.gd" id="1_8uh7m"] +[ext_resource type="Script" uid="uid://ccournv7m7l4y" path="res://map/Scene.gd" id="1_8uh7m"] [ext_resource type="PackedScene" uid="uid://cchu1yltrhuk3" path="res://player/player.tscn" id="1_37kl0"] -[ext_resource type="Texture2D" uid="uid://c8cfruu4iw5at" path="res://texture/grid.png" id="2_6uqi0"] [ext_resource type="Script" uid="uid://dd3sep8kprktl" path="res://ux/debug_overlay.gd" id="2_ykrsh"] [ext_resource type="Script" uid="uid://mgg7ii0w4vod" path="res://ux/debug_stats.gd" id="3_g14j6"] [ext_resource type="Script" uid="uid://bocc5xwqtbkbb" path="res://ux/debug_draw_3d.gd" id="4_g14j6"] +[ext_resource type="Material" uid="uid://dt1upwj08kd0w" path="res://map/grid_material.tres" id="6_v1i7h"] +[ext_resource type="PackedScene" uid="uid://b2qh1x7ulhhua" path="res://map/ramp.tscn" id="7_5owfa"] +[ext_resource type="PackedScene" uid="uid://iwl88y3l713o" path="res://map/cube.tscn" id="8_f4bcd"] [sub_resource type="Theme" id="Theme_g14j6"] default_base_scale = 2.0 @@ -27,12 +29,6 @@ glow_enabled = true [sub_resource type="PlaneMesh" id="PlaneMesh_mf4mk"] size = Vector2(222, 222) -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_37kl0"] -albedo_color = Color(0.46, 0.46, 0.46, 1) -albedo_texture = ExtResource("2_6uqi0") -uv1_scale = Vector3(60, 60, 60) -uv1_world_triplanar = true - [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_37kl0"] data = PackedVector3Array(111, 0, 111, -111, 0, 111, 111, 0, -111, -111, 0, 111, -111, 0, -111, 111, 0, -111) @@ -75,9 +71,15 @@ shadow_enabled = true [node name="MeshInstance3D" type="MeshInstance3D" parent="map"] mesh = SubResource("PlaneMesh_mf4mk") skeleton = NodePath("../..") -surface_material_override/0 = SubResource("StandardMaterial3D_37kl0") +surface_material_override/0 = ExtResource("6_v1i7h") [node name="StaticBody3D" type="StaticBody3D" parent="map/MeshInstance3D"] [node name="CollisionShape3D" type="CollisionShape3D" parent="map/MeshInstance3D/StaticBody3D"] shape = SubResource("ConcavePolygonShape3D_37kl0") + +[node name="Ramp" parent="map" instance=ExtResource("7_5owfa")] +transform = Transform3D(-1.62606e-07, 0, -3.72, 0, 3.72, 0, 3.72, 0, -1.62606e-07, -0.137384, 0, 7.7898) + +[node name="Cube" parent="map" instance=ExtResource("8_f4bcd")] +transform = Transform3D(2.54, 0, 0, 0, 2.54, 0, 0, 0, 2.54, -7.30192, 1.27, 5.19269) diff --git a/player/fall.gd b/player/fall.gd new file mode 100644 index 0000000..0119254 --- /dev/null +++ b/player/fall.gd @@ -0,0 +1,7 @@ +extends Move +class_name Fall + + +func update(_input: InputPacket, delta: float): + player.velocity += player.get_gravity() * player.acceleration * delta + player.move_and_slide() diff --git a/player/fall.gd.uid b/player/fall.gd.uid new file mode 100644 index 0000000..18ec41d --- /dev/null +++ b/player/fall.gd.uid @@ -0,0 +1 @@ +uid://b0oj5iuvr8omo diff --git a/player/CameraHandler.gd b/player/input/CameraHandler.gd similarity index 100% rename from player/CameraHandler.gd rename to player/input/CameraHandler.gd diff --git a/player/CameraHandler.gd.uid b/player/input/CameraHandler.gd.uid similarity index 100% rename from player/CameraHandler.gd.uid rename to player/input/CameraHandler.gd.uid diff --git a/player/InputHandler.gd b/player/input/InputHandler.gd similarity index 100% rename from player/InputHandler.gd rename to player/input/InputHandler.gd diff --git a/player/InputHandler.gd.uid b/player/input/InputHandler.gd.uid similarity index 100% rename from player/InputHandler.gd.uid rename to player/input/InputHandler.gd.uid diff --git a/player/InputPacket.gd b/player/input/InputPacket.gd similarity index 100% rename from player/InputPacket.gd rename to player/input/InputPacket.gd diff --git a/player/InputPacket.gd.uid b/player/input/InputPacket.gd.uid similarity index 100% rename from player/InputPacket.gd.uid rename to player/input/InputPacket.gd.uid diff --git a/player/model.gd b/player/model.gd index ec1a952..c3657b0 100644 --- a/player/model.gd +++ b/player/model.gd @@ -7,7 +7,8 @@ class_name PlayerModel @onready var moves: Dictionary = { "idle": $Idle, "walk": $Walk, - "dash": $Dash + "dash": $Dash, + "fall": $Fall } var current_move: Move diff --git a/player/Move.gd b/player/moves/Move.gd similarity index 67% rename from player/Move.gd rename to player/moves/Move.gd index 3401850..66916c4 100644 --- a/player/Move.gd +++ b/player/moves/Move.gd @@ -10,7 +10,8 @@ var camera: Camera3D static var moves_priority: Dictionary = { "idle": 0, "walk": 1, - "dash": 2 + "dash": 2, + "fall": 100 } static func moves_priority_sort(a: String, b: String): @@ -18,9 +19,11 @@ static func moves_priority_sort(a: String, b: String): ### -func should_enter(_input: InputPacket) -> String: - print_debug("Function should_enter must be implemented in its child class!") - return "" +func should_enter(input: InputPacket) -> String: + if not player.is_on_floor(): + input.actions.append("fall") + input.actions.sort_custom(moves_priority_sort) + return input.actions[0] func update(_input: InputPacket, _delta: float): diff --git a/player/Move.gd.uid b/player/moves/Move.gd.uid similarity index 100% rename from player/Move.gd.uid rename to player/moves/Move.gd.uid diff --git a/player/dash.gd b/player/moves/dash.gd similarity index 82% rename from player/dash.gd rename to player/moves/dash.gd index 6b6368f..9ab0583 100644 --- a/player/dash.gd +++ b/player/moves/dash.gd @@ -2,11 +2,6 @@ extends Move class_name Dash -func should_enter(input) -> String: - input.actions.sort_custom(moves_priority_sort) - return input.actions[0] - - func update(input: InputPacket, _delta: float): # Get the XZ input direction based on player's input relative to the camera var forward := camera.global_basis.z diff --git a/player/dash.gd.uid b/player/moves/dash.gd.uid similarity index 100% rename from player/dash.gd.uid rename to player/moves/dash.gd.uid diff --git a/player/idle.gd b/player/moves/idle.gd similarity index 100% rename from player/idle.gd rename to player/moves/idle.gd diff --git a/player/idle.gd.uid b/player/moves/idle.gd.uid similarity index 100% rename from player/idle.gd.uid rename to player/moves/idle.gd.uid diff --git a/player/walk.gd b/player/moves/walk.gd similarity index 62% rename from player/walk.gd rename to player/moves/walk.gd index e9cf6d9..cf031aa 100644 --- a/player/walk.gd +++ b/player/moves/walk.gd @@ -2,14 +2,37 @@ extends Move class_name Walk -func should_enter(input) -> String: - input.actions.sort_custom(moves_priority_sort) - return input.actions[0] +const skin_lean_limit := PI/4 func update(input: InputPacket, delta: float): player.velocity = get_new_velocity_from_input(input, delta) player.move_and_slide() + + # update skin rotation + var skin_target_angle := Vector3.BACK.signed_angle_to( + player.last_movement_direction, + Vector3.UP + ) + player.skin.global_rotation.y = lerp_angle( + player.skin.global_rotation.y, + skin_target_angle, + player.rotation_speed * delta + ) + + # lean into player momentum just a little bit + player.skin.rotation.z = lerp_angle( + player.skin.rotation.z, + clamp( + player.last_movement_direction.signed_angle_to( + player.velocity, Vector3.UP + ) * player.velocity.length() * 0.08, + -skin_lean_limit, skin_lean_limit + ), + player.rotation_speed * delta * 0.25 + ) + + func get_new_velocity_from_input(input: InputPacket, delta: float) -> Vector3: diff --git a/player/walk.gd.uid b/player/moves/walk.gd.uid similarity index 100% rename from player/walk.gd.uid rename to player/moves/walk.gd.uid diff --git a/player/player.gd b/player/player.gd index 6f82ce6..2c6782d 100644 --- a/player/player.gd +++ b/player/player.gd @@ -5,21 +5,22 @@ class_name Player @export_group("Movement") @export var walk_speed := 8.0 @export var dash_length := 10.0 -@export var air_speed := 3.0 @export var acceleration := 20.0 @export var rotation_speed := 10.0 @export var idle_timeout := 5.0 + var idle_time := 0.00 var last_movement_direction := Vector3.ZERO var state := "" var floor_normal := Vector3.ZERO var ground_slope_input := 0.0 -@onready var _input: InputHandler = %Input -@onready var _model: PlayerModel = %Model +@onready var input: InputHandler = %Input +@onready var model: PlayerModel = %Model +@onready var skin: AnimatedSkin = %skin func _physics_process(delta: float) -> void: - var input_pkt := _input.get_player_input() - _model.update(input_pkt, delta) + var input_pkt := input.get_player_input() + model.update(input_pkt, delta) diff --git a/player/player.tscn b/player/player.tscn index fb4bbe3..0b94209 100644 --- a/player/player.tscn +++ b/player/player.tscn @@ -1,13 +1,14 @@ -[gd_scene load_steps=10 format=3 uid="uid://cchu1yltrhuk3"] +[gd_scene load_steps=11 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://bspr3vafk6wi2" path="res://player/input/InputHandler.gd" id="3_g1dw6"] +[ext_resource type="Script" uid="uid://c5mn28v6ujngk" path="res://player/input/CameraHandler.gd" id="3_yw30f"] [ext_resource type="Script" uid="uid://bwox6frn7fmgt" path="res://player/model.gd" id="5_qjkh3"] -[ext_resource type="Script" uid="uid://bv5k167ugxmso" path="res://player/idle.gd" id="6_g6k8r"] -[ext_resource type="Script" uid="uid://cqurhmxam2nl0" path="res://player/walk.gd" id="7_rgyib"] -[ext_resource type="Script" uid="uid://bdiks0m7vsn5w" path="res://player/dash.gd" id="8_hg6s5"] +[ext_resource type="Script" uid="uid://bv5k167ugxmso" path="res://player/moves/idle.gd" id="6_g6k8r"] +[ext_resource type="Script" uid="uid://cqurhmxam2nl0" path="res://player/moves/walk.gd" id="7_rgyib"] +[ext_resource type="Script" uid="uid://bdiks0m7vsn5w" path="res://player/moves/dash.gd" id="8_hg6s5"] +[ext_resource type="Script" uid="uid://b0oj5iuvr8omo" path="res://player/fall.gd" id="9_hg6s5"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_sh265"] @@ -51,3 +52,7 @@ script = ExtResource("7_rgyib") [node name="Dash" type="Node" parent="Model"] script = ExtResource("8_hg6s5") + +[node name="Fall" type="Node" parent="Model"] +script = ExtResource("9_hg6s5") +metadata/_custom_type_script = "uid://c886t1c86q0m6" -- 2.47.2