伤害跳字

master
chendian 2 years ago
parent 7ce41603a9
commit 2d21dba415

@ -5,10 +5,13 @@
[resource] [resource]
script = ExtResource("1_j177j") script = ExtResource("1_j177j")
damage_rate = 1.0 damage_rate = 1.0
break_level = 0 break_level = 3
hit_back_speed = 4.0 stun_attack = 10.0
hit_back_speed = 2.0
hit_back_duration = 0.05 hit_back_duration = 0.05
hit_up_speed = 4.0 hit_up_speed = 2.0
hit_up_duration = 0.05 hit_up_duration = 0.05
pause_time = 0.1 pause_time = 0.05
is_floating = true is_floating = false
is_hit_down = false
is_rebound = false

@ -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

@ -6,10 +6,11 @@
script = ExtResource("1_wn06b") script = ExtResource("1_wn06b")
damage_rate = 1.0 damage_rate = 1.0
break_level = 0 break_level = 0
stun_attack = 10.0
hit_back_speed = 2.0 hit_back_speed = 2.0
hit_back_duration = 0.05 hit_back_duration = 0.05
hit_up_speed = 1.0 hit_up_speed = 1.0
hit_up_duration = 0.1 hit_up_duration = 0.05
pause_time = 0.0 pause_time = 0.0
is_floating = false is_floating = false
is_hit_down = false is_hit_down = false

@ -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

@ -34,8 +34,8 @@ shape = SubResource("BoxShape3D_ty8lx")
[node name="Status" type="Node3D" parent="."] [node name="Status" type="Node3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
script = ExtResource("2_txdip") script = ExtResource("2_txdip")
speed_up_rate = -0.5 speed_up_rate = -1.0
skill_float_speed = 0.1 break_level = 4
[node name="View" type="AnimatedSprite3D" parent="."] [node name="View" type="AnimatedSprite3D" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
@ -48,7 +48,8 @@ double_sided = false
alpha_cut = 2 alpha_cut = 2
texture_filter = 0 texture_filter = 0
sprite_frames = ExtResource("5_m25rr") sprite_frames = ExtResource("5_m25rr")
animation = &"long_air_attack02" animation = &"long_air_attack01"
frame = 8
script = ExtResource("4_vijjv") script = ExtResource("4_vijjv")
[node name="Move" type="Node3D" parent="."] [node name="Move" type="Node3D" parent="."]

@ -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"]

@ -1,7 +1,6 @@
@tool @tool
extends Node3D extends Node3D
func get_resource_name(resource:Resource) -> String: func get_resource_name(resource:Resource) -> String:
return resource.resource_path.get_file().trim_suffix('.tres') #todo 性能 return resource.resource_path.get_file().trim_suffix('.tres') #todo 性能

@ -144,3 +144,9 @@ func settle(hit_info:HitInfo):
#卡帧 #卡帧
character_from.add_buff("pause",attack.pause_time) character_from.add_buff("pause",attack.pause_time)
character_to.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")

@ -17,6 +17,7 @@ func init(id:int,cfg:CharacterCfg,team:Enum.ETeam):
collision.position = Vector3(0,half_height,0) collision.position = Vector3(0,half_height,0)
collision.scale = Vector3(width,half_height*2,width) collision.scale = Vector3(width,half_height*2,width)
status.basic_offset = Vector3(0,half_height,0) 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.scale = Vector3(1,Setting.sprite_scale,1)
view.init(cfg.sprite_frames) view.init(cfg.sprite_frames)
skill.init() skill.init()
@ -40,6 +41,7 @@ func team()->Enum.ETeam:return status.team
func pos2D()->Vector2:return Vector2(position.x,position.z) func pos2D()->Vector2:return Vector2(position.x,position.z)
func pos()->Vector3:return position func pos()->Vector3:return position
func view_pos()->Vector3:return position + view.position func view_pos()->Vector3:return position + view.position
func ui_pos()->Vector3:return position + status.ui_offset
#==interface== #==interface==
func get_status(status_name:String):return status.get_status(status_name) 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 cancel_skill():skill.cancel_skill()
func set_view_trigger(trigger_name:String):status.set("trigger_%s"%trigger_name,true) 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 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)

@ -15,6 +15,7 @@ func _physics_process(delta):
character.move_and_slide() character.move_and_slide()
if character.velocity: if character.velocity:
SignalManager.character_pos_changed.emit(character.id(),character.pos()) 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): func update_on_floor(delta):
status.is_on_floor = character.is_on_floor() status.is_on_floor = character.is_on_floor()

