From 2d21dba41519b1bfb0b56d9babfcb0d02503992b Mon Sep 17 00:00:00 2001 From: chendian <-> Date: Wed, 25 Oct 2023 02:47:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=A4=E5=AE=B3=E8=B7=B3=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/attack/heavy_hit_blow.tres | 13 +- config/attack/mid_hit.tres | 17 ++ config/attack/normal_hit.tres | 3 +- config/character_shield/none.tres | 11 ++ scene/character/character.tscn | 7 +- scene/ui/item/hit_text.tscn | 250 ++++++++++++++++++++++++++++++ script/_global/util.gd | 1 - script/character/battle.gd | 6 + script/character/character.gd | 4 + script/character/move.gd | 1 + script/character/status.gd | 1 + script/character/view.gd | 24 ++- script/config/attack_cfg.gd | 2 +- script/config/shield_cfg.gd | 3 +- script/manager/signal_manager.gd | 3 + script/ui/headbar/headbar.gd | 24 ++- script/ui/headbar/headbar_page.gd | 22 ++- script/ui/headbar/hit_text.gd | 33 ++++ 18 files changed, 398 insertions(+), 27 deletions(-) create mode 100644 config/attack/mid_hit.tres create mode 100644 config/character_shield/none.tres create mode 100644 scene/ui/item/hit_text.tscn create mode 100644 script/ui/headbar/hit_text.gd diff --git a/config/attack/heavy_hit_blow.tres b/config/attack/heavy_hit_blow.tres index 2bfcab9..c5a0624 100644 --- a/config/attack/heavy_hit_blow.tres +++ b/config/attack/heavy_hit_blow.tres @@ -5,10 +5,13 @@ [resource] script = ExtResource("1_j177j") damage_rate = 1.0 -break_level = 0 -hit_back_speed = 4.0 +break_level = 3 +stun_attack = 10.0 +hit_back_speed = 2.0 hit_back_duration = 0.05 -hit_up_speed = 4.0 +hit_up_speed = 2.0 hit_up_duration = 0.05 -pause_time = 0.1 -is_floating = true +pause_time = 0.05 +is_floating = false +is_hit_down = false +is_rebound = false diff --git a/config/attack/mid_hit.tres b/config/attack/mid_hit.tres new file mode 100644 index 0000000..02a7d78 --- /dev/null +++ b/config/attack/mid_hit.tres @@ -0,0 +1,17 @@ +[gd_resource type="Resource" script_class="AttackCfg" load_steps=2 format=3 uid="uid://cae3dxpuqfcux"] + +[ext_resource type="Script" path="res://script/config/attack_cfg.gd" id="1_lveis"] + +[resource] +script = ExtResource("1_lveis") +damage_rate = 1.0 +break_level = 2 +stun_attack = 10.0 +hit_back_speed = 3.0 +hit_back_duration = 0.05 +hit_up_speed = 1.0 +hit_up_duration = 0.05 +pause_time = 0.1 +is_floating = false +is_hit_down = false +is_rebound = false diff --git a/config/attack/normal_hit.tres b/config/attack/normal_hit.tres index 93b6f13..8892bb4 100644 --- a/config/attack/normal_hit.tres +++ b/config/attack/normal_hit.tres @@ -6,10 +6,11 @@ script = ExtResource("1_wn06b") damage_rate = 1.0 break_level = 0 +stun_attack = 10.0 hit_back_speed = 2.0 hit_back_duration = 0.05 hit_up_speed = 1.0 -hit_up_duration = 0.1 +hit_up_duration = 0.05 pause_time = 0.0 is_floating = false is_hit_down = false diff --git a/config/character_shield/none.tres b/config/character_shield/none.tres new file mode 100644 index 0000000..a410ead --- /dev/null +++ b/config/character_shield/none.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="ShieldCfg" load_steps=2 format=3 uid="uid://h1curvk64vm3"] + +[ext_resource type="Script" path="res://script/config/shield_cfg.gd" id="1_vkw85"] + +[resource] +script = ExtResource("1_vkw85") +shield_max = 0.0 +recover_speed = 0.0 +recover_cd = 0.0 +break_level_on = 0 +break_level_off = 0 diff --git a/scene/character/character.tscn b/scene/character/character.tscn index 87f613b..881b707 100644 --- a/scene/character/character.tscn +++ b/scene/character/character.tscn @@ -34,8 +34,8 @@ shape = SubResource("BoxShape3D_ty8lx") [node name="Status" type="Node3D" parent="."] unique_name_in_owner = true script = ExtResource("2_txdip") -speed_up_rate = -0.5 -skill_float_speed = 0.1 +speed_up_rate = -1.0 +break_level = 4 [node name="View" type="AnimatedSprite3D" parent="."] unique_name_in_owner = true @@ -48,7 +48,8 @@ double_sided = false alpha_cut = 2 texture_filter = 0 sprite_frames = ExtResource("5_m25rr") -animation = &"long_air_attack02" +animation = &"long_air_attack01" +frame = 8 script = ExtResource("4_vijjv") [node name="Move" type="Node3D" parent="."] diff --git a/scene/ui/item/hit_text.tscn b/scene/ui/item/hit_text.tscn new file mode 100644 index 0000000..a004d10 --- /dev/null +++ b/scene/ui/item/hit_text.tscn @@ -0,0 +1,250 @@ +[gd_scene load_steps=10 format=3 uid="uid://cxyly5ithpv5i"] + +[ext_resource type="Script" path="res://script/ui/headbar/hit_text.gd" id="1_re03i"] + +[sub_resource type="Animation" id="Animation_b5roo"] +length = 0.001 + +[sub_resource type="Animation" id="Animation_c3cdy"] +resource_name = "stage1" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Label:scale") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(0.5, 0.5), Vector2(1.5, 1.5), Vector2(1, 1)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Label:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(1, 1, 1, 0.254902), Color(1, 1, 1, 1)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Label:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} + +[sub_resource type="Animation" id="Animation_varcj"] +resource_name = "stage2_2" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Label:position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(0.554784, 1, 1), +"update": 0, +"values": [Vector2(0, 0), Vector2(-20, -50), Vector2(-40, -10)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Label:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.2, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_08vmk"] +resource_name = "stage2" +length = 0.6 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Label:position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(0.554784, 1, 1), +"update": 0, +"values": [Vector2(0, 0), Vector2(20, -50), Vector2(40, -10)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Label:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.2, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_g6jg6"] +resource_name = "stage2_3" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Label:position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(0.554784, 1, 1), +"update": 0, +"values": [Vector2(0, 0), Vector2(-20, -40), Vector2(-40, -10)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Label:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.2, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_ygxcf"] +resource_name = "stage2_4" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Label:position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(0.554784, 1, 1), +"update": 0, +"values": [Vector2(0, 0), Vector2(20, -40), Vector2(40, -10)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Label:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.2, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} + +[sub_resource type="Animation" id="Animation_eut3s"] +resource_name = "stage3" +length = 0.6 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Label:scale") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(0.5, 0.5), Vector2(1.5, 1.5), Vector2(1, 1)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Label:modulate") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Color(1, 1, 1, 0.254902), Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Label:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(0, -20), Vector2(0, -20), Vector2(0, -50)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_wrgpl"] +_data = { +"RESET": SubResource("Animation_b5roo"), +"stage1": SubResource("Animation_c3cdy"), +"stage2_1": SubResource("Animation_08vmk"), +"stage2_2": SubResource("Animation_varcj"), +"stage2_3": SubResource("Animation_g6jg6"), +"stage2_4": SubResource("Animation_ygxcf"), +"stage3": SubResource("Animation_eut3s") +} + +[node name="HitText" type="Control"] +layout_mode = 3 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -30.0 +offset_top = -15.0 +offset_right = 30.0 +offset_bottom = 15.0 +grow_horizontal = 2 +grow_vertical = 2 +pivot_offset = Vector2(20, 20) +script = ExtResource("1_re03i") + +[node name="Label" type="Label" parent="."] +unique_name_in_owner = true +modulate = Color(1, 1, 1, 0.254902) +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -30.0 +offset_top = -35.0 +offset_right = 29.9996 +offset_bottom = -4.99996 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(0.5, 0.5) +pivot_offset = Vector2(30, 15) +text = "123" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +unique_name_in_owner = true +libraries = { +"": SubResource("AnimationLibrary_wrgpl") +} + +[connection signal="animation_finished" from="AnimationPlayer" to="." method="_on_animation_player_animation_finished"] diff --git a/script/_global/util.gd b/script/_global/util.gd index 49db84a..4bea98b 100644 --- a/script/_global/util.gd +++ b/script/_global/util.gd @@ -1,7 +1,6 @@ @tool extends Node3D - func get_resource_name(resource:Resource) -> String: return resource.resource_path.get_file().trim_suffix('.tres') #todo 性能 diff --git a/script/character/battle.gd b/script/character/battle.gd index 606b701..9400050 100644 --- a/script/character/battle.gd +++ b/script/character/battle.gd @@ -144,3 +144,9 @@ func settle(hit_info:HitInfo): #卡帧 character_from.add_buff("pause",attack.pause_time) character_to.add_buff("pause",attack.pause_time) + + #伤害跳字 + character_to.show_hit_damage(damage) + #状态跳字 + character_to.show_hit_text("Break") + diff --git a/script/character/character.gd b/script/character/character.gd index 4ca5396..05e2a3a 100644 --- a/script/character/character.gd +++ b/script/character/character.gd @@ -17,6 +17,7 @@ func init(id:int,cfg:CharacterCfg,team:Enum.ETeam): collision.position = Vector3(0,half_height,0) collision.scale = Vector3(width,half_height*2,width) status.basic_offset = Vector3(0,half_height,0) + status.ui_offset = Vector3(0,half_height*2.2,0) view.scale = Vector3(1,Setting.sprite_scale,1) view.init(cfg.sprite_frames) skill.init() @@ -40,6 +41,7 @@ func team()->Enum.ETeam:return status.team func pos2D()->Vector2:return Vector2(position.x,position.z) func pos()->Vector3:return position func view_pos()->Vector3:return position + view.position +func ui_pos()->Vector3:return position + status.ui_offset #==interface== func get_status(status_name:String):return status.get_status(status_name) @@ -52,3 +54,5 @@ func set_hit_move(hit_back_dir:Vector2,hit_back_speed:float,hit_up_speed:float): func cancel_skill():skill.cancel_skill() func set_view_trigger(trigger_name:String):status.set("trigger_%s"%trigger_name,true) func add_attack(from:int,dir:Vector2,attack:AttackCfg):battle.add_attack(from,dir,attack) +func show_hit_text(value:String):SignalManager.character_hit_text.emit(id(),value) +func show_hit_damage(value:float):SignalManager.character_hit_damage.emit(id(),value) diff --git a/script/character/move.gd b/script/character/move.gd index dad4f27..9ddbbe1 100644 --- a/script/character/move.gd +++ b/script/character/move.gd @@ -15,6 +15,7 @@ func _physics_process(delta): character.move_and_slide() if character.velocity: SignalManager.character_pos_changed.emit(character.id(),character.pos()) + SignalManager.character_ui_pos_changed.emit(character.id(),character.ui_pos()) func update_on_floor(delta): status.is_on_floor = character.is_on_floor() diff --git a/script/character/status.gd b/script/character/status.gd index d8c01d1..5475079 100644 --- a/script/character/status.gd +++ b/script/character/status.gd @@ -20,6 +20,7 @@ class_name Status @export_category("表现状态") @export var basic_offset : Vector3 #基本偏移值 @export var shake_offset : Vector3 #抖动偏移值 +@export var ui_offset : Vector3 #ui挂点偏移值 @export var is_pause : bool #是否暂停 @export var flash_white_rate : float #闪白比例 @export var deformation_dir : Vector2 #形变方向 diff --git a/script/character/view.gd b/script/character/view.gd index 1b97f89..d1e9311 100644 --- a/script/character/view.gd +++ b/script/character/view.gd @@ -27,7 +27,7 @@ func _ready(): # 跳跃 trigger("any","jump1","trigger_jump") run("jump1","jump2_loop") - trans("jump2_loop","jump3","speed_y","<",0) + trans("jump2_loop","jump3","speed_y","<=",0) run("jump3","jump4_loop") trans("jump4_loop","jump5","is_on_floor","=",true) run("jump5","idle_loop") @@ -51,7 +51,7 @@ func _ready(): trigger("any","airhit1","trigger_air_hit_up") trigger("any","airhit4_loop","trigger_air_hit_down") run("airhit1","airhit2_loop") - trans("airhit2_loop","airhit3","speed_y","<",0) + trans("airhit2_loop","airhit3","speed_y","<=",0) run("airhit3","airhit4_loop") trans("airhit4_loop","airhit5","is_on_floor","=",true) run("airhit5","ground1_loop") @@ -76,8 +76,8 @@ func _ready(): func _process(delta): update_view() if not status.is_skill_running and status.is_pause == is_playing(): - if status.is_pause:pause(); - else:play(); + if status.is_pause:pause() + else:play() if status.is_pause:return update_flip() update_trans(false) @@ -86,11 +86,11 @@ func _process(delta): func init(default:SpriteFrames): sprite_frames = default move_sprite_frames = default - play("idle_loop") + play_animation("idle_loop") func reset(): sprite_frames = move_sprite_frames - play("idle_loop") + play_animation("idle_loop") func run(from:StringName,to:StringName): _add_trans(from,to,"","","","",true) @@ -129,12 +129,14 @@ func update_trans(on_end:bool): match trans.compareType: ">":if conditionValue <= trans.conditionValue:continue "<":if conditionValue >= trans.conditionValue:continue + ">=":if conditionValue < trans.conditionValue:continue + "<=":if conditionValue > trans.conditionValue:continue "=":if conditionValue != trans.conditionValue:continue if trans.trigger_name != "": if status.get(trans.trigger_name): status.set(trans.trigger_name,false) else:continue - play(trans.to) + play_animation(trans.to) func update_flip(): scale.x = 1 if status.is_right else -1 @@ -159,3 +161,11 @@ func clone(target:AnimatedSprite3D): target.frame = frame target.frame_progress = frame_progress target.scale = scale + +func play_animation(animation_name:String): + if animation_name == animation: + frame = 0 + frame_progress = 0 + else: + play(animation_name) + diff --git a/script/config/attack_cfg.gd b/script/config/attack_cfg.gd index b74c825..9332c3b 100644 --- a/script/config/attack_cfg.gd +++ b/script/config/attack_cfg.gd @@ -6,7 +6,7 @@ class_name AttackCfg #数值信息 @export var damage_rate : float = 1 #伤害系数 -@export var break_level : int #硬直等级 +@export var break_level : int = 1 #硬直等级 @export var stun_attack : float = 10 #眩晕值伤害 @export var hit_back_speed : float #击退速度 @export var hit_back_duration : float #击退持续时间 diff --git a/script/config/shield_cfg.gd b/script/config/shield_cfg.gd index 211e675..8f28ce3 100644 --- a/script/config/shield_cfg.gd +++ b/script/config/shield_cfg.gd @@ -5,4 +5,5 @@ class_name ShieldCfg @export var shield_max : float = 100 #护盾最大值 @export var recover_speed : float = 10 #护盾恢复速度 @export var recover_cd : float = 5 #护盾恢复延迟 - +@export var break_level_on : int #有护盾时硬直等级 +@export var break_level_off : int #无护盾时硬直等级 diff --git a/script/manager/signal_manager.gd b/script/manager/signal_manager.gd index 0a33fd2..668c97b 100644 --- a/script/manager/signal_manager.gd +++ b/script/manager/signal_manager.gd @@ -12,4 +12,7 @@ signal effect_create signal character_create signal character_destroy signal character_pos_changed +signal character_ui_pos_changed signal character_status_changed +signal character_hit_text +signal character_hit_damage diff --git a/script/ui/headbar/headbar.gd b/script/ui/headbar/headbar.gd index 1f2f27c..4c613ad 100644 --- a/script/ui/headbar/headbar.gd +++ b/script/ui/headbar/headbar.gd @@ -1,15 +1,13 @@ extends Control class_name Headbar +@onready var hit_text_scene = preload("res://scene/ui/item/hit_text.tscn") + @onready var hpbar = (%HpBar as TextureProgressBar) @onready var shieldbar = (%ShieldBar as TextureProgressBar) @onready var stunbar = (%StunBar as TextureProgressBar) -func _ready(): - pass - -func _process(delta): - pass +var hit_text_damage_cache : HitText func on_hp_changed(value):hpbar.value = value func on_hp_max_changed(value):hpbar.max_value = value @@ -17,3 +15,19 @@ func on_shield_changed(value):shieldbar.value = value func on_shield_max_changed(value):shieldbar.max_value = value func on_stun_changed(value):stunbar.value = value func on_stun_max_changed(value):stunbar.max_value = value + +func on_hit_text(value:String): + var hit_text = get_hit_text_object() + hit_text.show_hit_text(value) + +func on_hit_danage(value:float): + var hit_text = hit_text_damage_cache + if not hit_text or hit_text.is_close: + hit_text_damage_cache = get_hit_text_object() + hit_text = hit_text_damage_cache + hit_text.show_hit_damage(value) + +func get_hit_text_object()->HitText: + var hit_text = hit_text_scene.instantiate() as HitText + add_child(hit_text) + return hit_text diff --git a/script/ui/headbar/headbar_page.gd b/script/ui/headbar/headbar_page.gd index da02615..df1fa1a 100644 --- a/script/ui/headbar/headbar_page.gd +++ b/script/ui/headbar/headbar_page.gd @@ -11,9 +11,12 @@ var headbar_map = {} func _ready(): SignalManager.character_create.connect(on_character_create) - SignalManager.character_pos_changed.connect(on_character_pos_changed) + SignalManager.character_ui_pos_changed.connect(on_character_ui_pos_changed) SignalManager.character_destroy.connect(on_character_destroy) SignalManager.character_status_changed.connect(on_character_status_changed) + SignalManager.character_hit_text.connect(on_character_hit_text) + SignalManager.character_hit_damage.connect(on_character_hit_damage) + func _process(delta): var camera_pos = camera.position @@ -29,10 +32,10 @@ func on_character_create(id:int,team:Enum.ETeam,pos:Vector3): var new_headbar = headbar_scene.instantiate() add_child(new_headbar) new_headbar_meta.headbar = new_headbar - on_character_pos_changed(id,pos) + on_character_ui_pos_changed(id,pos) headbar_map[id] = new_headbar_meta -func on_character_pos_changed(id:int,pos:Vector3): +func on_character_ui_pos_changed(id:int,pos:Vector3): if not id in headbar_map: return var headbar_meta = headbar_map[id] @@ -57,3 +60,16 @@ func on_character_status_changed(id:int,status_name:String,value): if headbar.has_method(func_name): headbar.call(func_name,value) +func on_character_hit_text(id:int,value:String): + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar = headbar_meta.headbar as Headbar + headbar.on_hit_text(value) + +func on_character_hit_damage(id:int,value:float): + if not id in headbar_map: + return + var headbar_meta = headbar_map[id] + var headbar = headbar_meta.headbar as Headbar + headbar.on_hit_danage(value) diff --git a/script/ui/headbar/hit_text.gd b/script/ui/headbar/hit_text.gd new file mode 100644 index 0000000..e64d962 --- /dev/null +++ b/script/ui/headbar/hit_text.gd @@ -0,0 +1,33 @@ +extends Control +class_name HitText + +@onready var animation = %AnimationPlayer as AnimationPlayer +@onready var label = %Label as Label + +var damage_cache : float +var is_close : bool + +func show_hit_damage(damage:float): + if is_close: + print("正在使用已关闭的hit_text") + damage_cache += damage + label.text = "%d" % damage_cache + animation.seek(0) + animation.play("stage1") + +func show_hit_text(text_set:String): + if is_close: + print("正在使用已关闭的hit_text") + is_close = true + label.text = text_set + animation.play("stage3") + +func _on_animation_player_animation_finished(anim_name): + match anim_name: + "stage1": + is_close = true + animation.play("stage2_%d"%randi_range(1,4)) + "stage2_1","stage2_2","stage2_3","stage2_4": + queue_free() + "stage3": + queue_free()