mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-05-28 06:51:54 +08:00
feat(UI): 添加显示实体属性的面板和动画效果
添加新的输入动作"showFields"用于显示/隐藏实体属性面板 创建新的FieldShow组件用于显示实体属性值 为属性面板添加显示/隐藏动画效果 调整EntityBase中属性初始化的顺序
This commit is contained in:
+149
-24
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
return ("+" if value > 0 else "-" if value < 0 else "") + str(abs(value))
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user