WIP #102 enhancing crouching behavior

This commit is contained in:
betalars 2025-08-18 00:13:20 +02:00
parent f32a317994
commit c54d9c5d22
5 changed files with 205 additions and 17 deletions

View File

@ -0,0 +1,15 @@
class_name CrouchVolume extends Area3D
func ready():
body_entered.connect(notify_player_entry)
body_exited.connect(notify_player_exit)
func notify_player_entry(body: RigidBody3D):
print("Player entered Crouch area.")
if body is Player:
body.inside_crouch_volume.append(self)
func notify_player_exit(body: RigidBody3D):
if body is Player:
body.inside_crouch_volume.erase(self)
body.crouched = false

View File

@ -1,10 +1,11 @@
[gd_scene load_steps=114 format=4 uid="uid://b3b0gyvklqn50"] [gd_scene load_steps=115 format=4 uid="uid://b3b0gyvklqn50"]
[ext_resource type="Script" uid="uid://belkrno67sft0" path="res://base-environments/youth_room/room_handle.gd" id="1_aitp0"] [ext_resource type="Script" uid="uid://belkrno67sft0" path="res://base-environments/youth_room/room_handle.gd" id="1_aitp0"]
[ext_resource type="PackedScene" uid="uid://c0i4ydmxtxfho" path="res://base-environments/youth_room/import/youth_room.glb" id="1_jf3oi"] [ext_resource type="PackedScene" uid="uid://c0i4ydmxtxfho" path="res://base-environments/youth_room/import/youth_room.glb" id="1_jf3oi"]
[ext_resource type="AudioStream" uid="uid://1h6k2d8q1kw3" path="res://base-environments/youth_room/import/sounds/rain_on_window.mp3" id="2_3haaq"] [ext_resource type="AudioStream" uid="uid://1h6k2d8q1kw3" path="res://base-environments/youth_room/import/sounds/rain_on_window.mp3" id="2_3haaq"]
[ext_resource type="PackedScene" uid="uid://mkccbig41bqb" path="res://logic-scenes/player_controller/player_controller.tscn" id="3_foj4y"] [ext_resource type="PackedScene" uid="uid://mkccbig41bqb" path="res://logic-scenes/player_controller/player_controller.tscn" id="3_foj4y"]
[ext_resource type="AudioStream" uid="uid://bbpo1hu35yer8" path="res://base-environments/youth_room/import/sounds/thunder.mp3" id="3_wcypa"] [ext_resource type="AudioStream" uid="uid://bbpo1hu35yer8" path="res://base-environments/youth_room/import/sounds/thunder.mp3" id="3_wcypa"]
[ext_resource type="Script" uid="uid://c281w7earok6w" path="res://base-environments/youth_room/crouch_volume.gd" id="3_x3dlb"]
[ext_resource type="PackedScene" uid="uid://bnskiyx1sksww" path="res://logic-scenes/board/physics-board.tscn" id="4_gyjxx"] [ext_resource type="PackedScene" uid="uid://bnskiyx1sksww" path="res://logic-scenes/board/physics-board.tscn" id="4_gyjxx"]
[ext_resource type="AudioStream" uid="uid://1tvopjmo6dp2" path="res://base-environments/youth_room/audio/Azure Studios - mgd-723687677.mp3" id="5_fe1yj"] [ext_resource type="AudioStream" uid="uid://1tvopjmo6dp2" path="res://base-environments/youth_room/audio/Azure Studios - mgd-723687677.mp3" id="5_fe1yj"]
[ext_resource type="PackedScene" uid="uid://citwb7f4dl3l1" path="res://thank-you.tscn" id="5_kts6y"] [ext_resource type="PackedScene" uid="uid://citwb7f4dl3l1" path="res://thank-you.tscn" id="5_kts6y"]
@ -90,7 +91,7 @@ height = 1.0
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_kewqg"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_kewqg"]
radius = 0.787239 radius = 0.787239
height = 3.19663 height = 4.07459
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_k4x40"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_k4x40"]
radius = 1.0352 radius = 1.0352
@ -1606,6 +1607,7 @@ script = ExtResource("1_aitp0")
unique_name_in_owner = true unique_name_in_owner = true
process_mode = 4 process_mode = 4
transform = Transform3D(0.686123, 0, 0.727485, 0, 1, 0, -0.727485, 0, 0.686123, 0.63, 0, 0.925) transform = Transform3D(0.686123, 0, 0.727485, 0, 1, 0, -0.727485, 0, 0.686123, 0.63, 0, 0.925)
collision_mask = 3
[node name="colission" type="Node3D" parent="logic"] [node name="colission" type="Node3D" parent="logic"]
@ -1716,11 +1718,12 @@ collision_mask = 2
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.170028, 0.244833, -0.0455775) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.170028, 0.244833, -0.0455775)
shape = SubResource("CapsuleShape3D_f1g8m") shape = SubResource("CapsuleShape3D_f1g8m")
[node name="ladder_reset" type="Area3D" parent="logic/Bed and Ladders"] [node name="bed_duck" type="Area3D" parent="logic/Bed and Ladders"]
collision_layer = 2 collision_layer = 2
collision_mask = 2 collision_mask = 2
script = ExtResource("3_x3dlb")
[node name="CollisionShape3D" type="CollisionShape3D" parent="logic/Bed and Ladders/ladder_reset"] [node name="CollisionShape3D" type="CollisionShape3D" parent="logic/Bed and Ladders/bed_duck"]
transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0.916567, 1.64525, -1.14479) transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0.916567, 1.64525, -1.14479)
shape = SubResource("CapsuleShape3D_kewqg") shape = SubResource("CapsuleShape3D_kewqg")
@ -1733,12 +1736,13 @@ collision_mask = 2
transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0, 0, 0) transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0, 0, 0)
shape = SubResource("CapsuleShape3D_k4x40") shape = SubResource("CapsuleShape3D_k4x40")
[node name="bed_reset" type="Area3D" parent="logic/Bed and Ladders"] [node name="bed_crouch" type="Area3D" parent="logic/Bed and Ladders"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.24356, 0, -0.796765) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.24356, 0, -0.796765)
collision_layer = 2 collision_layer = 2
collision_mask = 2 collision_mask = 2
script = ExtResource("3_x3dlb")
[node name="CollisionShape3D" type="CollisionShape3D" parent="logic/Bed and Ladders/bed_reset"] [node name="CollisionShape3D" type="CollisionShape3D" parent="logic/Bed and Ladders/bed_crouch"]
transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0.107988, 1.56575e-08, -0.358201) transform = Transform3D(0.995341, 0.096419, 0, 4.21461e-09, -4.35077e-08, -1, -0.096419, 0.995341, -4.37114e-08, 0.107988, 1.56575e-08, -0.358201)
shape = SubResource("CapsuleShape3D_4q8vc") shape = SubResource("CapsuleShape3D_4q8vc")
@ -2432,10 +2436,8 @@ light_array = Array[Vector3]([Vector3(-0.545, 0.915, 1.035), Vector3(-0.47, 0.85
[connection signal="ui_exited" from="logic/PlayerController" to="SceneUI" method="hide"] [connection signal="ui_exited" from="logic/PlayerController" to="SceneUI" method="hide"]
[connection signal="body_entered" from="logic/Bed and Ladders/ladder_trigger" to="logic/PlayerController" method="_on_bed_enter"] [connection signal="body_entered" from="logic/Bed and Ladders/ladder_trigger" to="logic/PlayerController" method="_on_bed_enter"]
[connection signal="body_entered" from="logic/Bed and Ladders/ladder_trigger" to="logic/Bed and Ladders/ladder" method="raise"] [connection signal="body_entered" from="logic/Bed and Ladders/ladder_trigger" to="logic/Bed and Ladders/ladder" method="raise"]
[connection signal="body_exited" from="logic/Bed and Ladders/ladder_reset" to="logic/PlayerController" method="_on_bed_exit"] [connection signal="body_exited" from="logic/Bed and Ladders/bed_duck" to="logic/Bed and Ladders/ladder" method="reset"]
[connection signal="body_exited" from="logic/Bed and Ladders/ladder_reset" to="logic/Bed and Ladders/ladder" method="reset"]
[connection signal="body_entered" from="logic/Bed and Ladders/bed_enter" to="logic/PlayerController" method="_on_bed_enter"] [connection signal="body_entered" from="logic/Bed and Ladders/bed_enter" to="logic/PlayerController" method="_on_bed_enter"]
[connection signal="body_exited" from="logic/Bed and Ladders/bed_reset" to="logic/PlayerController" method="_on_bed_exit"]
[connection signal="body_exited" from="logic/Bed and Ladders/reset_failover" to="logic/PlayerController" method="_on_bed_exit"] [connection signal="body_exited" from="logic/Bed and Ladders/reset_failover" to="logic/PlayerController" method="_on_bed_exit"]
[connection signal="pressed" from="logic/UI/ending_button" to="logic/UI/ending_button" method="hide"] [connection signal="pressed" from="logic/UI/ending_button" to="logic/UI/ending_button" method="hide"]
[connection signal="pressed" from="logic/UI/ending_button" to="logic/UI/ending" method="show"] [connection signal="pressed" from="logic/UI/ending_button" to="logic/UI/ending" method="show"]

View File

@ -52,7 +52,17 @@ var rotation_speed: Vector2 = Vector2.ZERO
var current_mouse_rotation: Vector2 = Vector2.ZERO var current_mouse_rotation: Vector2 = Vector2.ZERO
var noise: Noise = FastNoiseLite.new() var noise: Noise = FastNoiseLite.new()
var crouched:bool = false var crouched:bool = false:
set(set_crouching):
if is_node_ready():
if set_crouching and not crouched:
$PlayerAnimationPlayer.play("crouch")
crouched = set_crouching
elif (not set_crouching and crouched) and not crouch_held:
if can_stand_up():
$PlayerAnimationPlayer.play("stand_up")
crouch_toggled = false
crouched = set_crouching
var on_crouch_cooldown:bool = false var on_crouch_cooldown:bool = false
@onready var yaw: Node3D = $Yaw @onready var yaw: Node3D = $Yaw
@ -79,6 +89,7 @@ func _ready():
_handle_jitter(0) _handle_jitter(0)
ui_prober.area_entered.connect(_on_ray_entered) ui_prober.area_entered.connect(_on_ray_entered)
ui_prober.area_exited.connect(_on_ray_exited) ui_prober.area_exited.connect(_on_ray_exited)
$CrouchDetector.area_exited.connect(exit_crouch)
func _process(_delta): func _process(_delta):
@ -210,6 +221,23 @@ func _input(event:InputEvent):
focus_ray.get_collider().handle(event) focus_ray.get_collider().handle(event)
get_viewport().set_input_as_handled() get_viewport().set_input_as_handled()
if event.is_action_pressed("crouch"):
cround_start_time = Time.get_unix_time_from_system()
crouch_held = true
if crouch_toggled:
crouched = false
#crouch_toggled is being released by crouch setter
else:
crouched = true
if event.is_action_released("crouch"):
crouch_held = false
if Time.get_unix_time_from_system() > cround_start_time + 0.5:
if crouched:
crouched = false
else:
crouch_toggled = true
func play_scene(id: int, _repeat): func play_scene(id: int, _repeat):
if id == Scenes.id.YOUTH_DRAEVEN: if id == Scenes.id.YOUTH_DRAEVEN:
var rotation_tween = create_tween() var rotation_tween = create_tween()
@ -218,7 +246,11 @@ func scene_finished(_id, repeat: bool):
if repeat: if repeat:
State.take_stage(self, true) State.take_stage(self, true)
var crouch_held: bool = false
var crouch_toggled: bool = false
var cround_start_time: float = 0
func _on_bed_enter(_body): func _on_bed_enter(_body):
return
if not (crouched or on_crouch_cooldown): if not (crouched or on_crouch_cooldown):
$PlayerAnimationPlayer.queue("crouch") $PlayerAnimationPlayer.queue("crouch")
var tween = create_tween() var tween = create_tween()
@ -226,6 +258,7 @@ func _on_bed_enter(_body):
crouched = true crouched = true
func _on_bed_exit(_body): func _on_bed_exit(_body):
return
if crouched: if crouched:
crouched = false crouched = false
$PlayerAnimationPlayer.queue("stand_up") $PlayerAnimationPlayer.queue("stand_up")
@ -235,3 +268,16 @@ func _on_bed_exit(_body):
on_crouch_cooldown = true on_crouch_cooldown = true
await get_tree().create_timer(1.0).timeout await get_tree().create_timer(1.0).timeout
on_crouch_cooldown = false on_crouch_cooldown = false
var inside_crouch_volume: Array[CrouchVolume] = []
#returns true, if the player character can stand upright.
func can_stand_up() -> bool:
for area: Area3D in $CrouchDetector.get_overlapping_areas():
if area is CrouchVolume:
return false
return true
func exit_crouch(body):
if body is Area3D:
crouched = false

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=9 format=3 uid="uid://mkccbig41bqb"] [gd_scene load_steps=10 format=3 uid="uid://mkccbig41bqb"]
[ext_resource type="Script" uid="uid://bk618uyhghswx" path="res://logic-scenes/player_controller/player_controller.gd" id="1_0b4mi"] [ext_resource type="Script" uid="uid://bk618uyhghswx" path="res://logic-scenes/player_controller/player_controller.gd" id="1_0b4mi"]
@ -8,8 +8,9 @@ friction = 0.0
[sub_resource type="SeparationRayShape3D" id="SeparationRayShape3D_hpoj0"] [sub_resource type="SeparationRayShape3D" id="SeparationRayShape3D_hpoj0"]
length = 1.29801 length = 1.29801
[sub_resource type="SphereShape3D" id="8"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_hpoj0"]
radius = 0.307047 radius = 0.3
height = 1.2
[sub_resource type="Animation" id="11"] [sub_resource type="Animation" id="11"]
length = 0.001 length = 0.001
@ -37,6 +38,42 @@ tracks/1/keys = {
"update": 0, "update": 0,
"values": [Vector3(0, 0, 0)] "values": [Vector3(0, 0, 0)]
} }
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("PlayerCollision:shape:height")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [1.2]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("PlayerCollision:position")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0, 0.6, 0)]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath(".:max_speed")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [3.0]
}
[sub_resource type="Animation" id="12"] [sub_resource type="Animation" id="12"]
resource_name = "crouch" resource_name = "crouch"
@ -65,6 +102,42 @@ tracks/1/keys = {
"update": 0, "update": 0,
"values": [Vector3(0, 0, 0), Vector3(-30, 0, -10), Vector3(-20, 0, 3), Vector3(0, 0, 0), Vector3(0, 0, 0)] "values": [Vector3(0, 0, 0), Vector3(-30, 0, -10), Vector3(-20, 0, 3), Vector3(0, 0, 0), Vector3(0, 0, 0)]
} }
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("PlayerCollision:position")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 1.01),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0, 0.6, 0), Vector3(0, 0.3, 0)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("PlayerCollision:shape:height")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 1.01),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [1.2, 0.6]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath(".:max_speed")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0, 0.69),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [3.0, 1.5]
}
[sub_resource type="Animation" id="14"] [sub_resource type="Animation" id="14"]
resource_name = "stand_up" resource_name = "stand_up"
@ -93,6 +166,42 @@ tracks/1/keys = {
"update": 0, "update": 0,
"values": [Vector3(0, 0, 0), Vector3(-4.79133, 3.17287, -3.71499), Vector3(24.594, -3.154, -4.794), Vector3(0.103793, -1.69217, -1.78899), Vector3(0, 0, 0)] "values": [Vector3(0, 0, 0), Vector3(-4.79133, 3.17287, -3.71499), Vector3(24.594, -3.154, -4.794), Vector3(0.103793, -1.69217, -1.78899), Vector3(0, 0, 0)]
} }
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("PlayerCollision:position")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 1.01),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [Vector3(0, 0.3, 0), Vector3(0, 0.6, 0)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("PlayerCollision:shape:height")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0, 1.03333),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [0.6, 1.2]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath(".:max_speed")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0.9, 2.2),
"transitions": PackedFloat32Array(1, 1),
"update": 0,
"values": [1.5, 3.0]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_xbx3w"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_xbx3w"]
_data = { _data = {
@ -101,9 +210,10 @@ _data = {
&"stand_up": SubResource("14") &"stand_up": SubResource("14")
} }
[sub_resource type="SphereShape3D" id="SphereShape3D_hpoj0"]
radius = 0.3
[node name="PlayerController" type="RigidBody3D"] [node name="PlayerController" type="RigidBody3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.26517, 1.19209e-07, 1.70185)
collision_layer = 3
axis_lock_angular_x = true axis_lock_angular_x = true
axis_lock_angular_y = true axis_lock_angular_y = true
axis_lock_angular_z = true axis_lock_angular_z = true
@ -139,10 +249,18 @@ transform = Transform3D(-1, 0, -8.74229e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0,
shape = SubResource("SeparationRayShape3D_hpoj0") shape = SubResource("SeparationRayShape3D_hpoj0")
[node name="PlayerCollision" type="CollisionShape3D" parent="."] [node name="PlayerCollision" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.322255, 0) transform = Transform3D(1, 0, 0, 0, -1, 8.74228e-08, 0, -8.74228e-08, -1, 0, 0.6, 0)
shape = SubResource("8") shape = SubResource("CapsuleShape3D_hpoj0")
[node name="PlayerAnimationPlayer" type="AnimationPlayer" parent="."] [node name="PlayerAnimationPlayer" type="AnimationPlayer" parent="."]
libraries = { libraries = {
&"": SubResource("AnimationLibrary_xbx3w") &"": SubResource("AnimationLibrary_xbx3w")
} }
[node name="CrouchDetector" type="Area3D" parent="."]
collision_layer = 3
collision_mask = 3
[node name="CollisionShape3D" type="CollisionShape3D" parent="CrouchDetector"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.35, 0)
shape = SubResource("SphereShape3D_hpoj0")

View File

@ -176,6 +176,13 @@ option_memento_ui={
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":2,"pressure":0.0,"pressed":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":2,"pressure":0.0,"pressed":false,"script":null)
] ]
} }
crouch={
"deadzone": 0.2,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194326,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":7,"pressure":0.0,"pressed":false,"script":null)
]
}
[internationalization] [internationalization]