1
1
mirror of https://github.com/Rundll86/Dog-Lynx-And-HCN.git synced 2026-05-28 06:51:54 +08:00

feat(UI): 优化技能图标视觉效果并调整UI布局

- 为技能图标添加粒子效果,在冷却完成时显示
- 调整冷却进度条的着色器参数,改进视觉效果
- 修改默认游戏难度为MASTER
- 重构UI布局,将技能图标整合到能量条容器中
- 调整实体升级公式,使用平方根计算难度加成
This commit is contained in:
2025-09-10 22:08:57 +08:00
parent 234a632f39
commit 6d96c158bb
6 changed files with 74 additions and 35 deletions
+36 -3
View File
@@ -1,16 +1,18 @@
[gd_scene load_steps=6 format=3 uid="uid://ufl4kek8hrmt"] [gd_scene load_steps=12 format=3 uid="uid://ufl4kek8hrmt"]
[ext_resource type="Shader" path="res://shaders/CooldownProgress.gdshader" id="1_jaivk"] [ext_resource type="Shader" path="res://shaders/CooldownProgress.gdshader" id="1_jaivk"]
[ext_resource type="Script" path="res://scripts/Statemachine/SkillIcon.gd" id="1_l7say"] [ext_resource type="Script" path="res://scripts/Statemachine/SkillIcon.gd" id="1_l7say"]
[ext_resource type="Texture2D" uid="uid://cp4ypuarjoshp" path="res://resources/skillIcons/purple-crystal.png" id="2_hh1bl"] [ext_resource type="Texture2D" uid="uid://cp4ypuarjoshp" path="res://resources/skillIcons/purple-crystal.png" id="2_hh1bl"]
[ext_resource type="Texture2D" uid="uid://chqmaeivt84b5" path="res://components/UI/attackstar.svg" id="4_50rim"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_3fyf3"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_3fyf3"]
shader = ExtResource("1_jaivk") shader = ExtResource("1_jaivk")
shader_parameter/progress = 0.55 shader_parameter/progress = 0.55
shader_parameter/backAlpha = 0.25 shader_parameter/backAlpha = 0.1
shader_parameter/edgeHeight = 0.05 shader_parameter/edgeHeight = 0.05
shader_parameter/edgeColor = Color(1, 1, 1, 1)
shader_parameter/trailHeight = 0.3 shader_parameter/trailHeight = 0.3
shader_parameter/trailAlpha = 0.5 shader_parameter/trailColor = Color(1, 1, 1, 0.5)
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_a60wd"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_a60wd"]
content_margin_left = 5.0 content_margin_left = 5.0
@@ -23,7 +25,29 @@ corner_radius_top_right = 20
corner_radius_bottom_right = 20 corner_radius_bottom_right = 20
corner_radius_bottom_left = 20 corner_radius_bottom_left = 20
[sub_resource type="Curve" id="Curve_rgp6n"]
_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.504673, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
point_count = 3
[sub_resource type="CurveTexture" id="CurveTexture_qk3pj"]
curve = SubResource("Curve_rgp6n")
[sub_resource type="Curve" id="Curve_h7g2c"]
max_value = 2.0
_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(1, 2), 0.0, 0.0, 0, 0]
point_count = 2
[sub_resource type="CurveTexture" id="CurveTexture_05v0d"]
curve = SubResource("Curve_h7g2c")
[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_7cgpa"]
particle_flag_disable_z = true
gravity = Vector3(0, 0, 0)
scale_curve = SubResource("CurveTexture_05v0d")
alpha_curve = SubResource("CurveTexture_qk3pj")
[node name="SkillIconBase" type="PanelContainer"] [node name="SkillIconBase" type="PanelContainer"]
texture_filter = 2
material = SubResource("ShaderMaterial_3fyf3") material = SubResource("ShaderMaterial_3fyf3")
custom_minimum_size = Vector2(40, 40) custom_minimum_size = Vector2(40, 40)
offset_right = 30.0 offset_right = 30.0
@@ -38,3 +62,12 @@ layout_mode = 2
texture = ExtResource("2_hh1bl") texture = ExtResource("2_hh1bl")
expand_mode = 1 expand_mode = 1
stretch_mode = 5 stretch_mode = 5
[node name="particle" type="GPUParticles2D" parent="."]
unique_name_in_owner = true
position = Vector2(20, 20)
emitting = false
amount = 1
process_material = SubResource("ParticleProcessMaterial_7cgpa")
texture = ExtResource("4_50rim")
one_shot = true
+19 -23
View File
@@ -14,6 +14,8 @@
[ext_resource type="PackedScene" uid="uid://dekcqdhrjs07u" path="res://components/Scenes/FullscreenPanels/Weapon.tscn" id="13_bmc24"] [ext_resource type="PackedScene" uid="uid://dekcqdhrjs07u" path="res://components/Scenes/FullscreenPanels/Weapon.tscn" id="13_bmc24"]
[ext_resource type="PackedScene" uid="uid://w2o3klbsssq3" path="res://components/Scenes/FullscreenPanels/Thanks.tscn" id="14_gp8lx"] [ext_resource type="PackedScene" uid="uid://w2o3klbsssq3" path="res://components/Scenes/FullscreenPanels/Thanks.tscn" id="14_gp8lx"]
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_12otr"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kp2r0"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kp2r0"]
bg_color = Color(0, 0, 0, 0.5) bg_color = Color(0, 0, 0, 0.5)
@@ -118,8 +120,6 @@ _data = {
"show": SubResource("Animation_2xajo") "show": SubResource("Animation_2xajo")
} }
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_12otr"]
[node name="UI" type="CanvasLayer"] [node name="UI" type="CanvasLayer"]
process_mode = 3 process_mode = 3
script = ExtResource("1_f00a6") script = ExtResource("1_f00a6")
@@ -193,16 +193,29 @@ grow_horizontal = 0
grow_vertical = 2 grow_vertical = 2
theme_override_styles/panel = ExtResource("5_3hym1") theme_override_styles/panel = ExtResource("5_3hym1")
[node name="container" type="VBoxContainer" parent="root/energy"] [node name="wrapper" type="HBoxContainer" parent="root/energy"]
layout_mode = 2
theme_override_constants/separation = 10
[node name="skills" type="PanelContainer" parent="root/energy/wrapper"]
layout_mode = 2
theme_override_styles/panel = SubResource("StyleBoxEmpty_12otr")
[node name="skillContainer" type="VBoxContainer" parent="root/energy/wrapper/skills"]
unique_name_in_owner = true
layout_mode = 2
alignment = 1
[node name="container" type="VBoxContainer" parent="root/energy/wrapper"]
layout_mode = 2 layout_mode = 2
theme_override_constants/separation = 10 theme_override_constants/separation = 10
alignment = 1 alignment = 1
[node name="energy" type="HBoxContainer" parent="root/energy/container"] [node name="energy" type="HBoxContainer" parent="root/energy/wrapper/container"]
layout_mode = 2 layout_mode = 2
alignment = 1 alignment = 1
[node name="icon" type="TextureRect" parent="root/energy/container/energy"] [node name="icon" type="TextureRect" parent="root/energy/wrapper/container/energy"]
custom_minimum_size = Vector2(16, 16) custom_minimum_size = Vector2(16, 16)
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 4 size_flags_horizontal = 4
@@ -210,7 +223,7 @@ size_flags_vertical = 4
texture = ExtResource("7_2om12") texture = ExtResource("7_2om12")
expand_mode = 1 expand_mode = 1
[node name="percent" parent="root/energy/container" instance=ExtResource("8_f4j2b")] [node name="percent" parent="root/energy/wrapper/container" instance=ExtResource("8_f4j2b")]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_vertical = 3 size_flags_vertical = 3
@@ -249,23 +262,6 @@ libraries = {
"": SubResource("AnimationLibrary_37e4s") "": SubResource("AnimationLibrary_37e4s")
} }
[node name="skills" type="PanelContainer" parent="root"]
layout_mode = 1
anchors_preset = -1
anchor_left = 0.97
anchor_top = 0.5
anchor_right = 0.97
anchor_bottom = 0.5
offset_left = 0.399902
offset_right = 0.399902
grow_horizontal = 0
grow_vertical = 2
theme_override_styles/panel = SubResource("StyleBoxEmpty_12otr")
[node name="skillContainer" type="VBoxContainer" parent="root/skills"]
unique_name_in_owner = true
layout_mode = 2
[node name="itemCollect" type="VBoxContainer" parent="root"] [node name="itemCollect" type="VBoxContainer" parent="root"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 1 layout_mode = 1
+3 -3
View File
@@ -161,8 +161,8 @@ func _physics_process(_delta: float) -> void:
# 通用方法 # 通用方法
func applyLevel(): func applyLevel():
fields[FieldStore.Entity.MAX_HEALTH] *= (1 + GameRule.entityHealthIncreasePerWave * (GameRule.difficulty + 1)) ** level fields[FieldStore.Entity.MAX_HEALTH] *= (1 + GameRule.entityHealthIncreasePerWave * sqrt(GameRule.difficulty + 1)) ** level
fields[FieldStore.Entity.DAMAGE_MULTIPILER] *= (1 + GameRule.entityDamageIncreasePerWave * (GameRule.difficulty + 1)) ** level fields[FieldStore.Entity.DAMAGE_MULTIPILER] *= (1 + GameRule.entityDamageIncreasePerWave * sqrt(GameRule.difficulty + 1)) ** level
func displace(direction: Vector2, isSprinting: bool = false): 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")) 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): func move(direction: Vector2, isSprinting: bool = false):
@@ -255,7 +255,7 @@ func tryDie(by: BulletBase):
var item = drops[drop] var item = drops[drop]
var count = ceil(randf_range(dropCounts[drop].x, dropCounts[drop].y)) var count = ceil(randf_range(dropCounts[drop].x, dropCounts[drop].y))
for i in range(count): for i in range(count):
ItemDropped.generate(item, count, position + MathTool.randv2_range(GameRule.itemDroppedSpawnOffset)) ItemDropped.generate(item, 1, position + MathTool.randv2_range(GameRule.itemDroppedSpawnOffset))
if MathTool.rate( if MathTool.rate(
GameRule.appleDropRate + GameRule.appleDropRate +
by.launcher.fields.get(FieldStore.Entity.DROP_APPLE_RATE) + by.launcher.fields.get(FieldStore.Entity.DROP_APPLE_RATE) +
+10
View File
@@ -4,6 +4,10 @@ class_name SkillIcon
@export var weapon: Weapon = null; @export var weapon: Weapon = null;
@onready var textureRect: TextureRect = $"%texture" @onready var textureRect: TextureRect = $"%texture"
@onready var particle: GPUParticles2D = $"%particle"
var showed: bool = false
func _ready(): func _ready():
material = material.duplicate() material = material.duplicate()
func _physics_process(_delta): func _physics_process(_delta):
@@ -11,3 +15,9 @@ func _physics_process(_delta):
textureRect.texture = weapon.avatarTexture textureRect.texture = weapon.avatarTexture
var progress = min(weapon.cooldownTimer.timeSinceLastStart() / weapon.cooldownTimer.cooldown, UIState.player.energy / weapon.needEnergy) var progress = min(weapon.cooldownTimer.timeSinceLastStart() / weapon.cooldownTimer.cooldown, UIState.player.energy / weapon.needEnergy)
material.set_shader_parameter("progress", progress) material.set_shader_parameter("progress", progress)
if progress >= 1:
if !showed:
showed = true
particle.emitting = true
else:
showed = false
+1 -1
View File
@@ -9,7 +9,7 @@ enum Difficulty {
MASTER, MASTER,
} }
static var deadReasons: Array = JsonTool.parseJson("res://resources/constants/deadReasons.json") static var deadReasons: Array = JsonTool.parseJson("res://resources/constants/deadReasons.json")
static var difficulty: Difficulty = Difficulty.NORMAL # 难度倍数,可以写小数 static var difficulty: Difficulty = Difficulty.MASTER # 难度倍数,可以写小数
static var allowFriendlyFire: bool = false # 是否允许友军伤害 static var allowFriendlyFire: bool = false # 是否允许友军伤害
static var bulletSpeedMultiplier: float = 1 # 子弹速度倍率 static var bulletSpeedMultiplier: float = 1 # 子弹速度倍率
static var damageOffset: float = MathTool.percent(20) # 伤害随机浮动比例 static var damageOffset: float = MathTool.percent(20) # 伤害随机浮动比例
+5 -5
View File
@@ -1,19 +1,19 @@
shader_type canvas_item; shader_type canvas_item;
uniform float progress:hint_range(-0.0, 2.0, 0.01)=0.5; uniform float progress:hint_range(-0.0, 2.0, 0.01)=0.5;
uniform float backAlpha:hint_range(0.0, 1.0, 0.01)=0.25; uniform float backAlpha:hint_range(0.0, 1.0, 0.01)=0.1;
uniform float edgeHeight:hint_range(0.0, 1.0, 0.01)=0.05; uniform float edgeHeight:hint_range(0.0, 1.0, 0.01)=0.05;
uniform vec4 edgeColor:source_color;
uniform float trailHeight:hint_range(0.0, 1.0, 0.01)=0.3; uniform float trailHeight:hint_range(0.0, 1.0, 0.01)=0.3;
uniform float trailAlpha:hint_range(0.0, 1.0, 0.01)=0.5; uniform vec4 trailColor:source_color;
void fragment() { void fragment() {
if(UV.y>=1.0-progress){ if(UV.y>=1.0-progress){
if(1.0-progress+trailHeight-UV.y>0.0){ if(1.0-progress+trailHeight-UV.y>0.0){
float dist=distance(UV.y,1.0-progress); float dist=distance(UV.y,1.0-progress);
COLOR=vec4(1); COLOR=mix(COLOR,trailColor*vec4(1,1,1,(trailHeight-dist)/trailHeight),1);
COLOR.a=(trailHeight-dist)/trailHeight*trailAlpha;
}else{ }else{
COLOR.a*=backAlpha; COLOR.a*=backAlpha;
} }
}else if(distance(UV.y,1.0-progress)<edgeHeight){ }else if(distance(UV.y,1.0-progress)<edgeHeight){
COLOR=vec4(1.0); COLOR=edgeColor;
} }
} }