diff --git a/_asset/ksw/未命名作品(3).png b/_asset/ksw/未命名作品(3).png new file mode 100644 index 0000000..33e2b25 Binary files /dev/null and b/_asset/ksw/未命名作品(3).png differ diff --git a/_asset/ksw/未命名作品(3).png.import b/_asset/ksw/未命名作品(3).png.import new file mode 100644 index 0000000..b804bf8 --- /dev/null +++ b/_asset/ksw/未命名作品(3).png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cw1lcd672mq87" +path="res://.godot/imported/未命名作品(3).png-5152e47ab8192492e0d911592bc8c8f5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://_asset/ksw/未命名作品(3).png" +dest_files=["res://.godot/imported/未命名作品(3).png-5152e47ab8192492e0d911592bc8c8f5.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/_game/GameMain.tscn b/_game/GameMain.tscn index d8b8793..40966c3 100644 --- a/_game/GameMain.tscn +++ b/_game/GameMain.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=18 format=3 uid="uid://3vc8ojbiyy5w"] +[gd_scene load_steps=15 format=3 uid="uid://3vc8ojbiyy5w"] [ext_resource type="Script" uid="uid://crgac4manhoud" path="res://_game/game.gd" id="1_yksyv"] [ext_resource type="PackedScene" uid="uid://cvqehvdjpoar4" path="res://_player/player_controller.tscn" id="2_x2i0j"] @@ -14,26 +14,6 @@ [ext_resource type="PackedScene" uid="uid://2d457ndb7toe" path="res://_scene/level1/l1_s8.tscn" id="11_ktxjv"] [ext_resource type="PackedScene" uid="uid://dcoq4q3brnkw6" path="res://_scene/level1/l1_s9.tscn" id="12_enubi"] [ext_resource type="PackedScene" uid="uid://dsw3o2bhc8bve" path="res://_scene/level1/l1_s10.tscn" id="13_53pmm"] -[ext_resource type="Script" uid="uid://c5in610cunjn2" path="res://_game/water_warp_controller.gd" id="15_jibn5"] -[ext_resource type="Shader" uid="uid://ccpo4346to8ka" path="res://_shader/ripple2.gdshader" id="16_ef7py"] - -[sub_resource type="ShaderMaterial" id="ShaderMaterial_5vsgs"] -shader = ExtResource("16_ef7py") -shader_parameter/debug_show = false -shader_parameter/obj_uv = Vector2(0.5, 0.5) -shader_parameter/obj_dir = Vector2(1, 0) -shader_parameter/obj_speed = 1.0 -shader_parameter/lane_half_width = 0.085 -shader_parameter/edge_width = 0.04 -shader_parameter/trail_length = 0.55 -shader_parameter/push_strength = 0.075 -shader_parameter/drag_strength = 0.045 -shader_parameter/suck_strength = 0.03 -shader_parameter/curl_strength = 0.07 -shader_parameter/foam_strength = 0.45 -shader_parameter/noise_scale = 3.5 -shader_parameter/noise_advect = 0.5 -shader_parameter/chroma_shift = 0.6 [node name="Game" type="Node2D" groups=["PLAYER_RESPAWN"]] script = ExtResource("1_yksyv") @@ -63,15 +43,3 @@ script = ExtResource("1_yksyv") [node name="L1_S9" parent="." instance=ExtResource("12_enubi")] [node name="L1_S10" parent="." instance=ExtResource("13_53pmm")] - -[node name="WaterWarp" type="CanvasLayer" parent="." node_paths=PackedStringArray("target")] -script = ExtResource("15_jibn5") -target = NodePath("../PlayerController") - -[node name="ColorRect" type="ColorRect" parent="WaterWarp"] -material = SubResource("ShaderMaterial_5vsgs") -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 diff --git a/_props/dark_material_ball/dark_material_ball.gd b/_props/dark_material_ball/dark_material_ball.gd index a0daf5b..4c7f5de 100644 --- a/_props/dark_material_ball/dark_material_ball.gd +++ b/_props/dark_material_ball/dark_material_ball.gd @@ -57,6 +57,12 @@ func _physics_process(delta: float) -> void: velocity = direction * pull_speed move_and_slide() +func get_attraction_force(pos: Vector2) -> Vector2: + # 返回 (direction, strength) 格式 + var dir := (global_position - pos).normalized() + var strength := 1500 # 调整这个值控制吸引力转向速度 + return dir * strength + ##如果玩家进入收集区域,则切换为已收集状态。 func _on_player_collected(body:CharacterBody2D) -> void: if body is Player: diff --git a/_props/dark_material_ball/dark_material_ball.tscn b/_props/dark_material_ball/dark_material_ball.tscn index f3b1b31..bfdccad 100644 --- a/_props/dark_material_ball/dark_material_ball.tscn +++ b/_props/dark_material_ball/dark_material_ball.tscn @@ -17,6 +17,7 @@ radius = 34.0147 collision_layer = 16 collision_mask = 2 script = ExtResource("1_8vsnl") +pull_speed = null [node name="Sprite2D" type="Sprite2D" parent="."] unique_name_in_owner = true @@ -36,7 +37,7 @@ debug_color = Color(0.19215687, 0.6431373, 0, 0) [node name="HookAttractVolumn" type="Area2D" parent="."] unique_name_in_owner = true -collision_layer = 16 +collision_layer = 32 collision_mask = 0 [node name="CollisionShape2D" type="CollisionShape2D" parent="HookAttractVolumn"] diff --git a/_scene/level1/l0_s0.tscn b/_scene/level1/l0_s0.tscn index 042dd1f..376f7c8 100644 --- a/_scene/level1/l0_s0.tscn +++ b/_scene/level1/l0_s0.tscn @@ -225,12 +225,16 @@ tile_set = ExtResource("24_uiy5k") [node name="DarkMaterialBall" parent="." instance=ExtResource("30_mu7ca")] position = Vector2(-164, 1283) +pull_speed = 800.0 [node name="DarkMaterialBall2" parent="." instance=ExtResource("30_mu7ca")] position = Vector2(116, 1076) +pull_speed = 800.0 [node name="DarkMaterialBall3" parent="." instance=ExtResource("30_mu7ca")] position = Vector2(33, 1188) +pull_speed = 800.0 [node name="DarkMaterialBall4" parent="." instance=ExtResource("30_mu7ca")] position = Vector2(-78, 1192) +pull_speed = 800.0 diff --git a/_scene/level1/l1_s1_new.tscn b/_scene/level1/l1_s1_new.tscn index 334d65f..ee6dbea 100644 --- a/_scene/level1/l1_s1_new.tscn +++ b/_scene/level1/l1_s1_new.tscn @@ -183,5 +183,5 @@ effects = Array[ExtResource("14_37hpe")]([SubResource("Resource_ubvm0")]) [node name="TileMapLayer" type="TileMapLayer" parent="." groups=["GRAPABLE"]] texture_filter = 1 -tile_map_data = PackedByteArray("AAD7/wIAAAAGAAMAAAD8/wIAAAACAAIAAAD9/wIAAAACAAIAAAD+/wIAAAACAAIAAAD//wIAAAACAAIAAAAAAAIAAAACAAIAAAABAAIAAAACAAIAAAACAAIAAAACAAIAAAADAAIAAAACAAIAAAD7//v/AAACAAIAAAD7//z/AAADAAIAAAD7//3/AAADAAIAAAD7//7/AAADAAIAAAD7////AAADAAIAAAD7/wAAAAADAAIAAAD7/wEAAAADAAIAAAD8//n/AAACAAIAAAD8//r/AAACAAIAAAD8//v/AAACAAIAAAD9//n/AAACAAIAAAD9//r/AAACAAIAAADu//H/AAACAAIAAADu//L/AAACAAIAAADu//P/AAACAAIAAADu//T/AAACAAIAAADu//X/AAACAAIAAADu//b/AAACAAIAAADu//f/AAACAAIAAADu//j/AAACAAIAAADu//n/AAACAAIAAADu//r/AAACAAIAAADu//v/AAACAAIAAADu//z/AAACAAIAAADu//3/AAACAAIAAADu//7/AAACAAIAAADu////AAACAAIAAADu/wAAAAACAAIAAADu/wEAAAACAAIAAADu/wIAAAACAAIAAADu/wMAAAACAAIAAADu/wQAAAACAAIAAADu/wUAAAACAAIAAADv//H/AAACAAIAAADv//L/AAACAAIAAADv//P/AAACAAIAAADv//T/AAACAAIAAADv//X/AAACAAIAAADv//b/AAACAAIAAADv//f/AAACAAIAAADv//j/AAACAAIAAADv//n/AAACAAIAAADv//r/AAACAAIAAADv//v/AAACAAIAAADv//z/AAACAAIAAADv//3/AAACAAIAAADv//7/AAACAAIAAADv////AAACAAIAAADv/wAAAAACAAIAAADv/wEAAAACAAIAAADv/wIAAAACAAIAAADv/wMAAAACAAIAAADv/wQAAAACAAIAAADv/wUAAAACAAIAAADw//H/AAACAAIAAADw//L/AAACAAIAAADw//P/AAACAAIAAADw//T/AAACAAIAAADw//X/AAACAAIAAADw//b/AAACAAIAAADw//f/AAACAAIAAADw//j/AAACAAIAAADw//n/AAACAAIAAADw//r/AAACAAIAAADw//v/AAACAAIAAADw//z/AAACAAIAAADw//3/AAACAAIAAADw//7/AAACAAIAAADw////AAACAAIAAADw/wAAAAACAAIAAADw/wEAAAACAAIAAADw/wIAAAACAAIAAADw/wMAAAACAAIAAADw/wQAAAACAAIAAADw/wUAAAACAAIAAADx//H/AAACAAIAAADx//L/AAACAAIAAADx//P/AAACAAIAAADx//T/AAACAAIAAADx//X/AAACAAIAAADx//b/AAACAAIAAADx//f/AAACAAIAAADx//j/AAACAAIAAADx//n/AAACAAIAAADx//r/AAACAAIAAADx//v/AAACAAIAAADx//z/AAACAAIAAADx//3/AAACAAIAAADx//7/AAACAAIAAADx////AAACAAIAAADx/wAAAAACAAIAAADx/wEAAAACAAIAAADx/wIAAAACAAIAAADx/wMAAAACAAIAAADx/wQAAAACAAIAAADx/wUAAAACAAIAAADy//H/AAACAAIAAADy//L/AAACAAIAAADy//P/AAACAAIAAADy//T/AAACAAIAAADy//X/AAACAAIAAADy//b/AAACAAIAAADy//f/AAACAAIAAADy//j/AAACAAIAAADy//n/AAACAAIAAADy//r/AAACAAIAAADy//v/AAACAAIAAADy//z/AAACAAIAAADy//3/AAACAAIAAADy//7/AAACAAIAAADy////AAACAAIAAADy/wAAAAACAAIAAADy/wEAAAACAAIAAADy/wIAAAACAAIAAADy/wMAAAACAAIAAADy/wQAAAACAAIAAADy/wUAAAACAAIAAADz//H/AAACAAIAAADz//L/AAACAAIAAADz//P/AAACAAIAAADz//T/AAACAAIAAADz//X/AAACAAIAAADz//b/AAACAAIAAADz//f/AAACAAIAAADz//j/AAACAAIAAADz//n/AAACAAIAAADz//r/AAACAAIAAADz//v/AAACAAIAAADz//z/AAACAAIAAADz//3/AAACAAIAAADz//7/AAACAAIAAADz////AAACAAIAAADz/wAAAAACAAIAAADz/wEAAAACAAIAAADz/wIAAAACAAIAAADz/wMAAAACAAIAAADz/wQAAAACAAIAAADz/wUAAAACAAIAAAD0//H/AAACAAIAAAD0//L/AAACAAIAAAD0//P/AAACAAIAAAD0//T/AAACAAIAAAD0//X/AAACAAIAAAD0//b/AAACAAIAAAD0//f/AAACAAIAAAD0//j/AAACAAIAAAD0//n/AAACAAIAAAD0//r/AAACAAIAAAD0//v/AAACAAIAAAD0//z/AAACAAIAAAD0//3/AAACAAIAAAD0//7/AAACAAIAAAD0////AAACAAIAAAD0/wAAAAACAAIAAAD0/wEAAAACAAIAAAD0/wIAAAACAAIAAAD0/wMAAAACAAIAAAD0/wQAAAACAAIAAAD0/wUAAAACAAIAAAD1//H/AAACAAIAAAD1//L/AAACAAIAAAD1//P/AAACAAIAAAD1//T/AAACAAIAAAD1//X/AAACAAIAAAD1//b/AAACAAIAAAD1//f/AAACAAIAAAD1//j/AAACAAIAAAD1//n/AAACAAIAAAD1//r/AAACAAIAAAD1//v/AAACAAIAAAD1//z/AAACAAIAAAD1//3/AAACAAIAAAD1//7/AAACAAIAAAD1////AAACAAIAAAD1/wAAAAACAAIAAAD1/wEAAAACAAIAAAD1/wIAAAACAAIAAAD1/wMAAAACAAIAAAD1/wQAAAACAAIAAAD1/wUAAAACAAIAAAD2//H/AAACAAIAAAD2//L/AAACAAIAAAD2//P/AAACAAIAAAD2//T/AAACAAIAAAD2//X/AAACAAIAAAD2//b/AAACAAIAAAD2//f/AAACAAIAAAD2//j/AAACAAIAAAD2//n/AAACAAIAAAD2//r/AAACAAIAAAD2//v/AAACAAIAAAD2//z/AAACAAIAAAD2//3/AAACAAIAAAD2//7/AAACAAIAAAD2////AAACAAIAAAD2/wAAAAACAAIAAAD2/wEAAAACAAIAAAD2/wIAAAACAAIAAAD2/wMAAAACAAIAAAD2/wQAAAACAAIAAAD2/wUAAAACAAIAAAD3//H/AAACAAIAAAD3//L/AAACAAIAAAD3//P/AAACAAIAAAD3//T/AAACAAIAAAD3//X/AAACAAIAAAD3//b/AAACAAIAAAD3//f/AAACAAIAAAD3//j/AAACAAIAAAD3//n/AAACAAIAAAD3//r/AAACAAIAAAD3//v/AAACAAIAAAD3//z/AAACAAIAAAD3//3/AAACAAIAAAD3//7/AAACAAIAAAD3////AAACAAIAAAD3/wAAAAACAAIAAAD3/wEAAAACAAIAAAD3/wIAAAACAAIAAAD3/wMAAAACAAIAAAD3/wQAAAACAAIAAAD3/wUAAAACAAIAAAD4//H/AAACAAIAAAD4//L/AAACAAIAAAD4//P/AAACAAIAAAD4//T/AAACAAIAAAD4//X/AAACAAIAAAD4//b/AAACAAIAAAD4//f/AAACAAIAAAD4//j/AAACAAIAAAD4//n/AAACAAIAAAD4//r/AAACAAIAAAD4//v/AAACAAIAAAD4//z/AAACAAIAAAD4//3/AAACAAIAAAD4//7/AAACAAIAAAD4////AAACAAIAAAD4/wAAAAACAAIAAAD4/wEAAAACAAIAAAD4/wIAAAACAAIAAAD4/wMAAAACAAIAAAD4/wQAAAACAAIAAAD4/wUAAAACAAIAAAD5//H/AAACAAIAAAD5//L/AAACAAIAAAD5//P/AAACAAIAAAD5//T/AAACAAIAAAD5//X/AAACAAIAAAD5//b/AAACAAIAAAD5//f/AAACAAIAAAD5//j/AAACAAIAAAD5//n/AAACAAIAAAD5//r/AAACAAIAAAD5//v/AAACAAIAAAD5//z/AAACAAIAAAD5//3/AAACAAIAAAD5//7/AAACAAIAAAD5////AAACAAIAAAD5/wAAAAACAAIAAAD5/wEAAAACAAIAAAD5/wIAAAACAAIAAAD5/wMAAAACAAIAAAD5/wQAAAACAAIAAAD5/wUAAAACAAIAAAD6//H/AAACAAIAAAD6//L/AAACAAIAAAD6//P/AAACAAIAAAD6//T/AAACAAIAAAD6//X/AAACAAIAAAD6//b/AAACAAIAAAD6//f/AAACAAIAAAD6//j/AAACAAIAAAD6//n/AAACAAIAAAD6//r/AAACAAIAAAD6//v/AAACAAIAAAD6//z/AAACAAIAAAD6//3/AAACAAIAAAD6//7/AAACAAIAAAD6////AAACAAIAAAD6/wAAAAACAAIAAAD6/wEAAAACAAIAAAD6/wIAAAACAAIAAAD6/wMAAAACAAIAAAD6/wQAAAACAAIAAAD6/wUAAAACAAIAAAD7/wMAAAACAAIAAAD7/wQAAAACAAIAAAD7/wUAAAACAAIAAAD7/wYAAAACAAIAAAD8/wMAAAACAAIAAAD8/wQAAAACAAIAAAD8/wUAAAACAAIAAAD8/wYAAAACAAIAAAD9/wMAAAACAAIAAAD9/wQAAAACAAIAAAD9/wUAAAACAAIAAAD9/wYAAAACAAIAAAD+/wMAAAACAAIAAAD+/wQAAAACAAIAAAD+/wUAAAACAAIAAAD+/wYAAAACAAIAAAD//wMAAAACAAIAAAD//wQAAAACAAIAAAD//wUAAAACAAIAAAD//wYAAAACAAIAAAAAAAMAAAACAAIAAAAAAAQAAAACAAIAAAAAAAUAAAACAAIAAAAAAAYAAAACAAIAAAABAAMAAAACAAIAAAABAAQAAAACAAIAAAABAAUAAAACAAIAAAABAAYAAAACAAIAAAACAAMAAAACAAIAAAACAAQAAAACAAIAAAACAAUAAAACAAIAAAACAAYAAAACAAIAAAADAAMAAAACAAIAAAADAAQAAAACAAIAAAADAAUAAAACAAIAAAADAAYAAAACAAIAAADy/wYAAAACAAIAAADy/wcAAAACAAIAAADy/wgAAAACAAIAAADy/wkAAAACAAIAAADy/woAAAACAAIAAADy/wsAAAACAAIAAADz/wYAAAACAAIAAADz/wcAAAACAAIAAADz/wgAAAACAAIAAADz/wkAAAACAAIAAADz/woAAAACAAIAAADz/wsAAAACAAIAAAD0/wYAAAACAAIAAAD0/wcAAAACAAIAAAD0/wgAAAACAAIAAAD0/wkAAAACAAIAAAD0/woAAAACAAIAAAD0/wsAAAACAAIAAAD1/wYAAAACAAIAAAD1/wcAAAACAAIAAAD1/wgAAAACAAIAAAD1/wkAAAACAAIAAAD1/woAAAACAAIAAAD1/wsAAAACAAIAAAD2/wYAAAACAAIAAAD2/wcAAAACAAIAAAD2/wgAAAACAAIAAAD2/wkAAAACAAIAAAD2/woAAAACAAIAAAD2/wsAAAACAAIAAAD3/wYAAAACAAIAAAD3/wcAAAACAAIAAAD3/wgAAAACAAIAAAD3/wkAAAACAAIAAAD3/woAAAACAAIAAAD3/wsAAAACAAIAAAD4/wYAAAACAAIAAAD4/wcAAAACAAIAAAD4/wgAAAACAAIAAAD4/wkAAAACAAIAAAD4/woAAAACAAIAAAD4/wsAAAACAAIAAAD5/wYAAAACAAIAAAD5/wcAAAACAAIAAAD5/wgAAAACAAIAAAD5/wkAAAACAAIAAAD5/woAAAACAAIAAAD5/wsAAAACAAIAAAD6/wYAAAACAAIAAAD6/wcAAAACAAIAAAD6/wgAAAACAAIAAAD6/wkAAAACAAIAAAD6/woAAAACAAIAAAD6/wsAAAACAAIAAAD7/wcAAAACAAIAAAD7/wgAAAACAAIAAAD7/wkAAAACAAIAAAD7/woAAAACAAIAAAD7/wsAAAACAAIAAAD8/wcAAAACAAIAAAD8/wgAAAACAAIAAAD8/wkAAAACAAIAAAD8/woAAAACAAIAAAD8/wsAAAACAAIAAAD9/wcAAAACAAIAAAD9/wgAAAACAAIAAAD9/wkAAAACAAIAAAD9/woAAAACAAIAAAD9/wsAAAACAAIAAAD+/wcAAAACAAIAAAD+/wgAAAACAAIAAAD+/wkAAAACAAIAAAD+/woAAAACAAIAAAD+/wsAAAACAAIAAAD//wcAAAACAAIAAAD//wgAAAACAAIAAAD//wkAAAACAAIAAAD//woAAAACAAIAAAD//wsAAAACAAIAAAAAAAcAAAACAAIAAAAAAAgAAAACAAIAAAAAAAkAAAACAAIAAAAAAAoAAAACAAIAAAAAAAsAAAACAAIAAAABAAcAAAACAAIAAAABAAgAAAACAAIAAAABAAkAAAACAAIAAAABAAoAAAACAAIAAAABAAsAAAACAAIAAAACAAcAAAACAAIAAAACAAgAAAACAAIAAAACAAkAAAACAAIAAAACAAoAAAACAAIAAAACAAsAAAACAAIAAAADAAcAAAACAAIAAAADAAgAAAACAAIAAAADAAkAAAACAAIAAAADAAoAAAACAAIAAAADAAsAAAACAAIAAAD7/+7/AAACAAIAAAD7/+//AAACAAIAAAD7//D/AAACAAIAAAD7//H/AAACAAIAAAD7//L/AAACAAIAAAD7//P/AAACAAIAAAD7//T/AAACAAIAAAD7//X/AAACAAIAAAD7//b/AAACAAIAAAD7//f/AAACAAIAAAD7//j/AAACAAIAAAD7//n/AAACAAIAAAD7//r/AAACAAIAAAD8/+7/AAACAAIAAAD8/+//AAACAAIAAAD8//D/AAACAAIAAAD8//H/AAACAAIAAAD8//L/AAACAAIAAAD8//P/AAACAAIAAAD8//T/AAACAAIAAAD8//X/AAACAAIAAAD8//b/AAACAAIAAAD8//f/AAACAAIAAAD8//j/AAACAAIAAAD9/+7/AAACAAIAAAD9/+//AAACAAIAAAD9//D/AAACAAIAAAD9//H/AAACAAIAAAD9//L/AAACAAIAAAD9//P/AAACAAIAAAD9//T/AAACAAIAAAD9//X/AAACAAIAAAD9//b/AAACAAIAAAD9//f/AAACAAIAAAD9//j/AAACAAIAAAA=") +tile_map_data = PackedByteArray("AAD7/wEAAgAGAAEAAAD7/wIAAgAGAAIAAAD8/wIAAgAHAAIAAAD7/wAAAgAMAAkAAAD7////AgAMAAkAAAD7//7/AgAMAAkAAAA=") tile_set = ExtResource("23_r2xfa") diff --git a/_tileset/level1.tres b/_tileset/level1.tres index b48ecbd..ff0c99b 100644 --- a/_tileset/level1.tres +++ b/_tileset/level1.tres @@ -1,92 +1,78 @@ -[gd_resource type="TileSet" load_steps=7 format=3 uid="uid://cup1q1upvp18h"] +[gd_resource type="TileSet" load_steps=5 format=3 uid="uid://cup1q1upvp18h"] -[ext_resource type="Texture2D" uid="uid://7psxuet3jk1p" path="res://_asset/ksw/basicTile.png" id="1_ln1fl"] [ext_resource type="Texture2D" uid="uid://dd622t4mw5vva" path="res://_asset/ksw/basicTile01.png" id="2_mucy5"] [ext_resource type="Texture2D" uid="uid://cwet2kw1mngmf" path="res://_asset/ksw/basicTile02.png" id="3_u6jqb"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_ln1fl"] -texture = ExtResource("1_ln1fl") -texture_region_size = Vector2i(96, 96) -1:1/0 = 0 -2:1/0 = 0 -2:2/0 = 0 -3:2/0 = 0 -3:3/0 = 0 -3:1/0 = 0 -1:2/0 = 0 -1:3/0 = 0 -2:3/0 = 0 -6:1/0 = 0 -7:1/0 = 0 -8:1/0 = 0 -8:2/0 = 0 -8:3/0 = 0 -7:3/0 = 0 -6:3/0 = 0 -6:2/0 = 0 -7:2/0 = 0 -10:1/0 = 0 -11:1/0 = 0 -12:1/0 = 0 -9:5/0 = 0 -10:6/0 = 0 -11:5/0 = 0 -10:5/0 = 0 -9:6/0 = 0 -11:6/0 = 0 -7:5/0 = 0 -7:6/0 = 0 -6:6/0 = 0 -6:5/0 = 0 -3:5/0 = 0 -3:6/0 = 0 -4:6/0 = 0 -4:5/0 = 0 -1:5/0 = 0 -1:6/0 = 0 -1:7/0 = 0 -1:9/0 = 0 -1:10/0 = 0 -2:10/0 = 0 -2:9/0 = 0 -1:8/0 = 0 -4:9/0 = 0 -4:10/0 = 0 -5:10/0 = 0 -5:9/0 = 0 -5:8/0 = 0 -7:8/0 = 0 -8:8/0 = 0 -8:9/0 = 0 -8:10/0 = 0 -7:9/0 = 0 -6:9/0 = 0 -10:9/0 = 0 -11:9/0 = 0 -11:10/0 = 0 -10:10/0 = 0 -9:9/0 = 0 -9:10/0 = 0 -10:8/0 = 0 -11:8/0 = 0 -8:5/0 = 0 -9:4/0 = 0 -11:4/0 = 0 -7:4/0 = 0 -3:4/0 = 0 -1:4/0 = 0 - [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_u6jqb"] texture = ExtResource("2_mucy5") texture_region_size = Vector2i(96, 96) +3:1/0 = 0 +3:2/0 = 0 +2:2/0 = 0 +5:1/0 = 0 +5:2/0 = 0 +6:2/0 = 0 +8:1/0 = 0 +8:2/0 = 0 +9:1/0 = 0 +11:1/0 = 0 +12:1/0 = 0 +12:2/0 = 0 +12:4/0 = 0 +12:5/0 = 0 +12:6/0 = 0 +10:6/0 = 0 +10:5/0 = 0 +9:5/0 = 0 +9:6/0 = 0 +7:5/0 = 0 +6:5/0 = 0 +6:6/0 = 0 +7:6/0 = 0 +4:6/0 = 0 +4:5/0 = 0 +3:5/0 = 0 +2:5/0 = 0 +2:6/0 = 0 +3:6/0 = 0 [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_wtljp"] texture = ExtResource("3_u6jqb") texture_region_size = Vector2i(96, 96) 10:6/0 = 0 +6:1/0 = 0 +6:2/0 = 0 +6:3/0 = 0 +6:4/0 = 0 +7:2/0 = 0 +7:3/0 = 0 +11:1/0 = 0 +12:1/0 = 0 +12:2/0 = 0 +12:3/0 = 0 +12:4/0 = 0 +11:4/0 = 0 +9:6/0 = 0 +8:6/0 = 0 +5:8/0 = 0 +5:9/0 = 0 +5:10/0 = 0 +6:10/0 = 0 +7:10/0 = 0 +7:9/0 = 0 +7:8/0 = 0 +6:8/0 = 0 +10:8/0 = 0 +11:8/0 = 0 +12:8/0 = 0 +12:9/0 = 0 +12:10/0 = 0 +11:10/0 = 0 +10:10/0 = 0 +10:9/0 = 0 +11:9/0 = 0 [resource] tile_size = Vector2i(96, 96) -sources/0 = SubResource("TileSetAtlasSource_ln1fl") sources/1 = SubResource("TileSetAtlasSource_u6jqb") sources/2 = SubResource("TileSetAtlasSource_wtljp") diff --git a/addons/reedcomponent/grap_hook/garpping_hook_v2.tscn b/addons/reedcomponent/grap_hook/garpping_hook_v2.tscn index 0449388..00d8581 100644 --- a/addons/reedcomponent/grap_hook/garpping_hook_v2.tscn +++ b/addons/reedcomponent/grap_hook/garpping_hook_v2.tscn @@ -1,7 +1,10 @@ -[gd_scene load_steps=2 format=3 uid="uid://ddwoxlqluxiq5"] +[gd_scene load_steps=3 format=3 uid="uid://ddwoxlqluxiq5"] [ext_resource type="Script" uid="uid://bvxgviq7l64ck" path="res://addons/reedcomponent/grap_hook/garpping_hook_v_2.gd" id="1_jrg4x"] +[sub_resource type="CircleShape2D" id="CircleShape2D_jrg4x"] +radius = 5.0990195 + [node name="GarppingHookV2" type="Node2D"] script = ExtResource("1_jrg4x") @@ -15,3 +18,12 @@ unique_name_in_owner = true target_position = Vector2(80, 0) collision_mask = 20 collide_with_areas = true + +[node name="TipDetector" type="Area2D" parent="."] +position = Vector2(80, 0) +collision_layer = 0 +collision_mask = 32 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="TipDetector"] +shape = SubResource("CircleShape2D_jrg4x") +debug_color = Color(0, 0.6, 0.69803923, 0) diff --git a/addons/reedcomponent/grap_hook/garpping_hook_v_2.gd b/addons/reedcomponent/grap_hook/garpping_hook_v_2.gd index d122fc7..6528b62 100644 --- a/addons/reedcomponent/grap_hook/garpping_hook_v_2.gd +++ b/addons/reedcomponent/grap_hook/garpping_hook_v_2.gd @@ -13,6 +13,7 @@ extends Node2D @onready var line_2d: Line2D = %Line2D @onready var ray: RayCast2D = %RayCast2D +@onready var tip_detector: Area2D = $TipDetector var _tween: Tween @@ -57,7 +58,8 @@ func start_stretching(direction: Vector2) -> void: _cached_cancel = false _stretching_dir = direction.normalized() _current_length = 0.0 - + _current_velocity = Vector2.ZERO # 重置速度 + _dir_id = _get_direction_id(direction,8) func end_stretching(force_end: bool = false) -> bool: @@ -68,6 +70,7 @@ func end_stretching(force_end: bool = false) -> bool: _is_stretching = false _stretching_dir = Vector2.ZERO + _current_velocity = Vector2.ZERO # 重置速度 return true func is_stretching() -> bool: @@ -97,16 +100,42 @@ func _process(_delta: float) -> void: # Core Logic # ================= +## 钩爪当前速度 +var _current_velocity: Vector2 = Vector2.ZERO +## 最大速度上限 +@export var max_speed: float = 800.0 + func _update_stretching(delta: float) -> void: - # 先嘗試推進 - var next_length := _current_length + stretching_speed * delta + # 检测前端点的吸引力 (direction, strength) + var attract_config := _get_attraction_at(global_position + _current_velocity.normalized() * _current_length) + + # 初始速度(沿当前方向持续向前) + if _current_velocity == Vector2.ZERO: + _current_velocity = get_stretching_dir() * stretching_speed + + # 应用吸引力作为加速度 + if attract_config.strength > 0: + var acceleration : Vector2 = attract_config.dir * attract_config.strength + _current_velocity += acceleration * delta + + # 限制最大速度 + if _current_velocity.length() > max_speed: + _current_velocity = _current_velocity.normalized() * max_speed + + # 基于更新后的速度预测“下一帧累计长度” + var velocity_dir := _current_velocity.normalized() + var velocity_mag := _current_velocity.length() + + var next_length := _current_length + velocity_mag * delta next_length = min(next_length, max_length) - # 使用 getter 获取当前方向(允许外部复写) - var current_dir := get_stretching_dir() + # 预测末端位置:起点 + 方向 * 累计长度 + var predicted_pos := global_position + velocity_dir * next_length - # 先用「下一幀長度」做 Ray - ray.target_position = current_dir * next_length + tip_detector.global_position = predicted_pos + + # RayCast 也应该射到“累计长度” + ray.target_position = velocity_dir * next_length ray.force_raycast_update() # ===== 命中檢測(最高優先)===== @@ -114,13 +143,12 @@ func _update_stretching(delta: float) -> void: var collider := ray.get_collider() if collider is Node2D and collider.is_in_group(GRAPABLE_GROUP): var hit_pos := ray.get_collision_point() - _current_length = global_position.distance_to(hit_pos) - ray.target_position = current_dir * _current_length + ray.target_position = velocity_dir * _current_length _handle_hit(collider as Node2D, hit_pos) return - # ===== 沒命中,才正式推進 ===== + # ===== 没命中,才正式推進 ===== _current_length = next_length # 取消邏輯 @@ -134,9 +162,33 @@ func _update_stretching(delta: float) -> void: stretching_finished.emit(true, null) end_stretching(true) +## 在指定位置检测吸引力,返回 {"dir": Vector2, "strength": float} +func _get_attraction_at(pos: Vector2) -> Dictionary: + var total_force := Vector2.ZERO + + # 检测 Areas + for area in tip_detector.get_overlapping_areas(): + if area is Node2D and area.has_method("get_attraction_force"): + total_force += area.get_attraction_force(pos) + elif area.owner is Node2D and area.owner.has_method("get_attraction_force"): + total_force += area.owner.get_attraction_force(pos) + + # 检测 Bodies + for body in tip_detector.get_overlapping_bodies(): + if body is Node2D and body.has_method("get_attraction_force"): + total_force += body.get_attraction_force(pos) + elif body.owner is Node2D and body.owner.has_method("get_attraction_force"): + total_force += body.owner.get_attraction_force(pos) + + # 返回 {"dir": direction, "strength": magnitude} + if total_force != Vector2.ZERO: + return {"dir": total_force.normalized(), "strength": total_force.length()} + return {"dir": Vector2.ZERO, "strength": 0.0} + func _handle_hit(target: Node2D, hit_pos: Vector2) -> void: _is_stretching = false _stretching_dir = Vector2.ZERO + _current_velocity = Vector2.ZERO # 重置速度 ray.target_position = to_local(hit_pos) @@ -155,6 +207,7 @@ func _release_hook() -> void: # 1. 停止拉伸(保險) _is_stretching = false _stretching_dir = Vector2.ZERO + _current_velocity = Vector2.ZERO # 重置速度 _cached_cancel = false _current_length = 0.0 diff --git a/project.godot b/project.godot index ab3ebc9..093486a 100644 --- a/project.godot +++ b/project.godot @@ -97,3 +97,4 @@ grap_hook={ 2d_physics/layer_3="Environment" 2d_physics/layer_4="Damage" 2d_physics/layer_5="Collectable" +2d_physics/layer_6="Hook_Attract"