From 8de262a615985b3bc9f5caaf87f465450934c47b 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, 28 Aug 2025 11:00:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=AE=9E=E4=BD=93=E7=B3=BB=E7=BB=9F):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=95=8C=E4=BA=BA=E7=AD=89=E7=BA=A7=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=B9=B6=E8=B0=83=E6=95=B4=E7=9B=B8=E5=85=B3UI?= =?UTF-8?q?=E5=92=8C=E6=B8=B8=E6=88=8F=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为敌人实体添加等级属性,影响生命值和伤害 在状态栏和Boss血条中显示等级信息 调整游戏规则增加难度相关的属性成长系数 修改粒子效果角度和波次生成逻辑 --- components/UI/BossBar.tscn | 16 ++++++++++++++ components/UI/EntityStateBar.tscn | 29 +++++++++++++++++++++++++- components/UI/ItemDropped.tscn | 2 +- scripts/Contents/Wave.gd | 2 +- scripts/Statemachine/EntityBase.gd | 17 ++++++++++++--- scripts/Statemachine/EntityStateBar.gd | 1 + scripts/Tools/GameRule.gd | 14 ++++++++++++- 7 files changed, 74 insertions(+), 7 deletions(-) diff --git a/components/UI/BossBar.tscn b/components/UI/BossBar.tscn index 1185261..8c5e1f5 100644 --- a/components/UI/BossBar.tscn +++ b/components/UI/BossBar.tscn @@ -53,6 +53,22 @@ layout_mode = 2 text = "BossName" label_settings = SubResource("LabelSettings_esyuk") +[node name="lv" type="Label" parent="health/panel/label"] +layout_mode = 2 +text = "Lv." +label_settings = SubResource("LabelSettings_esyuk") + +[node name="level" type="Label" parent="health/panel/label"] +unique_name_in_owner = true +layout_mode = 2 +text = "100" +label_settings = SubResource("LabelSettings_esyuk") + +[node name="sep" type="Label" parent="health/panel/label"] +layout_mode = 2 +text = " - " +label_settings = SubResource("LabelSettings_esyuk") + [node name="value" type="Label" parent="health/panel/label"] unique_name_in_owner = true layout_mode = 2 diff --git a/components/UI/EntityStateBar.tscn b/components/UI/EntityStateBar.tscn index cf8c8b6..2184784 100644 --- a/components/UI/EntityStateBar.tscn +++ b/components/UI/EntityStateBar.tscn @@ -1,8 +1,11 @@ -[gd_scene load_steps=3 format=3 uid="uid://dcjqjqere8ets"] +[gd_scene load_steps=4 format=3 uid="uid://dcjqjqere8ets"] [ext_resource type="PackedScene" uid="uid://d1ulrvupa76ap" path="res://components/UI/ColorBar.tscn" id="1_0ngbn"] [ext_resource type="Script" path="res://scripts/Statemachine/EntityStateBar.gd" id="1_ovbjr"] +[sub_resource type="LabelSettings" id="LabelSettings_ih2pl"] +font_size = 13 + [node name="EntityStateBar" type="Node2D"] script = ExtResource("1_ovbjr") @@ -12,3 +15,27 @@ offset_left = -50.0 offset_top = -5.0 offset_right = 50.0 offset_bottom = 5.0 + +[node name="levelLabel" type="HBoxContainer" parent="health"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.5 +anchor_top = -2.0 +anchor_right = 0.5 +anchor_bottom = -2.0 +offset_left = -25.0 +offset_right = 26.0 +offset_bottom = 19.0 +grow_horizontal = 2 +alignment = 1 + +[node name="tip" type="Label" parent="health/levelLabel"] +layout_mode = 2 +size_flags_vertical = 8 +text = "Lv." +label_settings = SubResource("LabelSettings_ih2pl") + +[node name="level" type="Label" parent="health/levelLabel"] +unique_name_in_owner = true +layout_mode = 2 +text = "100" diff --git a/components/UI/ItemDropped.tscn b/components/UI/ItemDropped.tscn index 6cff2b6..5b5e6dc 100644 --- a/components/UI/ItemDropped.tscn +++ b/components/UI/ItemDropped.tscn @@ -39,7 +39,7 @@ particle_flag_disable_z = true emission_shape = 1 emission_sphere_radius = 15.0 angle_min = 1.07288e-05 -angle_max = 720.0 +angle_max = 90.0 angle_curve = SubResource("CurveTexture_orbge") gravity = Vector3(0, 0, 0) scale_min = 5.0 diff --git a/scripts/Contents/Wave.gd b/scripts/Contents/Wave.gd index 0893b64..8bfa80b 100644 --- a/scripts/Contents/Wave.gd +++ b/scripts/Contents/Wave.gd @@ -12,7 +12,7 @@ static var current: int = 0 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, 8, INF, 4) + create(preload("res://components/Characters/Chick.tscn"), 0, 0, true, 1, INF, 4) ] static func create( diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index 695b7d5..6532811 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -48,6 +48,7 @@ var inventoryMax = { @export var drops: Array[ItemStore.ItemType] = [] @export var dropCounts: Array[Vector2] = [] @export var appleCount: Vector2i = Vector2(0, 3) # 死亡后掉落的苹果数量 +@export var level: int = 1 # 等级 @onready var animatree: AnimationTree = $"%animatree" @onready var texture: AnimatedSprite2D = $"%texture" @@ -72,6 +73,7 @@ func _ready(): else: statebar = selfStatebar statebar.entity = self + applyLevel() health = fields.get(FieldStore.Entity.MAX_HEALTH) energy = fields.get(FieldStore.Entity.MAX_ENERGY) * 0.5 if isPlayer(): @@ -98,9 +100,7 @@ func _ready(): currentFocusedBoss = get_tree().get_nodes_in_group("players")[0] healthChanged.connect( func(newHealth): - if is_instance_valid(statebar) or UIState.bossbar.entity == self: - if isBoss: - statebar = UIState.bossbar + if is_instance_valid(statebar): statebar.healthBar.maxValue = fields.get(FieldStore.Entity.MAX_HEALTH) statebar.healthBar.setCurrent(newHealth) ) @@ -111,6 +111,13 @@ func _process(_delta): energy = clamp(energy, 0, fields.get(FieldStore.Entity.MAX_ENERGY)) for i in inventory: inventory[i] = clamp(inventory[i], 0, inventoryMax[i]) + if isBoss: + if UIState.player.currentFocusedBoss == self: + statebar = UIState.bossbar + else: + statebar = null + if is_instance_valid(statebar): + statebar.levelLabel.text = str(level) func _physics_process(_delta: float) -> void: animatree.set("parameters/blend_position", lerpf(animatree.get("parameters/blend_position"), lastDirection, 0.2)) if sprinting: @@ -125,6 +132,9 @@ func _physics_process(_delta: float) -> void: storeEnergy(0.01) # 通用方法 +func applyLevel(): + fields[FieldStore.Entity.MAX_HEALTH] *= (1 + GameRule.entityHealthIncreasePerWave * (GameRule.difficulty + 1)) ** level + fields[FieldStore.Entity.DAMAGE_MULTIPILER] *= (1 + GameRule.entityDamageIncreasePerWave * (GameRule.difficulty + 1)) ** level func displace(direction: Vector2, isSprinting: bool = false): return (direction if isSprinting else direction.normalized()) * fields.get(FieldStore.Entity.MOVEMENT_SPEED) * 400 * abs(animatree.get("parameters/blend_position")) func move(direction: Vector2, isSprinting: bool = false): @@ -246,6 +256,7 @@ static func generate( var instance: EntityBase = entity.instantiate() instance.position = spawnPosition instance.isBoss = spawnAsBoss + instance.level = clamp((round(Wave.current * (1 + GameRule.entityLevelOffsetByWave * randf_range(-1, 1)))), 1, INF) if isMob: instance.add_to_group("mobs") if addToWorld: diff --git a/scripts/Statemachine/EntityStateBar.gd b/scripts/Statemachine/EntityStateBar.gd index 24a48fe..69a2a5b 100644 --- a/scripts/Statemachine/EntityStateBar.gd +++ b/scripts/Statemachine/EntityStateBar.gd @@ -4,3 +4,4 @@ class_name EntityStateBar @export var entity: EntityBase @onready var healthBar: ColorBar = $"%health" +@onready var levelLabel: Label = $"%level" diff --git a/scripts/Tools/GameRule.gd b/scripts/Tools/GameRule.gd index 61e92b7..ae7c09d 100644 --- a/scripts/Tools/GameRule.gd +++ b/scripts/Tools/GameRule.gd @@ -1,5 +1,14 @@ class_name GameRule +enum Difficulty { + EASY, + NORMAL, + HARD, + INSANE, + EXPERT, + MASTER, +} +static var difficulty: Difficulty = Difficulty.NORMAL static var allowFriendlyFire: bool = false # 是否允许友军伤害 static var bulletSpeedMultiplier: float = 1 # 子弹速度倍率 static var damageOffset: float = 0.2 # 伤害随机浮动比例,默认20%,即10的基础伤害会应用为8~12 @@ -9,4 +18,7 @@ static var appleDropRate: float = 0.1 # 苹果掉落概率 static var refreshCountIncreasePercent: Vector2 = Vector2(0.4, 1.1) # 刷新所需的棒球数量的增加的百分比,随机,默认为40%~110% static var entityCountBoostPerWave: float = 0.1 # 每波敌人数量增加的百分比,倍数级 static var itemShowStayTime: int = 1500 # 物品展示组件如果设置了自动隐藏,那么隐藏前可以存活的时间 -static var tipSpawnRateWhenGetDroppedItem: float = 0.25 # 当玩家获取到掉落物时,提示的概率 \ No newline at end of file +static var tipSpawnRateWhenGetDroppedItem: float = 0.25 # 当玩家获取到掉落物时,提示的概率 +static var entityHealthIncreasePerWave: float = 0.1 # 每波敌人生命值增加的百分比,指数级 +static var entityDamageIncreasePerWave: float = 0.05 # 每波敌人伤害增加的百分比,指数级 +static var entityLevelOffsetByWave: float = 0.3 # 每波敌人等级根据当前波数随机浮动的比例 \ No newline at end of file