钩爪抓住下侧直接启动矿车逻辑

This commit is contained in:
RedisTKey 2026-01-14 23:34:00 +08:00
parent 876d08c4df
commit 0f8dcdd4b5
12 changed files with 147 additions and 320 deletions

View File

@ -5,11 +5,11 @@ func _ready() -> void:
#$L1_S1.switch_act_by_id(1)
#$L1_S2.switch_act_by_id(1)
#$L1_S3.switch_act_by_id(1)
#$L1_S4.switch_act_by_id(1)
$L1_S4.switch_act_by_id(1)
#$L1_S5.switch_act_by_id(1)
#$L1_S6.switch_act_by_id(1)
#$L1_S7.switch_act_by_id(1)
$L1_S8.switch_act_by_id(1)
#$L1_S8.switch_act_by_id(1)
#$L1_S9.switch_act_by_id(1)
await get_tree().process_frame
get_tree().call_group(&"PLAYER_RESPAWN",&"respawn_avatar")

View File

@ -1,8 +1,49 @@
[gd_scene load_steps=2 format=3 uid="uid://cpbaoqfc2kq80"]
[gd_scene load_steps=8 format=3 uid="uid://cpbaoqfc2kq80"]
[ext_resource type="Script" uid="uid://decr4caey82gc" path="res://_props/move_plateform/path_drive_move_plateform/path_drive_move_plateform.gd" id="1_ouylf"]
[ext_resource type="PackedScene" uid="uid://csdxpv8gefpec" path="res://_props/_prefabs/plateform/movable_plateform.tscn" id="2_yo6tx"]
[ext_resource type="Texture2D" uid="uid://c673bap4b12fx" path="res://icon.svg" id="3_l54kj"]
[ext_resource type="PackedScene" uid="uid://bonrls3iuhdqb" path="res://_props/_prefabs/player/player_trigger_volumn.tscn" id="4_ylwpt"]
[node name="PathDriveMovePlateform" type="Node2D"]
[sub_resource type="RectangleShape2D" id="RectangleShape2D_82l4y"]
size = Vector2(120, 120)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_k2ua5"]
size = Vector2(130, 130)
[sub_resource type="Curve2D" id="Curve2D_yo6tx"]
_data = {
"points": PackedVector2Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 0)
}
point_count = 2
[node name="PathDriveMovePlateform" type="Node2D" node_paths=PackedStringArray("path2d", "plateform", "player_trigger")]
script = ExtResource("1_ouylf")
move_speed = 600.0
path2d = NodePath("Path2D")
plateform = NodePath("MovablePlateform")
player_trigger = NodePath("MovablePlateform/PlayerTriggerVolumn")
move_speed = 1200.0
returning_speed = 300.0
acceleration = 1600.0
[node name="MovablePlateform" parent="." node_paths=PackedStringArray("shaking_target") instance=ExtResource("2_yo6tx")]
shaking_target = NodePath("Sprite2D")
shake_strength = 1.0
shake_duration = 1.0
shake_hz = 48.0
[node name="Sprite2D" type="Sprite2D" parent="MovablePlateform"]
texture = ExtResource("3_l54kj")
[node name="CollisionShape2D" type="CollisionShape2D" parent="MovablePlateform"]
shape = SubResource("RectangleShape2D_82l4y")
debug_color = Color(1.7409995, 0, 0.33381775, 0.41960785)
[node name="PlayerTriggerVolumn" parent="MovablePlateform" instance=ExtResource("4_ylwpt")]
debug_print = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="MovablePlateform/PlayerTriggerVolumn"]
shape = SubResource("RectangleShape2D_k2ua5")
[node name="Path2D" type="Path2D" parent="."]
curve = SubResource("Curve2D_yo6tx")

View File

