From a33f493a046052752034539a22a00f3025049cad Mon Sep 17 00:00:00 2001 From: derek Date: Tue, 17 Jun 2025 13:57:04 -0500 Subject: [PATCH] playing with physical ledge grab --- assets/player.tscn | 27 +++++++++------------------ scripts/PlayerStates.gd | 22 +++++++++++++++------- scripts/player.gd | 2 ++ scripts/player_jumping.gd | 15 +++++++++------ 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/assets/player.tscn b/assets/player.tscn index e20e8d0..120cf83 100644 --- a/assets/player.tscn +++ b/assets/player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=45 format=3 uid="uid://drwae3loscbw7"] +[gd_scene load_steps=46 format=3 uid="uid://drwae3loscbw7"] [ext_resource type="Script" uid="uid://bieeh1iro4ji1" path="res://scripts/player.gd" id="1_x7wms"] [ext_resource type="Script" uid="uid://linvnr16djav" path="res://scripts/PlayerStateMachine.gd" id="2_1npgd"] @@ -134,6 +134,9 @@ _data = { &"punch": SubResource("Animation_llq31") } +[sub_resource type="BoxShape3D" id="BoxShape3D_iwgew"] +size = Vector3(1, 0.05, 1.2) + [node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("weapon_holder") groups=["persist", "player"]] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1, 0) collision_layer = 4 @@ -379,28 +382,16 @@ target_position = Vector3(0, 0, 1) [node name="WallJumpTimer" type="Timer" parent="."] one_shot = true -[node name="LedgeLRay" type="RayCast3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.2, 0.969, -0.509) - -[node name="LedgeRRay" type="RayCast3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.2, 0.969, -0.509) - -[node name="ClamberMaxRay" type="RayCast3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.17686, 0.00231841) -target_position = Vector3(0, 0, -1) -collision_mask = 33 - -[node name="ClamberPointRay" type="RayCast3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.987695, -0.600275) -target_position = Vector3(0, -1.995, 0) -collision_mask = 33 - [node name="ClamberCheckRay" type="RayCast3D" parent="."] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.607088, -0.279418) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.795024, -0.279418) target_position = Vector3(0, 0, -1.5) collision_mask = 33 hit_back_faces = false +[node name="LedgeCollision" type="CollisionShape3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.835043, -0.762861) +shape = SubResource("BoxShape3D_iwgew") + [connection signal="tree_entered" from="." to="." method="_on_tree_entered"] [connection signal="body_entered" from="pick_up_detection" to="." method="_on_pick_up_detection_body_entered"] [connection signal="body_entered" from="pick_up_magnet" to="." method="_on_pick_up_magnet_body_entered"] diff --git a/scripts/PlayerStates.gd b/scripts/PlayerStates.gd index 171a68f..b923297 100644 --- a/scripts/PlayerStates.gd +++ b/scripts/PlayerStates.gd @@ -17,15 +17,23 @@ func standard_movement(delta): func jump_with_weight_mod(): character.velocity.y += character.JUMP_VELOCITY * character.speed_modifiers() +func ledge_grab(): + if Input.is_action_pressed("interact"): + character.ledge_collision.disabled = false + else: + character.ledge_collision.disabled = true + +func is_grabbing_ledge(): + if character.ledge_collision.disabled == false: + return true + + return false + func standard_jump(): if Input.is_action_just_pressed("jump"): - #first check for clamber, otherwise jump - if character.can_clamber(): - Transitioned.emit(self,"ledge grab") - else: - if character.jumps_remaining > 0: - character.jumps_remaining -= 1 - jump_with_weight_mod() + if character.jumps_remaining > 0: + character.jumps_remaining -= 1 + jump_with_weight_mod() func apply_gravity(delta): character.velocity.y -= 9.8 * 1.25 * delta diff --git a/scripts/player.gd b/scripts/player.gd index fc422dc..db5d31d 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -144,6 +144,8 @@ var controlled_elsewhere = false @onready var clamber_point_ray: RayCast3D = $ClamberPointRay @onready var ledge_l_ray: RayCast3D = $LedgeLRay @onready var ledge_r_ray: RayCast3D = $LedgeRRay +@onready var ledge_collision: CollisionShape3D = $LedgeCollision + func _ready(): level_control.player = self diff --git a/scripts/player_jumping.gd b/scripts/player_jumping.gd index c211d7a..863fa6e 100644 --- a/scripts/player_jumping.gd +++ b/scripts/player_jumping.gd @@ -13,14 +13,9 @@ func Physics_Update(delta): standard_movement(delta) apply_gravity(delta) - standard_jump() - - if character.is_on_floor(): + if character.is_on_floor() and !is_grabbing_ledge(): Transitioned.emit(self,"on foot") - enable_wall_rays() - - if Input.is_action_just_pressed("sprint") and air_dash_left > 0: air_dash_left -= 1 character.velocity += character.movement_input().normalized() * air_dash_amount @@ -28,5 +23,13 @@ func Physics_Update(delta): if Input.is_action_just_pressed("crouch"): Transitioned.emit(self,"ground pound") + enable_wall_rays() + if can_wall_run(): start_wall_running() + + standard_jump() + ledge_grab() + +func Exit(): + character.ledge_collision.disabled = true