From a38d99a9980f0a24192d37631c35063123187b1c 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, 26 Sep 2025 22:37:05 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E5=AD=90=E5=BC=B9=E7=B3=BB=E7=BB=9F):?= =?UTF-8?q?=20=E9=87=8D=E6=9E=84=E5=AD=90=E5=BC=B9=E4=BC=A4=E5=AE=B3?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将子弹伤害检测逻辑提取到BulletTool工具类中 新增SevenSoul子弹的初始属性和碰撞处理 调整hitbox位置并启用碰撞检测 --- components/Bullets/SevenSoul.tscn | 5 ++++- scripts/Contents/Bullets/SevenSoul.gd | 8 ++++++++ scripts/Statemachine/BulletBase.gd | 5 +---- scripts/Tools/BulletTool.gd | 13 +++++++++++++ 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 scripts/Tools/BulletTool.gd diff --git a/components/Bullets/SevenSoul.tscn b/components/Bullets/SevenSoul.tscn index 29f6cee..9595515 100644 --- a/components/Bullets/SevenSoul.tscn +++ b/components/Bullets/SevenSoul.tscn @@ -29,6 +29,9 @@ alpha_curve = SubResource("CurveTexture_d1eej") [node name="SevenSoul" instance=ExtResource("1_c4fl5")] script = ExtResource("2_egs34") +speed = 0.0 +damage = 0.0 +penerate = 1.0 lifeTime = 112000.0 [node name="heart" type="Sprite2D" parent="texture" index="1"] @@ -49,4 +52,4 @@ one_shot = true local_coords = true [node name="hitbox" parent="." index="1"] -disabled = true +position = Vector2(100, 0) diff --git a/scripts/Contents/Bullets/SevenSoul.gd b/scripts/Contents/Bullets/SevenSoul.gd index ef6b9c0..8e03c0e 100644 --- a/scripts/Contents/Bullets/SevenSoul.gd +++ b/scripts/Contents/Bullets/SevenSoul.gd @@ -15,6 +15,14 @@ var pingAfterGeneration: float = 5000 @onready var heart = $"%heart" @onready var effect: GPUParticles2D = $"%effect" +func register(): + area_entered.connect( + func(area): + var bullet = BulletTool.fromArea(area) + if bullet and BulletTool.canDamage(bullet, launcher): + launcher.tryHeal(1) + launcher.storeEnergy(damage * 0.25) + ) func spawn(): modulate = Color(colors[index % colors.size()]) effect.emitting = true diff --git a/scripts/Statemachine/BulletBase.gd b/scripts/Statemachine/BulletBase.gd index b771ae4..4f99ddc 100644 --- a/scripts/Statemachine/BulletBase.gd +++ b/scripts/Statemachine/BulletBase.gd @@ -81,10 +81,7 @@ 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() and launcher.currentFocusedBoss != entity: return + if !BulletTool.canDamage(self, entity): return var resultDamage = entity.takeDamage(self, MathTool.rate(launcher.fields.get(FieldStore.Entity.CRIT_RATE) + GameRule.critRateInfluenceByLuckValue * launcher.fields[FieldStore.Entity.LUCK_VALUE])) succeedToHit(resultDamage, entity) if MathTool.rate(fullPenerate()): diff --git a/scripts/Tools/BulletTool.gd b/scripts/Tools/BulletTool.gd new file mode 100644 index 0000000..418c6d8 --- /dev/null +++ b/scripts/Tools/BulletTool.gd @@ -0,0 +1,13 @@ +class_name BulletTool + +static func fromArea(area: Area2D) -> BulletBase: + if area is BulletBase: + return area as BulletBase + else: + return null +static func canDamage(bullet: BulletBase, target: EntityBase) -> bool: + if target.currentInvinsible: return false + if !bullet.canDamageSelf && target == bullet.launcher: return false + if !bullet.is_node_ready() && !GameRule.allowFriendlyFire: + if target.isPlayer() == bullet.launcher.isPlayer() and bullet.launcher.currentFocusedBoss != target: return false + return true