From 7dbeb7ec19dad0696bd4a329d52b6dbd3fa8de48 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: Sun, 14 Sep 2025 16:20:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=97=A0=E6=95=8C?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E5=92=8C=E8=87=AA=E5=AE=9A=E4=B9=89=E6=B3=A2?= =?UTF-8?q?=E6=AC=A1=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为EntityBase添加currentInvinsible属性控制无敌状态 - 修改BulletBase.gd在命中时检查目标无敌状态 - 在World.tscn中设置rooster初始为无敌状态 - 添加Wave.gd自定义波次启动逻辑 - 修复currentFocusedBoss未初始化时的空指针问题 --- components/Characters/KukeMC.tscn | 3 +++ components/Scenes/World.tscn | 1 + scripts/Contents/Wave.gd | 9 ++++++++- scripts/Statemachine/BulletBase.gd | 3 ++- scripts/Statemachine/EntityBase.gd | 4 +++- 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/components/Characters/KukeMC.tscn b/components/Characters/KukeMC.tscn index a47b4ee..a8a7a7d 100644 --- a/components/Characters/KukeMC.tscn +++ b/components/Characters/KukeMC.tscn @@ -30,6 +30,9 @@ size = Vector2(150, 150) script = ExtResource("2_s2dg5") displayName = "酷可mc" +[node name="collect" parent="sounds" index="4"] +stream = null + [node name="texture" parent="." index="2"] sprite_frames = SubResource("SpriteFrames_1c0ui") animation = &"walk" diff --git a/components/Scenes/World.tscn b/components/Scenes/World.tscn index b4c7235..d3cc97d 100644 --- a/components/Scenes/World.tscn +++ b/components/Scenes/World.tscn @@ -103,3 +103,4 @@ shape = SubResource("CircleShape2D_4hkht") polygon = PackedVector2Array(-2419, 1803, 2429, 1825, 2392, -366, 2867, -318, 2723, 2241, -2879, 2193, -2797, -2582, 2959, -2528, 2858, -347, 2420, -337, 2441, -1834, -2438, -1792) [node name="rooster" parent="." groups=["players"] instance=ExtResource("3_5ui6q")] +currentInvinsible = true diff --git a/scripts/Contents/Wave.gd b/scripts/Contents/Wave.gd index 71047a3..fdf9920 100644 --- a/scripts/Contents/Wave.gd +++ b/scripts/Contents/Wave.gd @@ -19,8 +19,13 @@ static var WAVE_TESTBOSS = [ Wave.create(preload("res://components/Characters/Bear.tscn"), 0, 0, true, 0, INF, 1), Wave.create(preload("res://components/Characters/KukeMC.tscn"), 0, 0, true, 0, INF, 1), ] -static var data = WAVE_TESTBOSS +static var data = [] +static func customStart(): + var furryr = EntityBase.generate(preload("res://components/Characters/Bear.tscn"), MathTool.randv2_range(500), true, false) + var kukemc = EntityBase.generate(preload("res://components/Characters/KukeMC.tscn"), MathTool.randv2_range(500), true, false) + furryr.currentFocusedBoss = kukemc + kukemc.currentFocusedBoss = furryr static func create( entity_: PackedScene, minCount_: int = 1, @@ -52,5 +57,7 @@ static func spawn(): for j in range(entityCountOf(wave)): EntityBase.generate(wave.entity, MathTool.randv2_range(500), true, wave.isBoss) static func next(): + if current == 0: + customStart() spawn() current += 1 diff --git a/scripts/Statemachine/BulletBase.gd b/scripts/Statemachine/BulletBase.gd index 3b02e33..50af601 100644 --- a/scripts/Statemachine/BulletBase.gd +++ b/scripts/Statemachine/BulletBase.gd @@ -79,9 +79,10 @@ func _physics_process(_delta: float) -> void: func hit(target: Node): var entity: EntityBase = EntityTool.fromHurtbox(target) if !entity || !launcher: return + if entity.currentInvinsible: return if !canDamageSelf && entity == launcher: return if !indisDamage && !GameRule.allowFriendlyFire: - if entity.isPlayer() == launcher.isPlayer(): return + if entity.isPlayer() == launcher.isPlayer() and launcher.currentFocusedBoss != entity: return var damages = entity.takeDamage(self, MathTool.rate(launcher.fields.get(FieldStore.Entity.CRIT_RATE) + GameRule.critRateInfluenceByLuckValue * launcher.fields[FieldStore.Entity.LUCK_VALUE])) succeedToHit(damages) if MathTool.rate(fullPenerate()): diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index 7ddc817..5e927e5 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -73,6 +73,7 @@ var inventoryMax = { @export var dropCounts: Array[Vector2] = [] @export var appleCount: Vector2i = Vector2(0, 2) # 死亡后掉落的苹果数量 @export var level: int = 1 +@export var currentInvinsible: bool = false @onready var animatree: AnimationTree = $"%animatree" @onready var texture: AnimatedSprite2D = $"%texture" @@ -127,7 +128,8 @@ func _ready(): icon.weapon = i UIState.skillIconContainer.add_child(icon) else: - currentFocusedBoss = get_tree().get_nodes_in_group("players")[0] + if !currentFocusedBoss: + currentFocusedBoss = get_tree().get_nodes_in_group("players")[0] applyLevel() health = fields.get(FieldStore.Entity.MAX_HEALTH) energy = fields.get(FieldStore.Entity.MAX_ENERGY)