From fd64d64adfd7bd9d3f8f0c81a7bbee5eb0f00a81 Mon Sep 17 00:00:00 2001 From: Reed Date: Fri, 16 Jan 2026 17:23:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E8=A7=86=E8=A7=92=E4=B8=8B=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E9=92=A9=E9=94=81=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _asset/ksw/{ => tile}/tile.png | Bin _asset/ksw/{ => tile}/tile.png.import | 6 +- _asset/ksw/{ => tile}/tile02.png | Bin _asset/ksw/{ => tile}/tile02.png.import | 6 +- _asset/tile/pure_color_tile.png | Bin 79459 -> 0 bytes _asset/tile/pure_color_tile.png.import | 40 --------- _player/Avatar.tscn | 23 +++-- _player/avatar.gd | 8 +- _tileset/pure_tile_set.tres | 84 +++++++++++++++++- .../grap_hook/garpping_hook_v2.tscn | 17 +++- .../grap_hook/garpping_hook_v_2.gd | 49 +++++----- .../locomotion/locomotion_component.gd | 18 ++-- 12 files changed, 160 insertions(+), 91 deletions(-) rename _asset/ksw/{ => tile}/tile.png (100%) rename _asset/ksw/{ => tile}/tile.png.import (77%) rename _asset/ksw/{ => tile}/tile02.png (100%) rename _asset/ksw/{ => tile}/tile02.png.import (77%) delete mode 100644 _asset/tile/pure_color_tile.png delete mode 100644 _asset/tile/pure_color_tile.png.import diff --git a/_asset/ksw/tile.png b/_asset/ksw/tile/tile.png similarity index 100% rename from _asset/ksw/tile.png rename to _asset/ksw/tile/tile.png diff --git a/_asset/ksw/tile.png.import b/_asset/ksw/tile/tile.png.import similarity index 77% rename from _asset/ksw/tile.png.import rename to _asset/ksw/tile/tile.png.import index d5a376b..2afc685 100644 --- a/_asset/ksw/tile.png.import +++ b/_asset/ksw/tile/tile.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://ntm66vo10u2q" -path="res://.godot/imported/tile.png-7448e5d2fb0210684de3a0324519aaf4.ctex" +path="res://.godot/imported/tile.png-289c3a7c75eaae83df78711948565daf.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://_asset/ksw/tile.png" -dest_files=["res://.godot/imported/tile.png-7448e5d2fb0210684de3a0324519aaf4.ctex"] +source_file="res://_asset/ksw/tile/tile.png" +dest_files=["res://.godot/imported/tile.png-289c3a7c75eaae83df78711948565daf.ctex"] [params] diff --git a/_asset/ksw/tile02.png b/_asset/ksw/tile/tile02.png similarity index 100% rename from _asset/ksw/tile02.png rename to _asset/ksw/tile/tile02.png diff --git a/_asset/ksw/tile02.png.import b/_asset/ksw/tile/tile02.png.import similarity index 77% rename from _asset/ksw/tile02.png.import rename to _asset/ksw/tile/tile02.png.import index 9103999..7ac44a0 100644 --- a/_asset/ksw/tile02.png.import +++ b/_asset/ksw/tile/tile02.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cchtbbig85jcm" -path="res://.godot/imported/tile02.png-520f52959c7a0ed7245207d133347d95.ctex" +path="res://.godot/imported/tile02.png-e8381a8c1a148c3eb8ce3bc8009de863.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://_asset/ksw/tile02.png" -dest_files=["res://.godot/imported/tile02.png-520f52959c7a0ed7245207d133347d95.ctex"] +source_file="res://_asset/ksw/tile/tile02.png" +dest_files=["res://.godot/imported/tile02.png-e8381a8c1a148c3eb8ce3bc8009de863.ctex"] [params] diff --git a/_asset/tile/pure_color_tile.png b/_asset/tile/pure_color_tile.png deleted file mode 100644 index 0ed557c73af57d1cf4dbdb54b89738bb76432d2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79459 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 diff --git a/_asset/tile/pure_color_tile.png.import b/_asset/tile/pure_color_tile.png.import deleted file mode 100644 index 3998ebf..0000000 --- a/_asset/tile/pure_color_tile.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dnrvktjrinxon" -path="res://.godot/imported/pure_color_tile.png-2b37f3adadaf3d4a746ba81fc564d09f.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://_asset/tile/pure_color_tile.png" -dest_files=["res://.godot/imported/pure_color_tile.png-2b37f3adadaf3d4a746ba81fc564d09f.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/_player/Avatar.tscn b/_player/Avatar.tscn index d2345f2..0f446ff 100644 --- a/_player/Avatar.tscn +++ b/_player/Avatar.tscn @@ -163,22 +163,31 @@ unique_name_in_owner = true script = ExtResource("2_11vl8") dash_speed = 400.0 end_dash_speed = 190.0 -climb_hop_velocity_x = 180.0 -climb_hop_velocity_y = 334.0 +climb_max_speed_upward = 450.0 +climb_max_speed_downward = 800.0 +climb_acceleration = 3000.0 +climb_hop_velocity_x = 1400.0 +climb_hop_velocity_y = 2600.0 +climb_jump_velocity_x = 1800.0 +climb_jump_velocity_y = 3300.0 +custom_move_force = 10000.0 +custom_move_max_speed = 4500.0 +custom_move_stop_distance = 40.0 jump_force = 5800.0 jump_hold_maxium_time = 0.125 jump_horizontal_Boost = 5600.0 jump_countinus_horizontal_Boost = 4000.0 jump_horizontal_Boost_last_time = 0.12 max_jump_horizontal_boost_speed = 3600.0 -light_gravity_threshold = 135.0 +light_gravity_threshold = 1200.0 light_gravity_mult = 0.6 -wall_jump_base_force_x = 260.0 -wall_jump_base_force_y = 220.0 +wall_slide_fall_maxium_speed = 5000.0 +wall_jump_base_force_x = 2800.0 +wall_jump_base_force_y = 1600.0 fall_maxium_speed = 8000.0 air_control_mult = 0.55 -run_accel = 5800.0 -run_reduce = 7900.0 +run_accel = 15000.0 +run_reduce = 20000.0 move_speed_max = 2650.0 [node name="WallDetector" parent="LocomotionComponent" instance=ExtResource("20_air0b")] diff --git a/_player/avatar.gd b/_player/avatar.gd index 6408d0c..32697d9 100644 --- a/_player/avatar.gd +++ b/_player/avatar.gd @@ -67,11 +67,11 @@ func _draw() -> void: var a_x: float = clampf(abs(velocity.x),1,2000) * .3 * sign(locomotion_comp._current_acceleration.x) var a_y: float = clampf(abs(velocity.x),1,2000) * .3 * sign(locomotion_comp._current_acceleration.y) - draw_line(Vector2.ZERO,Vector2(x, 0),Color.RED,4) - draw_line(Vector2.ZERO,Vector2(0, y),Color.GREEN,4) + draw_line(Vector2.ZERO,Vector2(x, 0),Color.RED,40) + draw_line(Vector2.ZERO,Vector2(0, y),Color.GREEN,40) - draw_line(Vector2.ZERO,Vector2(a_x, 0),Color.YELLOW,2) - draw_line(Vector2.ZERO,Vector2(0, a_y),Color.PURPLE,2) + draw_line(Vector2.ZERO,Vector2(a_x, 0),Color.YELLOW,20) + draw_line(Vector2.ZERO,Vector2(0, a_y),Color.PURPLE,20) func _process(delta: float) -> void: queue_redraw() diff --git a/_tileset/pure_tile_set.tres b/_tileset/pure_tile_set.tres index 4524cb8..8c6b9e2 100644 --- a/_tileset/pure_tile_set.tres +++ b/_tileset/pure_tile_set.tres @@ -1,89 +1,167 @@ [gd_resource type="TileSet" load_steps=5 format=3 uid="uid://bt25n4i5s2bkj"] -[ext_resource type="Texture2D" uid="uid://ntm66vo10u2q" path="res://_asset/ksw/tile.png" id="1_jwfln"] -[ext_resource type="Texture2D" uid="uid://cchtbbig85jcm" path="res://_asset/ksw/tile02.png" id="2_5i20m"] +[ext_resource type="Texture2D" uid="uid://ntm66vo10u2q" path="res://_asset/ksw/tile/tile.png" id="1_jwfln"] +[ext_resource type="Texture2D" uid="uid://cchtbbig85jcm" path="res://_asset/ksw/tile/tile02.png" id="2_5i20m"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_i03by"] texture = ExtResource("1_jwfln") texture_region_size = Vector2i(128, 128) 1:1/0 = 0 +1:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -48, 64, -48, 64, 48, 48, 48, 48, 64, -48, 64) 2:1/0 = 0 +2:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -48, 64, -48, 64, 48, -64, 48) 3:1/0 = 0 +3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -48, 48, -48, 48, 64, -48, 64, -48, 48, -64, 48) 3:2/0 = 0 +3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -64, 48, -64, 48, 64, -48, 64) 3:3/0 = 0 +3:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -64, 48, -64, 48, 48, -64, 48, -64, -48, -48, -48) 2:3/0 = 0 +2:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(64, -48, 64, 48, -64, 48, -64, -48) 1:3/0 = 0 +1:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(64, -48, 64, 48, -48, 48, -48, -64, 48, -64, 48, -48) 1:2/0 = 0 +1:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, -64, 48, -64, 48, 64) 6:1/0 = 0 +6:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -48, 64, -48, 64, 64, -64, 64) 5:2/0 = 0 +5:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -64, 64, -64, 64, 64, -48, 64) 5:1/0 = 0 +5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -48, 64, -48, 64, 64, -48, 64) 6:2/0 = 0 +6:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -64, 64, -64, 64, 64, -64, 64) 6:3/0 = 0 +6:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -64, 64, -64, 64, 48, -64, 48) 5:3/0 = 0 +5:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -64, 64, -64, 64, 48, -48, 48) 7:3/0 = 0 +7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -64, 48, -64, 48, 48, -64, 48) 7:2/0 = 0 +7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -64, 48, -64, 48, 64, -64, 64) 7:1/0 = 0 +7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -48, 48, -48, 48, 64, -64, 64) 9:1/0 = 0 +9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -48, 48, -48, 48, 48, -48, 48) 11:1/0 = 0 +11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -48, 64, -48, 64, 48, -48, 48) 12:1/0 = 0 +12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -48, 64, -48, 64, 48, -64, 48) 13:1/0 = 0 +13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -48, 48, -48, 48, 48, -64, 48) 9:3/0 = 0 +9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, -48, 48, -48, 48, 64) 9:4/0 = 0 +9:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, -64, 48, -64, 48, 64) 9:5/0 = 0 +9:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -48, -64, 48, -64, 48, 48) 1:4/0 = 0 +1:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -48, -48, 64, -48, 64, 48) 2:4/0 = 0 +2:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -64, 48, -64, -48, 64, -48, 64, 48, 48, 48, 48, 64, -48, 64) 3:4/0 = 0 +3:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 48, -64, -48, 48, -48, 48, 48) 2:5/0 = 0 +2:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -48, -64, 48, -64, 48, 48) 2:6/0 = 0 +2:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, -48, 48, -48, 48, 64) 2:7/0 = 0 +2:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 48, -64, -48, -48, -48, -48, -64, 48, -64, 48, -48, 64, -48, 64, 48) 1:7/0 = 0 +1:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -48, -48, 64, -48, 64, 48) 3:7/0 = 0 +3:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 48, -64, -48, 48, -48, 48, 48) 1:8/0 = 0 +1:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, -48, 48, -48, 48, 64) 1:9/0 = 0 +1:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, -64, 48, -64, 48, -48, 64, -48, 64, 48, 48, 48, 48, 64) 1:10/0 = 0 +1:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -48, -64, 48, -64, 48, 48) 2:9/0 = 0 +2:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 48, -64, -48, 48, -48, 48, 48) 3:9/0 = 0 +3:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -48, -48, 64, -48, 64, 48) 4:8/0 = 0 +4:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, -48, 48, -48, 48, 64) 4:9/0 = 0 +4:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, 48, -64, 48, -64, -48, -48, -48, -48, -64, 48, -64, 48, 64) 4:10/0 = 0 +4:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -48, -64, 48, -64, 48, 48) 5:8/0 = 0 +5:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -48, -64, 48, -64, 48, 48) 5:7/0 = 0 +5:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, -48, 64, -48, 64, 48, 48, 48, 48, 64) 6:7/0 = 0 +6:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 48, -64, -48, 48, -48, 48, 48) 8:7/0 = 0 +8:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -48, -48, 64, -48, 64, 48) 9:7/0 = 0 +9:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -64, 48, -64, -48, 48, -48, 48, 64, -48, 64) 9:8/0 = 0 +9:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -64, 48, -64, 48, 48, -48, 48) 7:8/0 = 0 +7:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -48, 48, -48, 48, 64, -48, 64) 7:9/0 = 0 +7:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -48, -48, -64, 48, -64, 48, -48, 64, -48, 64, 48, 47.33333, 48, 48, 64, -48, 64, -48, 48, -64, 48, -64, -48) 6:9/0 = 0 +6:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, -48, 64, -48, 64, 48, -48, 48) 8:9/0 = 0 +8:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(48, -48, 47.33333, 48, -64, 48, -64, -48) 7:10/0 = 0 +7:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(48, -64, 47.33333, 48, -48, 48, -48, -64) 5:10/0 = 0 +5:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(48, -48, 48, 64, -48, 64, -48, -48) 6:11/0 = 0 +6:11/0/physics_layer_0/polygon_0/points = PackedVector2Array(48, 48, -64, 48, -64, -48, 48, -48) 8:11/0 = 0 +8:11/0/physics_layer_0/polygon_0/points = PackedVector2Array(64, 48, -48, 48, -48, -48, 64, -48) 5:11/0 = 0 +5:11/0/physics_layer_0/polygon_0/points = PackedVector2Array(48, -48, 64, -48, 64, 48, -48, 48, -48, -64, 48, -64) 9:11/0 = 0 +9:11/0/physics_layer_0/polygon_0/points = PackedVector2Array(48, 48, -64, 48, -64, -48, -48, -48, -48, -64, 48, -64) 9:10/0 = 0 +9:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(48, 64, -48, 64, -48, -48, 48, -48) 11:9/0 = 0 +11:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, -64, 64, -64, 64, 64) 11:8/0 = 0 +11:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, -48, 64, -48, 64, 64) 11:10/0 = 0 +11:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -48, -64, 64, -64, 64, 48) 12:9/0 = 0 +12:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 64, -64, -64, 64, -64, 64, 64) 12:8/0 = 0 +12:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 64, -64, -48, -48, -48, -48, -64, 64, -64, 64, 64) 12:7/0 = 0 +12:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 64, -48, -48, 64, -48, 64, 64) 13:7/0 = 0 +13:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 64, -64, -48, 64, -48, 64, 64) 14:7/0 = 0 +14:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 64, -64, -48, 48, -48, 48, 64) 13:8/0 = 0 +13:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 64, -64, -64, 64, -64, 64, 64) 13:9/0 = 0 +13:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 64, -64, -64, 64, -64, 64, 64) 13:10/0 = 0 +13:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 64, -64, -64, 64, -64, 64, 64) 13:11/0 = 0 +13:11/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -64, 64, -64, 64, 48, -64, 48) 12:10/0 = 0 +12:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -64, 48, -64, -64, 64, -64, 64, 64, -48, 64) 12:11/0 = 0 +12:11/0/physics_layer_0/polygon_0/points = PackedVector2Array(-48, 48, -48, -64, 64, -64, 64, 48) 14:8/0 = 0 +14:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 64, -64, -64, 48, -64, 48, -48, 64, -48, 64, 64) 14:9/0 = 0 +14:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 64, -64, -64, 64, -64, 64, 64) 14:10/0 = 0 +14:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -64, 64, -64, 64, 48, 48, 48, 48, 64, -64, 64) 14:11/0 = 0 +14:11/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -64, 48, -64, 48, 48, -64, 48) 15:9/0 = 0 +15:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 64, -64, -64, 48, -64, 48, 64) 15:10/0 = 0 +15:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, -64, 48, -64, 48, 48, -64, 48) 15:8/0 = 0 +15:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-64, 64, -64, -48, 48, -48, 48, 64) [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_ekrk0"] texture = ExtResource("2_5i20m") @@ -163,5 +241,5 @@ texture_region_size = Vector2i(128, 128) tile_size = Vector2i(128, 128) physics_layer_0/collision_layer = 4 physics_layer_0/collision_mask = 0 -sources/2 = SubResource("TileSetAtlasSource_i03by") sources/3 = SubResource("TileSetAtlasSource_ekrk0") +sources/2 = SubResource("TileSetAtlasSource_i03by") diff --git a/addons/reedcomponent/grap_hook/garpping_hook_v2.tscn b/addons/reedcomponent/grap_hook/garpping_hook_v2.tscn index 00d8581..0360d8c 100644 --- a/addons/reedcomponent/grap_hook/garpping_hook_v2.tscn +++ b/addons/reedcomponent/grap_hook/garpping_hook_v2.tscn @@ -1,17 +1,30 @@ -[gd_scene load_steps=3 format=3 uid="uid://ddwoxlqluxiq5"] +[gd_scene load_steps=4 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_2bmkq"] + [sub_resource type="CircleShape2D" id="CircleShape2D_jrg4x"] radius = 5.0990195 [node name="GarppingHookV2" type="Node2D"] script = ExtResource("1_jrg4x") +min_length = 900.0 +max_length = 1200.0 +stretching_speed = 5000.0 +max_speed = 5600.0 +retract_speed = 7000.0 [node name="Line2D" type="Line2D" parent="."] unique_name_in_owner = true points = PackedVector2Array(0, 0, 80, 0) -width = 8.0 +width = 50.0 + +[node name="ShapeCast2D" type="ShapeCast2D" parent="."] +unique_name_in_owner = true +shape = SubResource("CircleShape2D_2bmkq") +target_position = Vector2(80, 0) +collision_mask = 20 [node name="RayCast2D" type="RayCast2D" parent="."] unique_name_in_owner = true diff --git a/addons/reedcomponent/grap_hook/garpping_hook_v_2.gd b/addons/reedcomponent/grap_hook/garpping_hook_v_2.gd index 6528b62..517f628 100644 --- a/addons/reedcomponent/grap_hook/garpping_hook_v_2.gd +++ b/addons/reedcomponent/grap_hook/garpping_hook_v_2.gd @@ -1,20 +1,27 @@ class_name Hook extends Node2D +@onready var line_2d: Line2D = %Line2D +@onready var shape_cast_2d: ShapeCast2D = %ShapeCast2D +@onready var tip_detector: Area2D = $TipDetector ## ================ ## Export Field ## ================ +##钩爪最短长度 @export var min_length := 140.0 +##钩爪最大长度 @export var max_length := 200.0 +##钩爪伸出速度 @export var stretching_speed: float = 1400.0 +## 最大速度上限 +@export var max_speed: float = 800.0 @export_category("Hook Retract") @export var retract_speed: float = 1800.0 -@onready var line_2d: Line2D = %Line2D -@onready var ray: RayCast2D = %RayCast2D -@onready var tip_detector: Area2D = $TipDetector +## 钩爪当前速度 +var _current_velocity: Vector2 = Vector2.ZERO var _tween: Tween const GRAPABLE_GROUP = &"GRAPABLE" @@ -40,8 +47,8 @@ var _dir_id: int = -1 # ================= func _ready() -> void: - ray.enabled = true - ray.target_position = Vector2.ZERO + shape_cast_2d.enabled = true + shape_cast_2d.target_position = Vector2.ZERO ## 初始化 func init(hook_comp: SpawnHookComponet, reset_to_target: bool) -> void: @@ -100,10 +107,6 @@ 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: # 检测前端点的吸引力 (direction, strength) @@ -134,17 +137,17 @@ func _update_stretching(delta: float) -> void: tip_detector.global_position = predicted_pos - # RayCast 也应该射到“累计长度” - ray.target_position = velocity_dir * next_length - ray.force_raycast_update() + # ShapeCast2D 也应该射到"累计长度" + shape_cast_2d.target_position = velocity_dir * next_length + shape_cast_2d.force_shapecast_update() # ===== 命中檢測(最高優先)===== - if ray.is_colliding(): - var collider := ray.get_collider() + if shape_cast_2d.is_colliding(): + var collider := shape_cast_2d.get_collider(0) if collider is Node2D and collider.is_in_group(GRAPABLE_GROUP): - var hit_pos := ray.get_collision_point() + var hit_pos := shape_cast_2d.get_collision_point(0) _current_length = global_position.distance_to(hit_pos) - ray.target_position = velocity_dir * _current_length + shape_cast_2d.target_position = velocity_dir * _current_length _handle_hit(collider as Node2D, hit_pos) return @@ -190,7 +193,7 @@ func _handle_hit(target: Node2D, hit_pos: Vector2) -> void: _stretching_dir = Vector2.ZERO _current_velocity = Vector2.ZERO # 重置速度 - ray.target_position = to_local(hit_pos) + shape_cast_2d.target_position = to_local(hit_pos) # 如果 target 有 on_hook_hit 方法,调用它(传入钩爪实例) if target.has_method(&"on_hook_hit"): @@ -218,8 +221,8 @@ func _release_hook() -> void: _anchor.queue_free() _anchor = null - # 3. 重置 Ray 與 Line(視覺清乾淨) - ray.target_position = Vector2.ZERO + # 3. 重置 ShapeCast2D 與 Line(視覺清乾淨) + shape_cast_2d.target_position = Vector2.ZERO _update_line() func release_hook_with_transition(has_trans: bool) -> void: @@ -242,7 +245,7 @@ func release_hook_with_transition(has_trans: bool) -> void: _anchor = null # 当前末端位置(本地坐标) - var start_pos: Vector2 = ray.target_position + var start_pos: Vector2 = shape_cast_2d.target_position var distance := start_pos.length() if distance <= 0.001: @@ -260,7 +263,7 @@ func release_hook_with_transition(has_trans: bool) -> void: _tween.set_ease(Tween.EASE_IN) _tween.tween_property( - ray, + shape_cast_2d, "target_position", Vector2.ZERO, duration @@ -273,9 +276,9 @@ func release_hook_with_transition(has_trans: bool) -> void: func _update_line() -> void: if _anchor and is_instance_valid(_anchor): # 关键:锚点是世界坐标固定的,把它换算到 Hook 的本地坐标 - ray.target_position = to_local(_anchor.global_position) + shape_cast_2d.target_position = to_local(_anchor.global_position) - line_2d.set_point_position(1, ray.target_position) + line_2d.set_point_position(1, shape_cast_2d.target_position) func _create_anchor_on_node(target: Node2D, hit_global_pos: Vector2) -> Node2D: if _anchor and is_instance_valid(_anchor): diff --git a/addons/reedcomponent/locomotion/locomotion_component.gd b/addons/reedcomponent/locomotion/locomotion_component.gd index 43ce587..e1f2ed6 100644 --- a/addons/reedcomponent/locomotion/locomotion_component.gd +++ b/addons/reedcomponent/locomotion/locomotion_component.gd @@ -35,6 +35,8 @@ const FALL_SPEED_EXCEED_TOLERANCE_THRESHOLD = 40 @export_category("Locomotion Properties") @export_subgroup("Move") +##如果为true,则使用加速度逐渐达到目标速度;如果为false,则直接设置速度 +@export var use_acceleration: bool = true ##存在輸入時,向最大移動輸入運動的加速度 @export var run_accel : float = 1200 ##不存在輸入時,向Vector.ZERO運動的加速度 @@ -124,12 +126,16 @@ func _update_movement(delta : float) -> void: var applyed_air_control = 1 if characterbody.is_on_floor() else air_control_mult var target_move_speed = move_speed_max * input_dir - - characterbody.velocity.x = speed_approach( - characterbody.velocity.x, - target_move_speed, - applyed_air_control * accel * delta - ) + + if use_acceleration: + characterbody.velocity.x = speed_approach( + characterbody.velocity.x, + target_move_speed, + applyed_air_control * accel * delta + ) + else: + # 直接设置速度,无加速度 + characterbody.velocity.x = target_move_speed #检测是否这帧开始了移动 _check_is_start_move()