From aa533509a59d35d68c3c9f7af10eee8d45442cd2 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 13:58:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(UI):=20=E6=B7=BB=E5=8A=A0=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=AE=9E=E4=BD=93=E5=B1=9E=E6=80=A7=E7=9A=84=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E5=92=8C=E5=8A=A8=E7=94=BB=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加新的输入动作"showFields"用于显示/隐藏实体属性面板 创建新的FieldShow组件用于显示实体属性值 为属性面板添加显示/隐藏动画效果 调整EntityBase中属性初始化的顺序 --- components/Scenes/UI.tscn | 173 +++++++++++++++++++++++++---- project.godot | 5 + scripts/Statemachine/EntityBase.gd | 6 +- scripts/Statemachine/FieldShow.gd | 14 ++- scripts/Statemachine/UIState.gd | 10 ++ scripts/Tools/MathTool.gd | 2 +- styleboxes/leftPanel.tres | 15 +++ 7 files changed, 194 insertions(+), 31 deletions(-) create mode 100644 styleboxes/leftPanel.tres diff --git a/components/Scenes/UI.tscn b/components/Scenes/UI.tscn index 0847092..2547324 100644 --- a/components/Scenes/UI.tscn +++ b/components/Scenes/UI.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3 uid="uid://dfwg750a47ggx"] +[gd_scene load_steps=17 format=3 uid="uid://dfwg750a47ggx"] [ext_resource type="PackedScene" uid="uid://ofpg5s3j7esv" path="res://components/UI/BossBar.tscn" id="1_2pe58"] [ext_resource type="Script" path="res://scripts/Statemachine/UIState.gd" id="1_f00a6"] @@ -10,6 +10,99 @@ [ext_resource type="PackedScene" uid="uid://beo6s1kudbbve" path="res://components/Scenes/FullscreenPanels/GameOver.tscn" id="6_10ay6"] [ext_resource type="Texture2D" uid="uid://k13cte17httt" path="res://resources/items/energy.svg" id="7_2om12"] [ext_resource type="PackedScene" uid="uid://d1ulrvupa76ap" path="res://components/UI/ColorBar.tscn" id="9_44nw8"] +[ext_resource type="StyleBox" uid="uid://ddnjus87wwlm8" path="res://styleboxes/leftPanel.tres" id="11_67ghp"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ri8gw"] +content_margin_left = 20.0 +content_margin_top = 20.0 +content_margin_right = 20.0 +content_margin_bottom = 20.0 + +[sub_resource type="Animation" id="Animation_5hjs3"] +resource_name = "hide" +length = 0.3 +step = 0.1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:position:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(-3, -0.25, 0, 0.25, 0, -100, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.3) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:modulate:a") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0, 0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.3) +} + +[sub_resource type="Animation" id="Animation_nqiiw"] +length = 0.001 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:position:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(-100, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:modulate:a") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} + +[sub_resource type="Animation" id="Animation_2xajo"] +resource_name = "hide" +length = 0.3 +step = 0.1 +tracks/0/type = "bezier" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath(".:position:x") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(-100, -0.25, 0, 0.25, 0, -3, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.3) +} +tracks/1/type = "bezier" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath(".:modulate:a") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"handle_modes": PackedInt32Array(0, 0), +"points": PackedFloat32Array(0, -0.25, 0, 0.25, 0, 1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.3) +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_37e4s"] +_data = { +"RESET": SubResource("Animation_nqiiw"), +"hide": SubResource("Animation_5hjs3"), +"show": SubResource("Animation_2xajo") +} [node name="UI" type="CanvasLayer"] process_mode = 3 @@ -28,7 +121,9 @@ unique_name_in_owner = true layout_mode = 1 metadata/_edit_lock_ = true -[node name="container" type="PanelContainer" parent="root"] +[node name="items" type="PanelContainer" parent="root"] +z_index = 1 +z_as_relative = false layout_mode = 1 anchors_preset = -1 anchor_left = 0.5 @@ -41,44 +136,28 @@ grow_horizontal = 2 theme_override_styles/panel = ExtResource("3_kep0k") metadata/_edit_lock_ = true -[node name="items" type="HBoxContainer" parent="root/container"] +[node name="items" type="HBoxContainer" parent="root/items"] unique_name_in_owner = true layout_mode = 2 alignment = 1 -[node name="baseball" parent="root/container/items" instance=ExtResource("3_o2oi4")] +[node name="baseball" parent="root/items/items" instance=ExtResource("3_o2oi4")] unique_name_in_owner = true layout_mode = 2 -[node name="basketball" parent="root/container/items" instance=ExtResource("3_o2oi4")] +[node name="basketball" parent="root/items/items" instance=ExtResource("3_o2oi4")] unique_name_in_owner = true layout_mode = 2 type = 1 -[node name="apple" parent="root/container/items" instance=ExtResource("3_o2oi4")] +[node name="apple" parent="root/items/items" instance=ExtResource("3_o2oi4")] unique_name_in_owner = true layout_mode = 2 type = 2 -[node name="panels" type="Control" parent="root"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -metadata/_edit_lock_ = true - -[node name="MakeFeed" parent="root/panels" instance=ExtResource("4_kkki3")] -visible = false -layout_mode = 1 - -[node name="GameOver" parent="root/panels" instance=ExtResource("6_10ay6")] -visible = false -layout_mode = 1 - [node name="energy" type="PanelContainer" parent="root"] +z_index = 1 +z_as_relative = false custom_minimum_size = Vector2(300, 0) layout_mode = 1 anchors_preset = -1 @@ -124,6 +203,35 @@ unique_name_in_owner = true custom_minimum_size = Vector2(0, 5) layout_mode = 2 +[node name="fields" type="PanelContainer" parent="root"] +modulate = Color(1, 1, 1, 0) +z_index = 1 +z_as_relative = false +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_left = -100.0 +offset_top = -30.0 +offset_right = -40.0 +offset_bottom = 30.0 +grow_vertical = 2 +theme_override_styles/panel = ExtResource("11_67ghp") + +[node name="wrapper" type="PanelContainer" parent="root/fields"] +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxEmpty_ri8gw") + +[node name="fields" type="VBoxContainer" parent="root/fields/wrapper"] +unique_name_in_owner = true +layout_mode = 2 + +[node name="fieldsAnimator" type="AnimationPlayer" parent="root/fields"] +unique_name_in_owner = true +libraries = { +"": SubResource("AnimationLibrary_37e4s") +} + [node name="itemCollect" type="VBoxContainer" parent="root"] unique_name_in_owner = true layout_mode = 1 @@ -138,3 +246,20 @@ offset_right = -80.8 offset_bottom = 0.400024 grow_vertical = 0 theme_override_constants/separation = 10 + +[node name="panels" type="Control" parent="root"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +metadata/_edit_lock_ = true + +[node name="MakeFeed" parent="root/panels" instance=ExtResource("4_kkki3")] +layout_mode = 1 + +[node name="GameOver" parent="root/panels" instance=ExtResource("6_10ay6")] +visible = false +layout_mode = 1 diff --git a/project.godot b/project.godot index 7d237ad..24bdb70 100644 --- a/project.godot +++ b/project.godot @@ -66,6 +66,11 @@ attack2={ "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"double_click":false,"script":null) ] } +showFields={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} [physics] diff --git a/scripts/Statemachine/EntityBase.gd b/scripts/Statemachine/EntityBase.gd index 34fa3ae..c30f9c0 100644 --- a/scripts/Statemachine/EntityBase.gd +++ b/scripts/Statemachine/EntityBase.gd @@ -73,9 +73,6 @@ 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(): statebar.levelLabels.hide() UIState.player = self @@ -99,6 +96,9 @@ func _ready(): ) else: currentFocusedBoss = get_tree().get_nodes_in_group("players")[0] + applyLevel() + health = fields.get(FieldStore.Entity.MAX_HEALTH) + energy = fields.get(FieldStore.Entity.MAX_ENERGY) * 0.5 healthChanged.connect( func(newHealth): if is_instance_valid(statebar): diff --git a/scripts/Statemachine/FieldShow.gd b/scripts/Statemachine/FieldShow.gd index 87d36ff..cb7e0f7 100644 --- a/scripts/Statemachine/FieldShow.gd +++ b/scripts/Statemachine/FieldShow.gd @@ -4,6 +4,7 @@ class_name FieldShow @export var field: FieldStore.Entity = FieldStore.Entity.MAX_HEALTH @export var value: float = 0 +@export var showSign: bool = true @onready var nameLabel: Label = $"%name" @onready var valueLabel: Label = $"%value" @@ -13,9 +14,16 @@ func _ready(): var formattedValue: String var dataType = FieldStore.entityMapType[field] if dataType == FieldStore.DataType.VALUE: - formattedValue = MathTool.signBeforeStr(value) + formattedValue = "%s" % (MathTool.signBeforeStr(value) if showSign else str(value)) elif dataType == FieldStore.DataType.ANGLE: - formattedValue = MathTool.signBeforeStr(value) + "°" + formattedValue = "%s°" % (MathTool.signBeforeStr(value) if showSign else str(value)) elif dataType == FieldStore.DataType.PERCENT: - formattedValue = MathTool.signBeforeStr(float("%.1f" % (value * 100))) + "%" + formattedValue = (MathTool.signBeforeStr(value * 100) if showSign else str(value * 100)) + "%" valueLabel.text = formattedValue + +static func create(newField: FieldStore.Entity, newValue: float, newShowSign: bool) -> FieldShow: + var fieldShow = preload("res://components/UI/FieldShow.tscn").instantiate() + fieldShow.field = newField + fieldShow.value = newValue + fieldShow.showSign = newShowSign + return fieldShow diff --git a/scripts/Statemachine/UIState.gd b/scripts/Statemachine/UIState.gd index 2798cbb..668275e 100644 --- a/scripts/Statemachine/UIState.gd +++ b/scripts/Statemachine/UIState.gd @@ -7,6 +7,8 @@ class_name UIState @onready var items = $"%items" @onready var energyLabel: Label = $"%energy" @onready var energyMaxLabel: Label = $"%energyMax" +@onready var fields: VBoxContainer = $"%fields" +@onready var fieldsAnimator: AnimationPlayer = $"%fieldsAnimator" static var player: EntityBase = null static var bossbar: EntityStateBar @@ -33,6 +35,14 @@ func _physics_process(_delta): WorldManager.rootNode.process_mode = Node.PROCESS_MODE_DISABLED else: WorldManager.rootNode.process_mode = Node.PROCESS_MODE_INHERIT + if Input.is_action_just_pressed("showFields"): + for i in fields.get_children(): + fields.remove_child(i) + for i in player.fields: + fields.add_child(FieldShow.create(i, player.fields[i], false)) + fieldsAnimator.play("show") + if Input.is_action_just_released("showFields"): + fieldsAnimator.play("hide") static func setPanel(targetName: String = ""): currentPanel = null diff --git a/scripts/Tools/MathTool.gd b/scripts/Tools/MathTool.gd index 5209f64..faa0e53 100644 --- a/scripts/Tools/MathTool.gd +++ b/scripts/Tools/MathTool.gd @@ -10,4 +10,4 @@ static func randv2_range(offset: float): static func randc_from(array: Array): return array[randi() % array.size()] static func signBeforeStr(value: float): - return ("+" if value > 0 else "-" if value < 0 else "") + str(abs(value)) \ No newline at end of file + return ("+" if value > 0 else "-" if value < 0 else "") + str(abs(value)) diff --git a/styleboxes/leftPanel.tres b/styleboxes/leftPanel.tres new file mode 100644 index 0000000..06589c0 --- /dev/null +++ b/styleboxes/leftPanel.tres @@ -0,0 +1,15 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://ddnjus87wwlm8"] + +[resource] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0, 0, 0, 0.5) +border_width_left = 3 +border_width_top = 3 +border_width_right = 3 +border_width_bottom = 3 +border_color = Color(0, 0, 0, 0.75) +corner_radius_top_right = 10 +corner_radius_bottom_right = 10