From 418ebf73e555a09c5963b8fcb6ca9317957109f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=A8=E8=90=BD=E5=9F=BA=E5=9B=B4=E8=99=BE?= <3161880837@qq.com> Date: Sat, 24 Jan 2026 08:44:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=A7=92=E8=89=B2):=20=E6=9B=B4=E6=96=B0K?= =?UTF-8?q?ukeMC=E8=A7=92=E8=89=B2=E8=B5=84=E6=BA=90=E4=B8=8E=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加KukeMC角色的新动画资源(pico-a.svg, pico-b.svg, pico-c.svg, pico-d.svg) 调整角色基础属性和技能逻辑: - 增加百分比生命值计算方法 - 修改攻击冷却时间和治疗机制 - 优化子弹生成逻辑 - 更新角色纹理和动画帧 - 调整碰撞框大小和位置 --- components/Characters/KukeMC.tscn | 49 ++++++++++++++++--- resources/characters/kukemc/pico-a.svg | 19 +++++++ resources/characters/kukemc/pico-a.svg.import | 43 ++++++++++++++++ resources/characters/kukemc/pico-b.svg | 23 +++++++++ resources/characters/kukemc/pico-b.svg.import | 43 ++++++++++++++++ resources/characters/kukemc/pico-c.svg | 31 ++++++++++++ resources/characters/kukemc/pico-c.svg.import | 43 ++++++++++++++++ resources/characters/kukemc/pico-d.svg | 23 +++++++++ resources/characters/kukemc/pico-d.svg.import | 43 ++++++++++++++++ scripts/Contents/Characters/KukeChild.gd | 4 +- scripts/Contents/Characters/KukeMC.gd | 28 ++++++----- scripts/Statemachine/EntityBase.gd | 2 + 12 files changed, 330 insertions(+), 21 deletions(-) create mode 100644 resources/characters/kukemc/pico-a.svg create mode 100644 resources/characters/kukemc/pico-a.svg.import create mode 100644 resources/characters/kukemc/pico-b.svg create mode 100644 resources/characters/kukemc/pico-b.svg.import create mode 100644 resources/characters/kukemc/pico-c.svg create mode 100644 resources/characters/kukemc/pico-c.svg.import create mode 100644 resources/characters/kukemc/pico-d.svg create mode 100644 resources/characters/kukemc/pico-d.svg.import diff --git a/components/Characters/KukeMC.tscn b/components/Characters/KukeMC.tscn index cc56fc4..4becdb0 100644 --- a/components/Characters/KukeMC.tscn +++ b/components/Characters/KukeMC.tscn @@ -1,8 +1,11 @@ -[gd_scene load_steps=6 format=3 uid="uid://d4lfjwy0hkidu"] +[gd_scene load_steps=10 format=3 uid="uid://d4lfjwy0hkidu"] [ext_resource type="PackedScene" uid="uid://cvogxi7mktumf" path="res://components/Abstracts/EntityBase.tscn" id="1_r4q7y"] [ext_resource type="Script" uid="uid://cekuqnfohprpb" path="res://scripts/Contents/Characters/KukeMC.gd" id="2_s2dg5"] -[ext_resource type="Texture2D" uid="uid://c6thlmj566h82" path="res://resources/characters/kukemc/cy.png" id="3_wafrb"] +[ext_resource type="Texture2D" uid="uid://mnockp3ai4ju" path="res://resources/characters/kukemc/pico-a.svg" id="3_1s5d7"] +[ext_resource type="Texture2D" uid="uid://fsiyiwek5awa" path="res://resources/characters/kukemc/pico-b.svg" id="4_xjfsq"] +[ext_resource type="Texture2D" uid="uid://dem14qyqmrp52" path="res://resources/characters/kukemc/pico-c.svg" id="5_rfpp4"] +[ext_resource type="Texture2D" uid="uid://cvig26vtcyqmd" path="res://resources/characters/kukemc/pico-d.svg" id="6_kcxk2"] [sub_resource type="SpriteFrames" id="SpriteFrames_x576j"] animations = [{ @@ -17,14 +20,43 @@ animations = [{ "speed": 5.0 }] +[sub_resource type="SpriteFrames" id="SpriteFrames_bxbcp"] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("3_1s5d7") +}], +"loop": true, +"name": &"idle", +"speed": 5.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": ExtResource("3_1s5d7") +}, { +"duration": 1.0, +"texture": ExtResource("4_xjfsq") +}, { +"duration": 1.0, +"texture": ExtResource("5_rfpp4") +}, { +"duration": 1.0, +"texture": ExtResource("6_kcxk2") +}], +"loop": true, +"name": &"walk", +"speed": 5.0 +}] + [sub_resource type="RectangleShape2D" id="RectangleShape2D_farlp"] -size = Vector2(221, 150) +size = Vector2(148, 194) [node name="KukeMC" instance=ExtResource("1_r4q7y")] script = ExtResource("2_s2dg5") displayName = "酷可mc" drops = Array[int]([0, 1]) dropCounts = Array[Vector2]([Vector2(20, 40), Vector2(25, 50)]) +useStatic = true metadata/_edit_vertical_guides_ = [76.0] [node name="collect" parent="sounds" index="4"] @@ -36,14 +68,19 @@ sprite_frames = SubResource("SpriteFrames_x576j") [node name="staticBackground" parent="texture" index="0"] position = Vector2(0, -19.999998) scale = Vector2(0.61562973, 0.61562973) -texture = ExtResource("3_wafrb") + +[node name="staticAnimation" parent="texture" index="1"] +position = Vector2(0, -49) +scale = Vector2(1.507288, 1.507288) +sprite_frames = SubResource("SpriteFrames_bxbcp") +animation = &"walk" [node name="hitbox" parent="texture/hurtbox" index="0"] -position = Vector2(70, -25) +position = Vector2(0, -49) shape = SubResource("RectangleShape2D_farlp") [node name="normal" type="Node2D" parent="texture/weapons" index="0"] position = Vector2(-22, 18) [node name="statebar" parent="." index="4"] -position = Vector2(75, -169) +position = Vector2(0, -217) diff --git a/resources/characters/kukemc/pico-a.svg b/resources/characters/kukemc/pico-a.svg new file mode 100644 index 0000000..6ef7421 --- /dev/null +++ b/resources/characters/kukemc/pico-a.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/characters/kukemc/pico-a.svg.import b/resources/characters/kukemc/pico-a.svg.import new file mode 100644 index 0000000..bbc59aa --- /dev/null +++ b/resources/characters/kukemc/pico-a.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://mnockp3ai4ju" +path="res://.godot/imported/pico-a.svg-9db0830fa39a152b3a56a9e5db59640c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resources/characters/kukemc/pico-a.svg" +dest_files=["res://.godot/imported/pico-a.svg-9db0830fa39a152b3a56a9e5db59640c.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/resources/characters/kukemc/pico-b.svg b/resources/characters/kukemc/pico-b.svg new file mode 100644 index 0000000..a02c6d5 --- /dev/null +++ b/resources/characters/kukemc/pico-b.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/characters/kukemc/pico-b.svg.import b/resources/characters/kukemc/pico-b.svg.import new file mode 100644 index 0000000..8bf6fb1 --- /dev/null +++ b/resources/characters/kukemc/pico-b.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fsiyiwek5awa" +path="res://.godot/imported/pico-b.svg-bf7962f0a8f938cadf82d80cc077bee5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resources/characters/kukemc/pico-b.svg" +dest_files=["res://.godot/imported/pico-b.svg-bf7962f0a8f938cadf82d80cc077bee5.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/resources/characters/kukemc/pico-c.svg b/resources/characters/kukemc/pico-c.svg new file mode 100644 index 0000000..4bf8944 --- /dev/null +++ b/resources/characters/kukemc/pico-c.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/characters/kukemc/pico-c.svg.import b/resources/characters/kukemc/pico-c.svg.import new file mode 100644 index 0000000..dfa5292 --- /dev/null +++ b/resources/characters/kukemc/pico-c.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dem14qyqmrp52" +path="res://.godot/imported/pico-c.svg-5ecde95f499ee70657c1022037931523.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resources/characters/kukemc/pico-c.svg" +dest_files=["res://.godot/imported/pico-c.svg-5ecde95f499ee70657c1022037931523.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/resources/characters/kukemc/pico-d.svg b/resources/characters/kukemc/pico-d.svg new file mode 100644 index 0000000..3cb0680 --- /dev/null +++ b/resources/characters/kukemc/pico-d.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/characters/kukemc/pico-d.svg.import b/resources/characters/kukemc/pico-d.svg.import new file mode 100644 index 0000000..e6f66f0 --- /dev/null +++ b/resources/characters/kukemc/pico-d.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvig26vtcyqmd" +path="res://.godot/imported/pico-d.svg-70b0eb2ee6f86ca392e82f97c8126ba0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://resources/characters/kukemc/pico-d.svg" +dest_files=["res://.godot/imported/pico-d.svg-70b0eb2ee6f86ca392e82f97c8126ba0.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 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/scripts/Contents/Characters/KukeChild.gd b/scripts/Contents/Characters/KukeChild.gd index 75ac187..f95ca61 100644 --- a/scripts/Contents/Characters/KukeChild.gd +++ b/scripts/Contents/Characters/KukeChild.gd @@ -4,7 +4,7 @@ class_name KukeChild var masterMine: KukeMC func register(): - fields[FieldStore.Entity.MAX_HEALTH] = 20 + fields[FieldStore.Entity.MAX_HEALTH] = 30 fields[FieldStore.Entity.MOVEMENT_SPEED] = 0.35 attackCooldownMap[0] = 100 attackCooldownMap[1] = 8000 @@ -22,4 +22,4 @@ func attack(type): BulletBase.generate(ComponentManager.getBullet("HeavyCrystal"), self, findWeaponAnchor("normal"), position.angle_to_point(currentFocusedBoss.position)) func kill(): if is_instance_valid(masterMine): - masterMine.tryHeal(100) + masterMine.tryHeal(percentHealth(0.05)) diff --git a/scripts/Contents/Characters/KukeMC.gd b/scripts/Contents/Characters/KukeMC.gd index 0abd1b3..3abcafb 100644 --- a/scripts/Contents/Characters/KukeMC.gd +++ b/scripts/Contents/Characters/KukeMC.gd @@ -3,27 +3,29 @@ class_name KukeMC var canSummon: bool = true +func spawn(): + texture.play("walk") func register(): fields[FieldStore.Entity.MAX_HEALTH] = 3500 fields[FieldStore.Entity.MOVEMENT_SPEED] = 0.5 - attackCooldownMap[0] = 2000 - attackCooldownMap[1] = 5000 + attackCooldownMap[0] = 4000 + attackCooldownMap[1] = 4000 attackCooldownMap[2] = 20000 - attackCooldownMap[3] = 2000 + attackCooldownMap[3] = 8000 inventory[ItemStore.ItemType.APPLE] = INF healthChanged.connect( - func(h): - if h < fields[FieldStore.Entity.MAX_HEALTH] * 0.25: + func(_h): + if getHealthPercent() < 0.25: canSummon = false for child in EntityTool.findEntityByClass("KukeChild", get_tree()): if child.masterMine == self: child.tryKill() - tryHeal(200) + tryHeal(percentHealth(0.1)) ) func ai(): PresetEntityAI.follow(self, currentFocusedBoss, 500) for i in len(attackCooldownMap.keys()): - tryAttack(i) + tryAttack(i, i in [0]) func attack(type): if type == 0: for i in randi_range(8, 16): @@ -32,18 +34,18 @@ func attack(type): if bullet is BulletBase: bullet.baseDamage *= 0.5 await TickTool.millseconds(randi_range(10, 50)) - elif type == 1 and health < fields[FieldStore.Entity.MAX_HEALTH] * 0.5 and canSummon: + elif type == 1 and getHealthPercent() < 0.5 and canSummon: for i in randi_range(1, 2): var child = EntityBase.generate(ComponentManager.getCharacter("KukeChild"), position + MathTool.sampleInCircle(500)) child.currentFocusedBoss = currentFocusedBoss child.masterMine = self elif type == 2: - var countOfBullet = randi_range(40, 50) - var countOfBranch = randi_range(1, 3) - for bulletIndex in countOfBullet: - for branchIndex in countOfBranch: + var bulletCount = randi_range(20, 40) + var branchCount = randi_range(1, 3) + for bulletIndex in bulletCount: + for branchIndex in branchCount: fields[FieldStore.Entity.OFFSET_SHOOT] = 0 - for bullet in BulletBase.generate(ComponentManager.getBullet("PurpleCrystal"), self, findWeaponAnchor("normal"), deg_to_rad(360.0 / countOfBullet * bulletIndex + 360.0 / countOfBranch * branchIndex)): + for bullet in BulletBase.generate(ComponentManager.getBullet("PurpleCrystal"), self, findWeaponAnchor("normal"), deg_to_rad(360.0 / bulletCount * bulletIndex + 360.0 / branchCount * branchIndex)): if bullet is BulletBase: bullet.baseDamage *= 0.5 await TickTool.millseconds(100) diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index e7916df..c4a63d9 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -407,6 +407,8 @@ func getItem(items: Dictionary): inventory[item] = clamp(inventory[item] + items[item], 0, inventoryMax[item]) func getHealthPercent(): return health / fields[FieldStore.Entity.MAX_HEALTH] +func percentHealth(percent: float): + return fields[FieldStore.Entity.MAX_HEALTH] * percent func getMySummons() -> Array[SummonBase]: var result: Array[SummonBase] = [] for entity in get_tree().get_nodes_in_group("players" if isPlayer() else "mobs"):