@ -51,6 +51,23 @@ func change_state(state:State) -> void:
pass
## 当玩家钩爪击中平台底部时,直接激活平台(跳过 READY 状态)
func on_hook_hit(hit_global_pos: Vector2) -> void:
# 检测击中点是否在平台底部(击中点的 Y 大于等于平台的顶部)
var platform_top := plateform.global_position.y
# 考虑到碰撞体可能有偏移,稍微放宽条件
var is_bottom_hit := hit_global_pos.y >= platform_top - 10
if not is_bottom_hit:
return
# 只有在 IDLE 或 READY 状态才能被激活
if _current_state != State.IDLE and _current_state != State.READY:
return
# 直接进入 MOVING 状态
start_move()
## 当平台被触发时,切换状态
func _on_trigger() -> void:
change_state(State.READY)

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=47 format=4 uid="uid://dsw3o2bhc8bve"]
[gd_scene load_steps=43 format=4 uid="uid://dsw3o2bhc8bve"]
[ext_resource type="Script" uid="uid://5e157vdk6175" path="res://addons/reedscene/scene/ReedScene.gd" id="1_7cppx"]
[ext_resource type="Script" uid="uid://bh066o84byplh" path="res://addons/reedscene/scene/ReedSceneID.gd" id="2_4mxpo"]
@ -25,8 +25,6 @@
[ext_resource type="TileSet" uid="uid://doepkfp83k0lb" path="res://_tileset/test.tres" id="23_6lqui"]
[ext_resource type="PackedScene" uid="uid://bju8jr1w4d60m" path="res://_props/spring/spring.tscn" id="24_0k4x8"]
[ext_resource type="PackedScene" uid="uid://cpbaoqfc2kq80" path="res://_props/move_plateform/path_drive_move_plateform/PathDriveMovePlateform.tscn" id="25_ldp4y"]
[ext_resource type="PackedScene" uid="uid://csdxpv8gefpec" path="res://_props/_prefabs/plateform/movable_plateform.tscn" id="26_k1jrx"]
[ext_resource type="Texture2D" uid="uid://c673bap4b12fx" path="res://icon.svg" id="27_lte3x"]
[ext_resource type="PackedScene" uid="uid://b5nx4dntm0gyn" path="res://_props/door_manager/event_trigger_door.tscn" id="28_4mxpo"]
[sub_resource type="Resource" id="Resource_6bhoi"]
@ -105,15 +103,9 @@ effect_target_type = SubResource("Resource_o2v7x")
effect_apply_type = SubResource("Resource_hatj6")
metadata/_custom_type_script = "uid://cdvgq0xqdbagk"
[sub_resource type="RectangleShape2D" id="RectangleShape2D_xevr6"]
size = Vector2(60, 60)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_bhcjt"]
size = Vector2(65, 66)
[sub_resource type="Curve2D" id="Curve2D_fvh1v"]
[sub_resource type="Curve2D" id="Curve2D_glu07"]
_data = {
"points": PackedVector2Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 495.975, 0)
"points": PackedVector2Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0)
}
point_count = 2
@ -229,41 +221,17 @@ position = Vector2(920, -1480)
[node name="spring6" parent="." instance=ExtResource("24_0k4x8")]
position = Vector2(1000, -1480)
[node name="PathDriveMovePlateform2" parent="." node_paths=PackedStringArray("path2d", "plateform", "player_trigger") instance=ExtResource("25_ldp4y")]
[node name="PathDriveMovePlateform2" parent="." instance=ExtResource("25_ldp4y")]
position = Vector2(1164, -1762)
path2d = NodePath("Path2D")
plateform = NodePath("MovablePlateform")
player_trigger = NodePath("MovablePlateform/PlayerTriggerVolumn")
move_speed = 300.0
returning_speed = 100.0
acceleration = 1000.0
[node name="MovablePlateform" parent="PathDriveMovePlateform2" node_paths=PackedStringArray("shaking_target") instance=ExtResource("26_k1jrx")]
shaking_target = NodePath("Sprite2D")
shake_strength = 1.0
shake_duration = 1.0
shake_hz = 48.0
[node name="Sprite2D" type="Sprite2D" parent="PathDriveMovePlateform2/MovablePlateform"]
[node name="MovablePlateform" parent="PathDriveMovePlateform2" index="0"]
scale = Vector2(0.4, 0.4)
texture = ExtResource("27_lte3x")
[node name="CollisionShape2D" type="CollisionShape2D" parent="PathDriveMovePlateform2/MovablePlateform"]
scale = Vector2(0.8, 0.8)
shape = SubResource("RectangleShape2D_xevr6")
debug_color = Color(1.7409995, 0, 0.33381775, 0.41960785)
[node name="PlayerTriggerVolumn" parent="PathDriveMovePlateform2/MovablePlateform" instance=ExtResource("17_5ludb")]
position = Vector2(-0.5, 0)
debug_print = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="PathDriveMovePlateform2/MovablePlateform/PlayerTriggerVolumn"]
scale = Vector2(0.8, 0.8)
shape = SubResource("RectangleShape2D_bhcjt")
[node name="Path2D" type="Path2D" parent="PathDriveMovePlateform2"]
scale = Vector2(1, 0.8)
curve = SubResource("Curve2D_fvh1v")
[node name="Path2D" parent="PathDriveMovePlateform2" index="1"]
curve = SubResource("Curve2D_glu07")
[node name="EventTriggerDoor" parent="." instance=ExtResource("28_4mxpo")]
position = Vector2(1367, -2553)
@ -271,3 +239,5 @@ rotation = -1.5707964
scale = Vector2(0.64, 0.64)
[connection signal="player_entered" from="Props/PlayerTriggerVolumn" to="SceneManager" method="_on_player_trigger_volumn_player_entered"]
[editable path="PathDriveMovePlateform2"]

