From ec795e534ebe9b822f075eaa07377fb0074a3d45 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: Fri, 19 Sep 2025 22:11:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=88=98=E6=96=97=E7=B3=BB=E7=BB=9F):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0KukeMC=E5=8F=AC=E5=94=A4=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=E5=8F=8A=E5=AD=90=E5=AE=9E=E4=BD=93=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为KukeMC添加召唤子实体KukeChild的功能,并在血量低于25%时自动清除所有子实体并恢复血量 在EntityBase中添加tryKill方法统一处理实体销毁逻辑 在EntityTool中添加按类查找实体的工具方法 --- scripts/Contents/Characters/KukeChild.gd | 6 ++++-- scripts/Contents/Characters/KukeMC.gd | 13 ++++++++++++- scripts/Statemachine/EntityBase.gd | 5 +++++ scripts/Tools/EntityTool.gd | 7 +++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/scripts/Contents/Characters/KukeChild.gd b/scripts/Contents/Characters/KukeChild.gd index 0003421..931cc52 100644 --- a/scripts/Contents/Characters/KukeChild.gd +++ b/scripts/Contents/Characters/KukeChild.gd @@ -1,4 +1,5 @@ extends EntityBase +class_name KukeChild var masterMine: KukeMC @@ -12,11 +13,12 @@ func ai(): tryAttack(0) tryAttack(1) if timeLived() > 10000: - masterMine.tryHeal(100) - tryDie(null) + tryKill() 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)) +func kill(): + masterMine.tryHeal(100) diff --git a/scripts/Contents/Characters/KukeMC.gd b/scripts/Contents/Characters/KukeMC.gd index 95f48a9..0715d39 100644 --- a/scripts/Contents/Characters/KukeMC.gd +++ b/scripts/Contents/Characters/KukeMC.gd @@ -1,6 +1,8 @@ extends EntityBase class_name KukeMC +var canSummon: bool = true + func register(): fields[FieldStore.Entity.MAX_HEALTH] = 3000 fields[FieldStore.Entity.MOVEMENT_SPEED] = 0.5 @@ -9,6 +11,15 @@ func register(): attackCooldownMap[2] = 20000 attackCooldownMap[3] = 2000 inventory[ItemStore.ItemType.APPLE] = INF + healthChanged.connect( + func(h): + if h < fields[FieldStore.Entity.MAX_HEALTH] * 0.25: + canSummon = false + for child in EntityTool.findEntityByClass("KukeChild", get_tree()): + if child.masterMine == self: + child.tryKill() + tryHeal(200) + ) func ai(): PresetEntityAI.follow(self, currentFocusedBoss, 500) for bullet in get_tree().get_nodes_in_group("bullets"): @@ -25,7 +36,7 @@ func attack(type): 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 and health < fields[FieldStore.Entity.MAX_HEALTH] * 0.5: + elif type == 1 and health < fields[FieldStore.Entity.MAX_HEALTH] * 0.5 and canSummon: 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 diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index 028f9e6..f829de3 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -344,6 +344,9 @@ func playSound(type: String): cloned.play() await cloned.finished cloned.queue_free() +func tryKill(): + kill() + await tryDie() func getTrackingAnchor() -> Vector2: return hurtbox.get_node("hitbox").global_position @@ -376,6 +379,8 @@ func exitStage(_stage: int): pass func enterStage(_stage: int): pass +func kill(): + pass static func generate( entity: PackedScene, diff --git a/scripts/Tools/EntityTool.gd b/scripts/Tools/EntityTool.gd index 53a325b..f268373 100644 --- a/scripts/Tools/EntityTool.gd +++ b/scripts/Tools/EntityTool.gd @@ -24,3 +24,10 @@ static func findClosetEntity(to: Vector2, fromTree: SceneTree, player: bool = fa return result static func findClosetPlayer(to: Vector2, fromTree: SceneTree, excludes: Array[EntityBase] = []) -> EntityBase: return findClosetEntity(to, fromTree, true, false, excludes) +static func findEntityByClass(cls: String, fromTree: SceneTree) -> Array[EntityBase]: + var results: Array[EntityBase] = [] + var nodes = fromTree.get_nodes_in_group("mobs") + fromTree.get_nodes_in_group("players") + for entity in nodes: + if entity.get_class() == cls: + results.append(entity) + return results