playing with physical ledge grab

This commit is contained in:
derek
2025-06-17 13:57:04 -05:00
parent 8220db9a57
commit a33f493a04
4 changed files with 35 additions and 31 deletions

View File

@@ -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://bieeh1iro4ji1" path="res://scripts/player.gd" id="1_x7wms"]
[ext_resource type="Script" uid="uid://linvnr16djav" path="res://scripts/PlayerStateMachine.gd" id="2_1npgd"] [ext_resource type="Script" uid="uid://linvnr16djav" path="res://scripts/PlayerStateMachine.gd" id="2_1npgd"]
@@ -134,6 +134,9 @@ _data = {
&"punch": SubResource("Animation_llq31") &"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"]] [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) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1, 0)
collision_layer = 4 collision_layer = 4
@@ -379,28 +382,16 @@ target_position = Vector3(0, 0, 1)
[node name="WallJumpTimer" type="Timer" parent="."] [node name="WallJumpTimer" type="Timer" parent="."]
one_shot = true 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="."] [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) target_position = Vector3(0, 0, -1.5)
collision_mask = 33 collision_mask = 33
hit_back_faces = false 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="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_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"] [connection signal="body_entered" from="pick_up_magnet" to="." method="_on_pick_up_magnet_body_entered"]

View File

@@ -17,12 +17,20 @@ func standard_movement(delta):
func jump_with_weight_mod(): func jump_with_weight_mod():
character.velocity.y += character.JUMP_VELOCITY * character.speed_modifiers() 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(): func standard_jump():
if Input.is_action_just_pressed("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: if character.jumps_remaining > 0:
character.jumps_remaining -= 1 character.jumps_remaining -= 1
jump_with_weight_mod() jump_with_weight_mod()

View File

@@ -144,6 +144,8 @@ var controlled_elsewhere = false
@onready var clamber_point_ray: RayCast3D = $ClamberPointRay @onready var clamber_point_ray: RayCast3D = $ClamberPointRay
@onready var ledge_l_ray: RayCast3D = $LedgeLRay @onready var ledge_l_ray: RayCast3D = $LedgeLRay
@onready var ledge_r_ray: RayCast3D = $LedgeRRay @onready var ledge_r_ray: RayCast3D = $LedgeRRay
@onready var ledge_collision: CollisionShape3D = $LedgeCollision
func _ready(): func _ready():
level_control.player = self level_control.player = self

View File

@@ -13,14 +13,9 @@ func Physics_Update(delta):
standard_movement(delta) standard_movement(delta)
apply_gravity(delta) apply_gravity(delta)
standard_jump() if character.is_on_floor() and !is_grabbing_ledge():
if character.is_on_floor():
Transitioned.emit(self,"on foot") Transitioned.emit(self,"on foot")
enable_wall_rays()
if Input.is_action_just_pressed("sprint") and air_dash_left > 0: if Input.is_action_just_pressed("sprint") and air_dash_left > 0:
air_dash_left -= 1 air_dash_left -= 1
character.velocity += character.movement_input().normalized() * air_dash_amount character.velocity += character.movement_input().normalized() * air_dash_amount
@@ -28,5 +23,13 @@ func Physics_Update(delta):
if Input.is_action_just_pressed("crouch"): if Input.is_action_just_pressed("crouch"):
Transitioned.emit(self,"ground pound") Transitioned.emit(self,"ground pound")
enable_wall_rays()
if can_wall_run(): if can_wall_run():
start_wall_running() start_wall_running()
standard_jump()
ledge_grab()
func Exit():
character.ledge_collision.disabled = true