From f764f0b3c9aad1ca3ce5bba5f53a57c4ab114d24 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: Wed, 27 Aug 2025 12:46:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=83=BD=E9=87=8F?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E5=88=B0=E8=A7=92=E8=89=B2=EF=BC=8C=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E6=94=BB=E5=87=BB=E9=80=BB=E8=BE=91=E4=BB=A5=E6=B6=88?= =?UTF-8?q?=E8=80=97=E8=83=BD=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/Characters/Chick.tscn | 1 + components/Characters/Hen.tscn | 3 ++- components/Characters/Rooster.tscn | 1 + scripts/Contents/Characters/Chick.gd | 8 ++++---- scripts/Contents/Characters/Hen.gd | 2 +- scripts/Contents/Characters/Rooster.gd | 2 +- scripts/Contents/Wave.gd | 2 +- scripts/Statemachine/BulletBase.gd | 14 ++++++++++---- scripts/Statemachine/EntityBase.gd | 13 +++++++------ 9 files changed, 28 insertions(+), 18 deletions(-) diff --git a/components/Characters/Chick.tscn b/components/Characters/Chick.tscn index 92a52fe..451ac74 100644 --- a/components/Characters/Chick.tscn +++ b/components/Characters/Chick.tscn @@ -37,6 +37,7 @@ displayName = "小鸡" drops = Array[int]([0, 1]) dropCounts = Array[Vector2]([Vector2(10, 20), Vector2(7, 14)]) appleCount = Vector2i(2, 6) +energy = 1000.0 [node name="hurt" parent="sounds" index="3"] stream = ExtResource("3_ik1xf") diff --git a/components/Characters/Hen.tscn b/components/Characters/Hen.tscn index 4763f16..4027654 100644 --- a/components/Characters/Hen.tscn +++ b/components/Characters/Hen.tscn @@ -36,8 +36,9 @@ script = ExtResource("2_8u5a0") cooldownUnit = 500.0 drops = Array[int]([0, 1]) dropCounts = Array[Vector2]([Vector2(4, 8), Vector2(2, 6)]) +energy = 1000.0 -[node name="hurt" parent="sounds" index="2"] +[node name="hurt" parent="sounds" index="3"] stream = ExtResource("3_ojyt7") [node name="texture" parent="." index="1"] diff --git a/components/Characters/Rooster.tscn b/components/Characters/Rooster.tscn index d99a8a2..8cec615 100644 --- a/components/Characters/Rooster.tscn +++ b/components/Characters/Rooster.tscn @@ -38,6 +38,7 @@ radius = 41.0122 [node name="Rooster" instance=ExtResource("1_e5pl8")] script = ExtResource("2_oqdqd") cooldownUnit = 200.0 +energy = 50.0 [node name="sprint" parent="sounds" index="0"] stream = ExtResource("4_66s6c") diff --git a/scripts/Contents/Characters/Chick.gd b/scripts/Contents/Characters/Chick.gd index 57d93a1..4b96e89 100644 --- a/scripts/Contents/Characters/Chick.gd +++ b/scripts/Contents/Characters/Chick.gd @@ -6,7 +6,7 @@ class_name Chick const laserCount = 4 func _ready(): - fields[FieldStore.Entity.MAX_HEALTH] = 1000 + fields[FieldStore.Entity.MAX_HEALTH] = 2000 fields[FieldStore.Entity.MOVEMENT_SPEED] = 0.1 super._ready() @@ -22,13 +22,13 @@ func attack(type): if type == 0: var weaponPos = findWeaponAnchor("normal") for i in randi_range(10, 20): - BulletBase.generate(preload("res://components/Bullets/Diamond.tscn"), self, weaponPos + MathTool.randv2_range(20), rotation + deg_to_rad(randf_range(-90, 90))) + return BulletBase.generate(preload("res://components/Bullets/Diamond.tscn"), self, weaponPos + MathTool.randv2_range(20), rotation + deg_to_rad(randf_range(-90, 90))) elif type == 1: for i in range(laserCount): - BulletBase.generate(preload("res://components/Bullets/Laser.tscn"), self, texture.global_position, deg_to_rad(90 * i)) + return BulletBase.generate(preload("res://components/Bullets/Laser.tscn"), self, texture.global_position, deg_to_rad(90 * i)) elif type == 2: var weaponPos = findWeaponAnchor("normal") var target = weaponPos.angle_to_point(currentFocusedBoss.position) firepot.global_rotation = target firepot.shot() - BulletBase.generate(preload("res://components/Bullets/FireScan.tscn"), self, weaponPos, target) + return BulletBase.generate(preload("res://components/Bullets/FireScan.tscn"), self, weaponPos, target) diff --git a/scripts/Contents/Characters/Hen.gd b/scripts/Contents/Characters/Hen.gd index 831328b..9a79829 100644 --- a/scripts/Contents/Characters/Hen.gd +++ b/scripts/Contents/Characters/Hen.gd @@ -12,4 +12,4 @@ func ai(): func attack(type): if type == 0: var weaponPos = findWeaponAnchor("normal") - BulletBase.generate(preload("res://components/Bullets/HenBomb.tscn"), self, weaponPos, 0) + return BulletBase.generate(preload("res://components/Bullets/HenBomb.tscn"), self, weaponPos, 0) diff --git a/scripts/Contents/Characters/Rooster.gd b/scripts/Contents/Characters/Rooster.gd index 8dbccd4..384a2b3 100644 --- a/scripts/Contents/Characters/Rooster.gd +++ b/scripts/Contents/Characters/Rooster.gd @@ -22,7 +22,7 @@ func ai(): func attack(type): if type == 0: var weaponPos = findWeaponAnchor("normal") - BulletBase.generate(preload("res://components/Bullets/PurpleCrystal.tscn"), self, weaponPos, (get_global_mouse_position() - weaponPos).angle()) + return BulletBase.generate(preload("res://components/Bullets/PurpleCrystal.tscn"), self, weaponPos, (get_global_mouse_position() - weaponPos).angle()) func sprint(): move(Vector2( Input.get_axis("m_left", "m_right"), diff --git a/scripts/Contents/Wave.gd b/scripts/Contents/Wave.gd index 69fab7b..4099236 100644 --- a/scripts/Contents/Wave.gd +++ b/scripts/Contents/Wave.gd @@ -13,7 +13,7 @@ static var countBoost: float = 0.1 # 每波增加的敌人数量百分比,指 static var data: Array[Wave] = [ # entity, minCount, maxCount, isBoss, from, to, per create(preload("res://components/Characters/Hen.tscn"), 1, 5, false, 0, INF, 1), - create(preload("res://components/Characters/Chick.tscn"), 0, 0, true, 0, INF, 1) + create(preload("res://components/Characters/Chick.tscn"), 0, 0, true, 8, INF, 1) ] static func create( diff --git a/scripts/Statemachine/BulletBase.gd b/scripts/Statemachine/BulletBase.gd index b9f3f46..68e3cb2 100644 --- a/scripts/Statemachine/BulletBase.gd +++ b/scripts/Statemachine/BulletBase.gd @@ -10,6 +10,7 @@ class_name BulletBase @export var lifeTime: float = -1 # -1表示无限时间 @export var indisDamage: bool = false # 是否无差别伤害(不区分敌我) @export var canDamageSelf: bool = false # 是否可以伤害发射者 +@export var needEnergy: float = 4.0 # 发射时需要消耗的能量 var launcher: EntityBase = null var spawnInWhen: float = 0 @@ -37,12 +38,14 @@ func hit(target: Node): if !indisDamage && !GameRule.allowFriendlyFire: if entity.isPlayer() == launcher.isPlayer(): return entity.takeDamage(self, MathTool.rate(launcher.fields.get(FieldStore.Entity.CRIT_RATE))) - if !MathTool.rate(fullPenerate(entity)): + if MathTool.rate(fullPenerate()): + fields[FieldStore.Bullet.PENERATE] -= entity.fields[FieldStore.Entity.PENARATION_RESISTANCE] + else: destroy() func forward(direction: Vector2): position += direction.normalized() * fields.get(FieldStore.Bullet.SPEED) * GameRule.bulletSpeedMultiplier -func fullPenerate(target: EntityBase): - return fields.get(FieldStore.Bullet.PENERATE) * (1 + launcher.fields.get(FieldStore.Entity.PENERATE)) - target.fields.get(FieldStore.Entity.PENARATION_RESISTANCE) +func fullPenerate(): + return fields.get(FieldStore.Bullet.PENERATE) + launcher.fields.get(FieldStore.Entity.PENERATE) func ai(): pass @@ -61,10 +64,13 @@ static func generate( var instances = [] for i in range(count): var instance: BulletBase = bullet.instantiate() + if launchBy.energy < instance.needEnergy: + continue + launchBy.energy -= instance.needEnergy instance.launcher = launchBy instance.position = spawnPosition instance.rotation = spawnRotation + deg_to_rad(randf_range(-launchBy.fields.get(FieldStore.Entity.OFFSET_SHOOT), launchBy.fields.get(FieldStore.Entity.OFFSET_SHOOT))) if addToWorld: WorldManager.rootNode.add_child(instance) instances.append(instance) - return instances + return len(instances) diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index 37fd304..ac4414c 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -46,7 +46,7 @@ var inventoryMax = { @onready var damageAnchor: Node2D = $"%damageAnchor" var health: float = 0 -var energy: float = 0 +@export var energy: float = 0 var sprinting: bool = false var lastDirection: int = 1 @@ -68,10 +68,10 @@ func _ready(): currentFocusedBoss = get_tree().get_nodes_in_group("players")[0] func _process(_delta): health = clamp(health, 0, fields.get(FieldStore.Entity.MAX_HEALTH)) - animatree.set("parameters/blend_position", lerpf(animatree.get("parameters/blend_position"), lastDirection, 0.1)) for i in inventory: inventory[i] = clamp(inventory[i], 0, inventoryMax[i]) func _physics_process(_delta: float) -> void: + animatree.set("parameters/blend_position", lerpf(animatree.get("parameters/blend_position"), lastDirection, 0.1)) if sprinting: velocity *= 0.9 if velocity.length() <= 100: @@ -81,6 +81,7 @@ func _physics_process(_delta: float) -> void: if isPlayer() or is_instance_valid(currentFocusedBoss): ai() move_and_slide() + storeEnergy(0.05) # 通用方法 func displace(direction: Vector2, isSprinting: bool = false): @@ -96,11 +97,11 @@ func takeDamage(bullet: BulletBase, crit: bool): var damage = baseDamage + baseDamage * int(crit) * fields.get(FieldStore.Entity.CRIT_DAMAGE) if sprinting: playSound("miss") - storeEnergy(damage * 0.5) + storeEnergy(damage * 1.5) damage = 0 else: playSound("hurt") - bullet.launcher.storeEnergy(damage * 0.25) + bullet.launcher.storeEnergy(damage * 0.5) health -= damage DamageLabel.create(damage, crit, damageAnchor.global_position + MathTool.randv2_range(GameRule.damageLabelSpawnOffset)) if isBoss and bullet.launcher.isPlayer(): @@ -122,8 +123,8 @@ func startCooldown(): func tryAttack(type: int): var state = startCooldown() if state: - playSound("attack" + str(type)) - attack(type) + if attack(type): + playSound("attack" + str(type)) return state func trySprint(): playSound("sprint")