@ -20,6 +20,7 @@ class_name Status
@export_category("表现状态") @export_category("表现状态")
@export var basic_offset : Vector3 #基本偏移值 @export var basic_offset : Vector3 #基本偏移值
@export var shake_offset : Vector3 #抖动偏移值 @export var shake_offset : Vector3 #抖动偏移值
@export var ui_offset : Vector3 #ui挂点偏移值
@export var is_pause : bool #是否暂停 @export var is_pause : bool #是否暂停
@export var flash_white_rate : float #闪白比例 @export var flash_white_rate : float #闪白比例
@export var deformation_dir : Vector2 #形变方向 @export var deformation_dir : Vector2 #形变方向

@ -27,7 +27,7 @@ func _ready():
# 跳跃 # 跳跃
trigger("any","jump1","trigger_jump") trigger("any","jump1","trigger_jump")
run("jump1","jump2_loop") run("jump1","jump2_loop")
trans("jump2_loop","jump3","speed_y","<",0) trans("jump2_loop","jump3","speed_y","<=",0)
run("jump3","jump4_loop") run("jump3","jump4_loop")
trans("jump4_loop","jump5","is_on_floor","=",true) trans("jump4_loop","jump5","is_on_floor","=",true)
run("jump5","idle_loop") run("jump5","idle_loop")
@ -51,7 +51,7 @@ func _ready():
trigger("any","airhit1","trigger_air_hit_up") trigger("any","airhit1","trigger_air_hit_up")
trigger("any","airhit4_loop","trigger_air_hit_down") trigger("any","airhit4_loop","trigger_air_hit_down")
run("airhit1","airhit2_loop") run("airhit1","airhit2_loop")
trans("airhit2_loop","airhit3","speed_y","<",0) trans("airhit2_loop","airhit3","speed_y","<=",0)
run("airhit3","airhit4_loop") run("airhit3","airhit4_loop")
trans("airhit4_loop","airhit5","is_on_floor","=",true) trans("airhit4_loop","airhit5","is_on_floor","=",true)
run("airhit5","ground1_loop") run("airhit5","ground1_loop")
@ -76,8 +76,8 @@ func _ready():
func _process(delta): func _process(delta):
update_view() update_view()
if not status.is_skill_running and status.is_pause == is_playing(): if not status.is_skill_running and status.is_pause == is_playing():
if status.is_pause:pause(); if status.is_pause:pause()
else:play(); else:play()
if status.is_pause:return if status.is_pause:return
update_flip() update_flip()
update_trans(false) update_trans(false)
@ -86,11 +86,11 @@ func _process(delta):
func init(default:SpriteFrames): func init(default:SpriteFrames):
sprite_frames = default sprite_frames = default
move_sprite_frames = default move_sprite_frames = default
play("idle_loop") play_animation("idle_loop")
func reset(): func reset():
sprite_frames = move_sprite_frames sprite_frames = move_sprite_frames
play("idle_loop") play_animation("idle_loop")
func run(from:StringName,to:StringName): func run(from:StringName,to:StringName):
_add_trans(from,to,"","","","",true) _add_trans(from,to,"","","","",true)
@ -129,12 +129,14 @@ func update_trans(on_end:bool):
match trans.compareType: 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 conditionValue > trans.conditionValue:continue
"=":if conditionValue != trans.conditionValue:continue "=":if conditionValue != trans.conditionValue:continue
if trans.trigger_name != "": if trans.trigger_name != "":
if status.get(trans.trigger_name): if status.get(trans.trigger_name):
status.set(trans.trigger_name,false) status.set(trans.trigger_name,false)
else:continue else:continue
play(trans.to) play_animation(trans.to)
func update_flip(): func update_flip():
scale.x = 1 if status.is_right else -1 scale.x = 1 if status.is_right else -1
@ -159,3 +161,11 @@ func clone(target:AnimatedSprite3D):
target.frame = frame target.frame = frame
target.frame_progress = frame_progress target.frame_progress = frame_progress
target.scale = scale target.scale = scale
func play_animation(animation_name:String):
if animation_name == animation:
frame = 0
frame_progress = 0
else:
play(animation_name)

