feat: HUD 重构与主题资源——灵米显示、新布局、标签描边阴影、按钮/菜单主题

This commit is contained in:
2026-08-08 23:22:28 +08:00
parent 543af0a4ff
commit c9af0f608e
12 changed files with 460 additions and 127 deletions
+10
View File
@@ -3,9 +3,11 @@ extends Node
signal spirit_stones_changed(new_value: int, delta: int)
signal reputation_changed(new_value: int, delta: int)
signal food_changed(new_value: int, delta: int)
var spirit_stones := 0 # 灵石
var reputation := 0 # 声望
var food := 0 # 灵米(食物资源,HUD 显示"灵米"
func add_spirit_stones(amount: int) -> void:
@@ -23,3 +25,11 @@ func add_reputation(amount: int) -> void:
func remove_reputation(amount: int) -> void:
reputation -= amount
emit_signal("reputation_changed", reputation, -amount)
func add_food(amount: int) -> void:
food += amount
emit_signal("food_changed", food, amount)
func remove_food(amount: int) -> void:
food -= amount
emit_signal("food_changed", food, -amount)
+151 -111
View File
@@ -1,11 +1,14 @@
[gd_scene format=3 uid="uid://dl0tb68vsw3c6"]
[ext_resource type="FontFile" uid="uid://drt448qncx27p" path="res://assets/fonts/dingliezhuhaifont-20240831GengXinBan)-2.ttf" id="1_pa2rn"]
[ext_resource type="Script" uid="uid://d3o1ssph7ca58" path="res://src/UI/HUD/top_bar_hud.gd" id="1_vm4eo"]
[ext_resource type="Theme" uid="uid://05ygdcq8dme4" path="res://resources/hud_button_theme.tres" id="2_ymrsi"]
[ext_resource type="LabelSettings" uid="uid://d1v74ab2ldtn7" path="res://resources/hud_label_settings.tres" id="3_4k476"]
[sub_resource type="LabelSettings" id="LabelSettings_bn2o5"]
font = ExtResource("1_pa2rn")
font_size = 32
shadow_size = 2
shadow_color = Color(0, 0, 0, 0.7)
shadow_offset = Vector2(1, 2)
[node name="TopBarHud" type="Control" unique_id=1115394694]
layout_mode = 3
@@ -16,167 +19,204 @@ grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_vm4eo")
[node name="HBoxContainer" type="HBoxContainer" parent="." unique_id=1608257100]
[node name="VBoxContainer" type="VBoxContainer" parent="." unique_id=1616038110]
layout_mode = 1
anchors_preset = 10
anchors_preset = 15
anchor_right = 1.0
offset_bottom = 23.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Label_Currency" type="Label" parent="HBoxContainer" unique_id=766096596]
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer" unique_id=2089867867]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
text = "灵石"
label_settings = SubResource("LabelSettings_bn2o5")
[node name="Value_Currency" type="Label" parent="HBoxContainer" unique_id=1150573727]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
size_flags_stretch_ratio = 2.0
label_settings = SubResource("LabelSettings_bn2o5")
[node name="Label_Time" type="Label" parent="HBoxContainer" unique_id=671872515]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
text = "时间"
label_settings = SubResource("LabelSettings_bn2o5")
[node name="Value_Time" type="Label" parent="HBoxContainer" unique_id=1229577188]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
size_flags_stretch_ratio = 2.0
label_settings = SubResource("LabelSettings_bn2o5")
[node name="Label_Reputation" type="Label" parent="HBoxContainer" unique_id=985110673]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
text = "声望"
label_settings = SubResource("LabelSettings_bn2o5")
[node name="Value_Reputation" type="Label" parent="HBoxContainer" unique_id=2011931119]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
size_flags_stretch_ratio = 2.0
label_settings = SubResource("LabelSettings_bn2o5")
[node name="Label_Qi" type="Label" parent="HBoxContainer" unique_id=790000001]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
text = "灵气"
label_settings = SubResource("LabelSettings_bn2o5")
[node name="Value_Qi" type="Label" parent="HBoxContainer" unique_id=790000002]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
size_flags_stretch_ratio = 2.0
label_settings = SubResource("LabelSettings_bn2o5")
[node name="SpeedGroup" type="HBoxContainer" parent="HBoxContainer" unique_id=2144893126]
[node name="SpeedGroup" type="HBoxContainer" parent="VBoxContainer/HBoxContainer2" unique_id=2144893126]
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 3.0
theme_override_constants/separation = 4
[node name="Button_Pause" type="Button" parent="HBoxContainer/SpeedGroup" unique_id=2144893127]
[node name="Button_Pause" type="Button" parent="VBoxContainer/HBoxContainer2/SpeedGroup" unique_id=2144893127]
unique_name_in_owner = true
custom_minimum_size = Vector2(64, 0)
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 3.0
theme_override_fonts/font = ExtResource("1_pa2rn")
theme_override_font_sizes/font_size = 32
theme = ExtResource("2_ymrsi")
text = "暂停"
[node name="Button_Speed1" type="Button" parent="HBoxContainer/SpeedGroup" unique_id=2144893128]
[node name="Button_Speed1" type="Button" parent="VBoxContainer/HBoxContainer2/SpeedGroup" unique_id=2144893128]
unique_name_in_owner = true
custom_minimum_size = Vector2(48, 0)
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 2.0
theme_override_fonts/font = ExtResource("1_pa2rn")
theme_override_font_sizes/font_size = 32
theme = ExtResource("2_ymrsi")
text = "1x"
[node name="Button_Speed5" type="Button" parent="HBoxContainer/SpeedGroup" unique_id=2144893129]
[node name="Button_Speed5" type="Button" parent="VBoxContainer/HBoxContainer2/SpeedGroup" unique_id=2144893129]
unique_name_in_owner = true
custom_minimum_size = Vector2(48, 0)
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 2.0
theme_override_fonts/font = ExtResource("1_pa2rn")
theme_override_font_sizes/font_size = 32
theme = ExtResource("2_ymrsi")
text = "5x"
[node name="Button_Speed20" type="Button" parent="HBoxContainer/SpeedGroup" unique_id=2144893130]
[node name="Button_Speed20" type="Button" parent="VBoxContainer/HBoxContainer2/SpeedGroup" unique_id=2144893130]
unique_name_in_owner = true
custom_minimum_size = Vector2(48, 0)
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 2.0
theme_override_fonts/font = ExtResource("1_pa2rn")
theme_override_font_sizes/font_size = 32
theme = ExtResource("2_ymrsi")
text = "20x"
[node name="placeholder_1" type="Label" parent="HBoxContainer" unique_id=1042446504]
[node name="placeholder_1" type="Label" parent="VBoxContainer/HBoxContainer2" unique_id=1042446504]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
size_flags_vertical = 1
size_flags_stretch_ratio = 8.0
label_settings = SubResource("LabelSettings_bn2o5")
[node name="placeholder_2" type="Label" parent="HBoxContainer" unique_id=1526548351]
[node name="Button_StaffManagement" type="Button" parent="VBoxContainer/HBoxContainer2" unique_id=568204305]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
label_settings = SubResource("LabelSettings_bn2o5")
[node name="placeholder_3" type="Label" parent="HBoxContainer" unique_id=1170426663]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
label_settings = SubResource("LabelSettings_bn2o5")
[node name="placeholder_4" type="Label" parent="HBoxContainer" unique_id=1878816574]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
label_settings = SubResource("LabelSettings_bn2o5")
[node name="Button_StaffManagement" type="Button" parent="HBoxContainer" unique_id=568204305]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 4
theme_override_fonts/font = ExtResource("1_pa2rn")
theme_override_font_sizes/font_size = 32
theme = ExtResource("2_ymrsi")
text = "管理"
[node name="Button_ResourcesManagement" type="Button" parent="HBoxContainer" unique_id=1424251140]
[node name="Button_ResourcesManagement" type="Button" parent="VBoxContainer/HBoxContainer2" unique_id=1424251140]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 4
theme_override_fonts/font = ExtResource("1_pa2rn")
theme_override_font_sizes/font_size = 32
theme = ExtResource("2_ymrsi")
text = "资源"
[node name="Button_Return" type="Button" parent="HBoxContainer" unique_id=867839141]
[node name="Button_Return" type="Button" parent="VBoxContainer/HBoxContainer2" unique_id=867839141]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 4
theme_override_fonts/font = ExtResource("1_pa2rn")
theme_override_font_sizes/font_size = 32
theme = ExtResource("2_ymrsi")
text = "返回"
[connection signal="button_up" from="HBoxContainer/SpeedGroup/Button_Pause" to="." method="_on_button_pause_button_up"]
[connection signal="button_up" from="HBoxContainer/Button_StaffManagement" to="." method="_on_button_staff_management_button_up"]
[connection signal="button_up" from="HBoxContainer/Button_Return" to="." method="_on_button_return_button_up"]
[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer" unique_id=2058056395]
layout_mode = 2
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3" unique_id=1608257100]
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 25.0
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/HBoxContainer3/HBoxContainer" unique_id=1557830593]
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 4.0
[node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer" unique_id=967979380]
layout_mode = 2
[node name="Label_Time" type="Label" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer/HBoxContainer5" unique_id=671872515]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
theme_override_colors/font_color = Color(0.72, 0.85, 0.78, 1)
text = "时间"
label_settings = ExtResource("3_4k476")
[node name="Value_Time" type="Label" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer/HBoxContainer5" unique_id=1229577188]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 1
size_flags_stretch_ratio = 5.0
theme_override_colors/font_color = Color(0.93, 0.96, 0.88, 1)
label_settings = ExtResource("3_4k476")
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer" unique_id=516862989]
layout_mode = 2
size_flags_vertical = 3
[node name="Label_Currency" type="Label" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer/HBoxContainer" unique_id=766096596]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 1
theme_override_colors/font_color = Color(0.72, 0.85, 0.78, 1)
text = "灵石"
label_settings = ExtResource("3_4k476")
[node name="Value_Currency" type="Label" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer/HBoxContainer" unique_id=1150573727]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 1
size_flags_stretch_ratio = 5.0
theme_override_colors/font_color = Color(0.93, 0.96, 0.88, 1)
label_settings = ExtResource("3_4k476")
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer" unique_id=2103796675]
layout_mode = 2
[node name="Label_Reputation" type="Label" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer/HBoxContainer2" unique_id=985110673]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
theme_override_colors/font_color = Color(0.72, 0.85, 0.78, 1)
text = "声望"
label_settings = ExtResource("3_4k476")
[node name="Value_Reputation" type="Label" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer/HBoxContainer2" unique_id=2011931119]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 1
size_flags_stretch_ratio = 5.0
theme_override_colors/font_color = Color(0.93, 0.96, 0.88, 1)
label_settings = ExtResource("3_4k476")
[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer" unique_id=1647418947]
layout_mode = 2
[node name="Label_Food" type="Label" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer/HBoxContainer3" unique_id=791000001]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
theme_override_colors/font_color = Color(0.72, 0.85, 0.78, 1)
text = "灵米"
label_settings = ExtResource("3_4k476")
[node name="Value_Food" type="Label" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer/HBoxContainer3" unique_id=791000002]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 1
size_flags_stretch_ratio = 5.0
theme_override_colors/font_color = Color(0.93, 0.96, 0.88, 1)
label_settings = ExtResource("3_4k476")
[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer" unique_id=758328210]
layout_mode = 2
[node name="Label_Qi" type="Label" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer/HBoxContainer4" unique_id=790000001]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 8
theme_override_colors/font_color = Color(0.72, 0.85, 0.78, 1)
text = "灵气"
label_settings = ExtResource("3_4k476")
[node name="Value_Qi" type="Label" parent="VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer/HBoxContainer4" unique_id=790000002]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 1
size_flags_stretch_ratio = 5.0
theme_override_colors/font_color = Color(0.93, 0.96, 0.88, 1)
label_settings = ExtResource("3_4k476")
[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer3" unique_id=1867196268]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 1
size_flags_stretch_ratio = 75.0
[connection signal="button_up" from="VBoxContainer/HBoxContainer2/SpeedGroup/Button_Pause" to="." method="_on_button_pause_button_up"]
[connection signal="button_up" from="VBoxContainer/HBoxContainer2/Button_StaffManagement" to="." method="_on_button_staff_management_button_up"]
[connection signal="button_up" from="VBoxContainer/HBoxContainer2/Button_Return" to="." method="_on_button_return_button_up"]
+11 -3
View File
@@ -1,5 +1,5 @@
## 顶部信息栏 HUD(挂载于 TopBarHUD.tscn)。
## 显示灵石/时间/声望,提供时间流速控制与返回主菜单入口。
## 显示资源(灵石/声望/灵米/灵气浓度)与时间,提供时间流速控制与返回主菜单入口。
extends Control
## 请求返回主菜单。
@@ -11,6 +11,7 @@ signal sign_open_disciples
@onready var currency_label: Label = %Value_Currency
@onready var reputation_label: Label = %Value_Reputation
@onready var qi_label: Label = %Value_Qi
@onready var food_label: Label = %Value_Food
@onready var pause_button: Button = %Button_Pause
@onready var speed_buttons: Array[Button] = [%Button_Speed1, %Button_Speed5, %Button_Speed20]
@@ -24,8 +25,10 @@ func _ready() -> void:
# 资源数值:信号仅在变化时触发,初始值需手动设置一次
SectManager.spirit_stones_changed.connect(_on_spirit_stones_changed)
SectManager.reputation_changed.connect(_on_reputation_changed)
SectManager.food_changed.connect(_on_food_changed)
currency_label.text = str(SectManager.spirit_stones)
reputation_label.text = str(SectManager.reputation)
food_label.text = str(SectManager.food)
# 灵气浓度:当前为配置固定值(D6 建筑系统接入后动态刷新)
qi_label.text = "%d%%" % roundi(GameConfig.qi_concentration * 100)
time_label.text = TimeSystem.get_date_text()
@@ -46,6 +49,11 @@ func _on_spirit_stones_changed(new_value: int, _delta: int) -> void:
func _on_reputation_changed(new_value: int, _delta: int) -> void:
reputation_label.text = str(new_value)
## 灵米(食物)变化时刷新显示。
## @param new_value: 变化后的灵米总量
func _on_food_changed(new_value: int, _delta: int) -> void:
food_label.text = str(new_value)
## 点击"返回"按钮。
func _on_button_return_button_up() -> void:
sign_return_mainmenu.emit()
@@ -69,10 +77,10 @@ func _on_speed_button_up(index: int) -> void:
## 标签共用同一 LabelSettings 资源,改一处全生效;按钮逐个覆盖。
func _apply_hud_font() -> void:
var size := GameConfig.hud_font_size
var settings: LabelSettings = $HBoxContainer/Label_Currency.label_settings
var settings: LabelSettings = $VBoxContainer/HBoxContainer3/HBoxContainer/VBoxContainer/HBoxContainer/Label_Currency.label_settings
if settings != null:
settings.font_size = size
for btn in $HBoxContainer.find_children("*", "Button", true, false):
for btn in $VBoxContainer.find_children("*", "Button", true, false):
btn.add_theme_font_size_override("font_size", size)
## 刷新速度组 UI:暂停按钮文字与各档位按下状态。
+5 -9
View File
@@ -2,7 +2,7 @@
[ext_resource type="Script" uid="uid://drfyh36my6gj2" path="res://src/UI/Panels/MainMenu/MainMenu.gd" id="1_cwvg5"]
[ext_resource type="Texture2D" uid="uid://c6bthhmao5fyh" path="res://assets/sprites/ui/图片大门.png" id="2_q7typ"]
[ext_resource type="FontFile" uid="uid://drt448qncx27p" path="res://assets/fonts/dingliezhuhaifont-20240831GengXinBan)-2.ttf" id="3_q7typ"]
[ext_resource type="Theme" uid="uid://ctuanla5trf4s" path="res://resources/main_menu_theme.tres" id="3_7e5ie"]
[ext_resource type="PackedScene" uid="uid://dj7b5vssydifa" path="res://src/UI/Panels/SavePanel.tscn" id="3_wrf65"]
[node name="MainMenu" type="Control" unique_id=1416317040]
@@ -49,29 +49,25 @@ alignment = 1
[node name="NewGame" type="Button" parent="ButtonGroup" unique_id=835084060]
custom_minimum_size = Vector2(200, 48)
layout_mode = 2
theme_override_fonts/font = ExtResource("3_q7typ")
theme_override_font_sizes/font_size = 32
theme = ExtResource("3_7e5ie")
text = "新游戏"
[node name="LoadGame" type="Button" parent="ButtonGroup" unique_id=2093610529]
custom_minimum_size = Vector2(200, 48)
layout_mode = 2
theme_override_fonts/font = ExtResource("3_q7typ")
theme_override_font_sizes/font_size = 32
theme = ExtResource("3_7e5ie")
text = "读取存档"
[node name="Settings" type="Button" parent="ButtonGroup" unique_id=2045302694]
custom_minimum_size = Vector2(200, 48)
layout_mode = 2
theme_override_fonts/font = ExtResource("3_q7typ")
theme_override_font_sizes/font_size = 32
theme = ExtResource("3_7e5ie")
text = "设置"
[node name="Quit" type="Button" parent="ButtonGroup" unique_id=818112870]
custom_minimum_size = Vector2(200, 48)
layout_mode = 2
theme_override_fonts/font = ExtResource("3_q7typ")
theme_override_font_sizes/font_size = 32
theme = ExtResource("3_7e5ie")
text = "退出"
[node name="SavePanel" parent="." unique_id=619488443 instance=ExtResource("3_wrf65")]