From cf8820d0ecbcfd415d681a32a1f4314c891b52d2 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: Thu, 18 Sep 2025 06:46:43 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=88=98=E6=96=97=E7=B3=BB=E7=BB=9F):=20?= =?UTF-8?q?=E5=A2=9E=E5=BC=BAKukeMC=E5=8F=8A=E5=85=B6=E5=AD=90=E4=BD=93?= =?UTF-8?q?=E7=9A=84=E6=88=98=E6=96=97=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为KukeChild添加重型紫水晶攻击方式并调整治疗量 - 修改KukeMC的攻击逻辑,在低血量时才会召唤子体 - 调整重型紫水晶的属性和动画效果 - 增加子弹生成时的初始速度和加速度 --- .../BossAttack/KukeMC/HeavyCrystal.tscn | 79 ++++++++++--------- .../Bullets/BossAttack/KukeMC/HeavyCrystal.gd | 5 +- scripts/Contents/Characters/KukeChild.gd | 8 +- scripts/Contents/Characters/KukeMC.gd | 9 +-- 4 files changed, 55 insertions(+), 46 deletions(-) diff --git a/components/Bullets/BossAttack/KukeMC/HeavyCrystal.tscn b/components/Bullets/BossAttack/KukeMC/HeavyCrystal.tscn index ed2192a..58d4413 100644 --- a/components/Bullets/BossAttack/KukeMC/HeavyCrystal.tscn +++ b/components/Bullets/BossAttack/KukeMC/HeavyCrystal.tscn @@ -22,6 +22,42 @@ animations = [{ "speed": 5.0 }] +[sub_resource type="Animation" id="Animation_dwk2v"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("%texture/..:scale:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(2, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("%texture/..:scale:y") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(2, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("%texture/..:modulate:a") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.15, 0, 0.15, 0), +"times": PackedFloat32Array(0) +} + [sub_resource type="Animation" id="Animation_qobcv"] resource_name = "spawn" length = 0.3 @@ -60,42 +96,6 @@ tracks/2/keys = { "times": PackedFloat32Array(0, 0.3) } -[sub_resource type="Animation" id="Animation_dwk2v"] -length = 0.001 -tracks/0/type = "bezier" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("%texture/..:scale:x") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"handle_modes": PackedInt32Array(0), -"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), -"times": PackedFloat32Array(0) -} -tracks/1/type = "bezier" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("%texture/..:scale:y") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"handle_modes": PackedInt32Array(0), -"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), -"times": PackedFloat32Array(0) -} -tracks/2/type = "bezier" -tracks/2/imported = false -tracks/2/enabled = true -tracks/2/path = NodePath("%texture/..:modulate:a") -tracks/2/interp = 1 -tracks/2/loop_wrap = true -tracks/2/keys = { -"handle_modes": PackedInt32Array(0), -"points": PackedFloat32Array(1, -0.15, 0, 0.15, 0), -"times": PackedFloat32Array(0) -} - [sub_resource type="AnimationLibrary" id="AnimationLibrary_mdce7"] _data = { "RESET": SubResource("Animation_dwk2v"), @@ -119,21 +119,24 @@ gravity = Vector3(0, 0, 0) alpha_curve = SubResource("CurveTexture_inkfe") [node name="HeavyCrystal" instance=ExtResource("1_mf7ha")] +modulate = Color(1, 1, 1, 0) +scale = Vector2(2, 2) script = ExtResource("2_ygemv") displayName = "重型紫水晶" speed = 0.0 damage = 20.0 lifeTime = 2000.0 +autoSpawnAnimation = true [node name="track" type="Node2D" parent="." index="0"] unique_name_in_owner = true material = SubResource("ShaderMaterial_1i43q") script = ExtResource("2_75div") -size = Vector2(150, 150) +size = Vector2(300, 300) color = Color(0.451438, 0.278306, 1.44392e-07, 1) [node name="texture" parent="." index="1"] -position = Vector2(95, 0) +position = Vector2(145, 0) scale = Vector2(1.5, 1.5) sprite_frames = SubResource("SpriteFrames_e150r") diff --git a/scripts/Contents/Bullets/BossAttack/KukeMC/HeavyCrystal.gd b/scripts/Contents/Bullets/BossAttack/KukeMC/HeavyCrystal.gd index 612df4e..f5396a0 100644 --- a/scripts/Contents/Bullets/BossAttack/KukeMC/HeavyCrystal.gd +++ b/scripts/Contents/Bullets/BossAttack/KukeMC/HeavyCrystal.gd @@ -5,13 +5,16 @@ extends BulletBase var readyTime: float = 1000 +func register(): + speed = -10 func spawn(): trail.emitting = false func ai(): if timeLived() < readyTime: + PresetBulletAI.lockLauncher(self, launcher, true) rotation = launcher.position.angle_to_point(launcher.currentFocusedBoss.position) else: PresetBulletAI.forward(self, rotation) - speed += 1 + speed += 2 trail.emitting = true track.visible = false diff --git a/scripts/Contents/Characters/KukeChild.gd b/scripts/Contents/Characters/KukeChild.gd index 4296ca0..a18fc94 100644 --- a/scripts/Contents/Characters/KukeChild.gd +++ b/scripts/Contents/Characters/KukeChild.gd @@ -5,14 +5,18 @@ var masterMine: KukeMC func register(): fields[FieldStore.Entity.MAX_HEALTH] = 25 fields[FieldStore.Entity.MOVEMENT_SPEED] = 0.35 - attackCooldownMap[0] = 50 + attackCooldownMap[0] = 500 + attackCooldownMap[1] = 2000 func ai(): PresetEntityAI.follow(self, currentFocusedBoss, 700) tryAttack(0) + tryAttack(1) if timeLived() > 8000: - masterMine.tryHeal(50) + masterMine.tryHeal(200) tryDie(null) func attack(type): if type == 0: BulletBase.generate(preload("res://components/Bullets/PurpleCrystalSmall.tscn"), self, findWeaponAnchor("normal"), position.angle_to_point(currentFocusedBoss.position)) await TickTool.millseconds(randi_range(5, 25)) + elif type == 1: + BulletBase.generate(preload("res://components/Bullets/BossAttack/KukeMC/HeavyCrystal.tscn"), self, findWeaponAnchor("normal"), position.angle_to_point(currentFocusedBoss.position)) diff --git a/scripts/Contents/Characters/KukeMC.gd b/scripts/Contents/Characters/KukeMC.gd index 38ed2f7..01cf710 100644 --- a/scripts/Contents/Characters/KukeMC.gd +++ b/scripts/Contents/Characters/KukeMC.gd @@ -17,16 +17,15 @@ func ai(): bullet.position.distance_to(self.position) < 200 ): bullet.tryDestroy() - # for i in len(attackCooldownMap.keys()): - # tryAttack(i) - tryAttack(3) + for i in len(attackCooldownMap.keys()): + tryAttack(i) func attack(type): if type == 0: for i in randi_range(8, 16): fields[FieldStore.Entity.OFFSET_SHOOT] = 25 BulletBase.generate(preload("res://components/Bullets/PurpleCrystal.tscn"), self, findWeaponAnchor("normal"), position.angle_to_point(currentFocusedBoss.position)) await TickTool.millseconds(randi_range(10, 50)) - elif type == 1: + elif type == 1 and health < fields[FieldStore.Entity.MAX_HEALTH] * 0.5: for i in randi_range(1, 2): var child = EntityBase.generate(preload("res://components/Characters/KukeChild.tscn"), position + MathTool.randv2_range(500)) child.currentFocusedBoss = currentFocusedBoss @@ -34,7 +33,7 @@ func attack(type): elif type == 2: var count = randi_range(20, 40) for i in count: - var count1 = 3 + var count1 = randi_range(2, 4) for j in count1: fields[FieldStore.Entity.OFFSET_SHOOT] = 0 BulletBase.generate(preload("res://components/Bullets/PurpleCrystal.tscn"), self, findWeaponAnchor("normal"), deg_to_rad(360.0 / count * i + 360.0 / count1 * j))