File diff suppressed because one or more lines are too long

View File

@ -124,7 +124,6 @@ limit_top = 350
limit_bottom = -255
limit_left = -430
limit_right = 415
follow_player = true
[node name="[Prop_0000]" type="Node" parent="Props/CameraAnchor"]
script = ExtResource("9_03jph")

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=47 format=4 uid="uid://dcoq4q3brnkw6"]
[gd_scene load_steps=43 format=4 uid="uid://dcoq4q3brnkw6"]
[ext_resource type="Script" uid="uid://5e157vdk6175" path="res://addons/reedscene/scene/ReedScene.gd" id="1_7313i"]
[ext_resource type="Script" uid="uid://bh066o84byplh" path="res://addons/reedscene/scene/ReedSceneID.gd" id="2_hxiiq"]
@ -26,8 +26,6 @@
[ext_resource type="PackedScene" uid="uid://bju8jr1w4d60m" path="res://_props/spring/spring.tscn" id="26_qrhk0"]
[ext_resource type="PackedScene" uid="uid://cpbaoqfc2kq80" path="res://_props/move_plateform/path_drive_move_plateform/PathDriveMovePlateform.tscn" id="27_vqrg5"]
[ext_resource type="PackedScene" uid="uid://iv8w7iisdqm0" path="res://_props/fragile_rock/fragile_rock.tscn" id="28_mso2b"]
[ext_resource type="PackedScene" uid="uid://csdxpv8gefpec" path="res://_props/_prefabs/plateform/movable_plateform.tscn" id="28_opxyd"]
[ext_resource type="Texture2D" uid="uid://c673bap4b12fx" path="res://icon.svg" id="29_b7vlt"]
[sub_resource type="Resource" id="Resource_6bhoi"]
script = ExtResource("8_kk8q0")
@ -105,15 +103,9 @@ effect_target_type = SubResource("Resource_o2v7x")
effect_apply_type = SubResource("Resource_hatj6")
metadata/_custom_type_script = "uid://cdvgq0xqdbagk"
[sub_resource type="RectangleShape2D" id="RectangleShape2D_xevr6"]
size = Vector2(60, 60)
[sub_resource type="RectangleShape2D" id="RectangleShape2D_bhcjt"]
size = Vector2(65, 66)
[sub_resource type="Curve2D" id="Curve2D_fvh1v"]
[sub_resource type="Curve2D" id="Curve2D_ll203"]
_data = {
"points": PackedVector2Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 495.975, 0)
"points": PackedVector2Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 506, 0)
}
point_count = 2
@ -145,7 +137,6 @@ limit_top = -185
limit_bottom = 185
limit_left = -320
limit_right = 290
follow_player = true
[node name="[Prop_0000]" type="Node" parent="Props/CameraAnchor"]
script = ExtResource("11_gkqbq")
@ -228,43 +219,21 @@ position = Vector2(920, -1480)
[node name="spring6" parent="." instance=ExtResource("26_qrhk0")]
position = Vector2(1000, -1480)
[node name="PathDriveMovePlateform2" parent="." node_paths=PackedStringArray("path2d", "plateform", "player_trigger") instance=ExtResource("27_vqrg5")]
[node name="PathDriveMovePlateform2" parent="." instance=ExtResource("27_vqrg5")]
position = Vector2(520, -1752)
path2d = NodePath("Path2D")
plateform = NodePath("MovablePlateform")
player_trigger = NodePath("MovablePlateform/PlayerTriggerVolumn")
move_speed = 300.0
returning_speed = 100.0
acceleration = 1000.0
[node name="MovablePlateform" parent="PathDriveMovePlateform2" node_paths=PackedStringArray("shaking_target") instance=ExtResource("28_opxyd")]
shaking_target = NodePath("Sprite2D")
shake_strength = 1.0
shake_duration = 1.0
shake_hz = 48.0
[node name="MovablePlateform" parent="PathDriveMovePlateform2" index="0"]
scale = Vector2(0.5, 0.5)
[node name="Sprite2D" type="Sprite2D" parent="PathDriveMovePlateform2/MovablePlateform"]
scale = Vector2(0.4, 0.4)
texture = ExtResource("29_b7vlt")
[node name="CollisionShape2D" type="CollisionShape2D" parent="PathDriveMovePlateform2/MovablePlateform"]
scale = Vector2(0.8, 0.8)
shape = SubResource("RectangleShape2D_xevr6")
debug_color = Color(1.7409995, 0, 0.33381775, 0.41960785)
[node name="PlayerTriggerVolumn" parent="PathDriveMovePlateform2/MovablePlateform" instance=ExtResource("17_wewc2")]
position = Vector2(-0.5, 0)
debug_print = true
[node name="CollisionShape2D" type="CollisionShape2D" parent="PathDriveMovePlateform2/MovablePlateform/PlayerTriggerVolumn"]
scale = Vector2(0.8, 0.8)
shape = SubResource("RectangleShape2D_bhcjt")
[node name="Path2D" type="Path2D" parent="PathDriveMovePlateform2"]
scale = Vector2(1, 0.8)
curve = SubResource("Curve2D_fvh1v")
[node name="Path2D" parent="PathDriveMovePlateform2" index="1"]
curve = SubResource("Curve2D_ll203")
[node name="FragileRock" parent="." instance=ExtResource("28_mso2b")]
position = Vector2(840, -1752)
[connection signal="player_entered" from="Props/PlayerTriggerVolumn" to="SceneManager" method="_on_player_trigger_volumn_player_entered"]
[editable path="PathDriveMovePlateform2"]

View File

@ -19,6 +19,8 @@ var _tween: Tween
const GRAPABLE_GROUP = &"GRAPABLE"
signal stretching_finished(reach_limit: bool, anchor_node: Node2D)
## 钩爪击中物体信号target 是被击中的物体hit_pos 是击中点世界坐标
signal hook_hit(target: Node2D, hit_pos: Vector2)
## ================
## Private Field
@ -126,6 +128,13 @@ func _handle_hit(target: Node2D, hit_pos: Vector2) -> void:
ray.target_position = to_local(hit_pos)
# 如果 target 有 on_hook_hit 方法,调用它
if target.has_method(&"on_hook_hit"):
target.on_hook_hit(hit_pos)
if target.owner.has_method(&"on_hook_hit"):
target.owner.on_hook_hit(hit_pos)
var reach_max := is_equal_approx(_current_length, max_length)
var anchor := _create_anchor_on_node(target, hit_pos)