@ -6,7 +6,7 @@ class_name AttackCfg
#数值信息 #数值信息
@export var damage_rate : float = 1 #伤害系数 @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 stun_attack : float = 10 #眩晕值伤害
@export var hit_back_speed : float #击退速度 @export var hit_back_speed : float #击退速度
@export var hit_back_duration : float #击退持续时间 @export var hit_back_duration : float #击退持续时间

@ -5,4 +5,5 @@ class_name ShieldCfg
@export var shield_max : float = 100 #护盾最大值 @export var shield_max : float = 100 #护盾最大值
@export var recover_speed : float = 10 #护盾恢复速度 @export var recover_speed : float = 10 #护盾恢复速度
@export var recover_cd : float = 5 #护盾恢复延迟 @export var recover_cd : float = 5 #护盾恢复延迟
@export var break_level_on : int #有护盾时硬直等级
@export var break_level_off : int #无护盾时硬直等级

@ -12,4 +12,7 @@ signal effect_create
signal character_create signal character_create
signal character_destroy signal character_destroy
signal character_pos_changed signal character_pos_changed
signal character_ui_pos_changed
signal character_status_changed signal character_status_changed
signal character_hit_text
signal character_hit_damage

@ -1,15 +1,13 @@
extends Control extends Control
class_name Headbar class_name Headbar
@onready var hit_text_scene = preload("res://scene/ui/item/hit_text.tscn")
@onready var hpbar = (%HpBar as TextureProgressBar) @onready var hpbar = (%HpBar as TextureProgressBar)
@onready var shieldbar = (%ShieldBar as TextureProgressBar) @onready var shieldbar = (%ShieldBar as TextureProgressBar)
@onready var stunbar = (%StunBar as TextureProgressBar) @onready var stunbar = (%StunBar as TextureProgressBar)
func _ready(): var hit_text_damage_cache : HitText
pass
func _process(delta):
pass
func on_hp_changed(value):hpbar.value = value func on_hp_changed(value):hpbar.value = value
func on_hp_max_changed(value):hpbar.max_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_shield_max_changed(value):shieldbar.max_value = value
func on_stun_changed(value):stunbar.value = value func on_stun_changed(value):stunbar.value = value
func on_stun_max_changed(value):stunbar.max_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

@ -11,9 +11,12 @@ var headbar_map = {}
func _ready(): func _ready():
SignalManager.character_create.connect(on_character_create) 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_destroy.connect(on_character_destroy)
SignalManager.character_status_changed.connect(on_character_status_changed) 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): func _process(delta):
var camera_pos = camera.position 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() var new_headbar = headbar_scene.instantiate()
add_child(new_headbar) add_child(new_headbar)
new_headbar_meta.headbar = 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 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: if not id in headbar_map:
return return
var headbar_meta = headbar_map[id] 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): if headbar.has_method(func_name):
headbar.call(func_name,value) 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)

@ -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()
Loading…
Cancel
Save