From 7ce41603a90d3edb9ccb7c8b2a6d923beea70809 Mon Sep 17 00:00:00 2001 From: chendian <-> Date: Tue, 24 Oct 2023 00:37:41 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9C=A9=E6=99=95=20=E6=8A=A4=E7=94=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/attack/rebound.tres | 4 +- config/character/hero01.tres | 7 +++- config/character/monster01.tres | 7 +++- config/character/monster02.tres | 7 +++- config/character_shield/normal.tres | 9 ++++ config/character_stun/normal.tres | 11 +++++ scene/character/character.tscn | 8 ++-- scene/ui/item/headbar.tscn | 48 +++++++++++++++++++++ script/character/battle.gd | 65 ++++++++++++++++++++++++----- script/character/buff.gd | 25 ++++++++++- script/character/character.gd | 12 ++++-- script/character/status.gd | 13 ++++-- script/character/view.gd | 27 ++++++++---- script/config/attack_cfg.gd | 2 +- script/config/character_cfg.gd | 5 ++- script/config/shield_cfg.gd | 8 ++++ script/config/stun_cfg.gd | 9 ++++ script/ui/headbar/headbar.gd | 13 +++--- 18 files changed, 233 insertions(+), 47 deletions(-) create mode 100644 config/character_shield/normal.tres create mode 100644 config/character_stun/normal.tres create mode 100644 script/config/shield_cfg.gd create mode 100644 script/config/stun_cfg.gd diff --git a/config/attack/rebound.tres b/config/attack/rebound.tres index 9c4a1bb..557fe64 100644 --- a/config/attack/rebound.tres +++ b/config/attack/rebound.tres @@ -10,7 +10,7 @@ hit_back_speed = 0.0 hit_back_duration = 0.0 hit_up_speed = 3.0 hit_up_duration = 0.05 -pause_time = 2.0 +pause_time = 0.2 is_floating = true -is_hit_down = null +is_hit_down = false is_rebound = true diff --git a/config/character/hero01.tres b/config/character/hero01.tres index 74792b3..2623632 100644 --- a/config/character/hero01.tres +++ b/config/character/hero01.tres @@ -1,8 +1,10 @@ -[gd_resource type="Resource" script_class="CharacterCfg" load_steps=4 format=3 uid="uid://bjvrih37ni5nx"] +[gd_resource type="Resource" script_class="CharacterCfg" load_steps=6 format=3 uid="uid://bjvrih37ni5nx"] [ext_resource type="Script" path="res://script/config/character_cfg.gd" id="1_2054l"] [ext_resource type="Resource" uid="uid://dx54fjf5t0uu8" path="res://config/character_move/normal.tres" id="1_ebj0w"] [ext_resource type="SpriteFrames" uid="uid://cwe8setoi6bd" path="res://resource/animation/character/hero01_move.aseprite" id="2_cssb0"] +[ext_resource type="Resource" uid="uid://dlaekoamystx3" path="res://config/character_shield/normal.tres" id="3_5l0vx"] +[ext_resource type="Resource" uid="uid://cac6mk6g078vn" path="res://config/character_stun/normal.tres" id="5_kn3ip"] [resource] script = ExtResource("1_2054l") @@ -12,6 +14,7 @@ sprite_frames = ExtResource("2_cssb0") sprite_harf_height = 26 sprite_width = 16 move = ExtResource("1_ebj0w") +shield = ExtResource("3_5l0vx") +stun = ExtResource("5_kn3ip") hp_max = 100.0 -shield_max = 100.0 attack = 10.0 diff --git a/config/character/monster01.tres b/config/character/monster01.tres index a8938c2..9aa2724 100644 --- a/config/character/monster01.tres +++ b/config/character/monster01.tres @@ -1,8 +1,10 @@ -[gd_resource type="Resource" script_class="CharacterCfg" load_steps=4 format=3 uid="uid://b1gf2jimihmc7"] +[gd_resource type="Resource" script_class="CharacterCfg" load_steps=6 format=3 uid="uid://b1gf2jimihmc7"] [ext_resource type="Script" path="res://script/config/character_cfg.gd" id="1_4orbu"] [ext_resource type="Resource" uid="uid://dx54fjf5t0uu8" path="res://config/character_move/normal.tres" id="1_b0lkj"] [ext_resource type="SpriteFrames" uid="uid://dkljs5h8gj5l" path="res://resource/animation/character/monster01_move.aseprite" id="2_su3hg"] +[ext_resource type="Resource" uid="uid://dlaekoamystx3" path="res://config/character_shield/normal.tres" id="3_3nfrx"] +[ext_resource type="Resource" uid="uid://cac6mk6g078vn" path="res://config/character_stun/normal.tres" id="5_7nk8h"] [resource] script = ExtResource("1_4orbu") @@ -12,6 +14,7 @@ sprite_frames = ExtResource("2_su3hg") sprite_harf_height = 10 sprite_width = 16 move = ExtResource("1_b0lkj") +shield = ExtResource("3_3nfrx") +stun = ExtResource("5_7nk8h") hp_max = 200.0 -shield_max = 200.0 attack = 10.0 diff --git a/config/character/monster02.tres b/config/character/monster02.tres index 8a5511b..9c82e41 100644 --- a/config/character/monster02.tres +++ b/config/character/monster02.tres @@ -1,8 +1,10 @@ -[gd_resource type="Resource" script_class="CharacterCfg" load_steps=4 format=3 uid="uid://dmfh54jffhx28"] +[gd_resource type="Resource" script_class="CharacterCfg" load_steps=6 format=3 uid="uid://dmfh54jffhx28"] [ext_resource type="Resource" uid="uid://dx54fjf5t0uu8" path="res://config/character_move/normal.tres" id="1_hjl2t"] [ext_resource type="Script" path="res://script/config/character_cfg.gd" id="1_wkjce"] [ext_resource type="SpriteFrames" uid="uid://crdd52skym3ir" path="res://resource/animation/character/monster02_move.aseprite" id="2_h60bf"] +[ext_resource type="Resource" uid="uid://dlaekoamystx3" path="res://config/character_shield/normal.tres" id="3_5w356"] +[ext_resource type="Resource" uid="uid://cac6mk6g078vn" path="res://config/character_stun/normal.tres" id="5_gyhft"] [resource] script = ExtResource("1_wkjce") @@ -12,6 +14,7 @@ sprite_frames = ExtResource("2_h60bf") sprite_harf_height = 26 sprite_width = 16 move = ExtResource("1_hjl2t") +shield = ExtResource("3_5w356") +stun = ExtResource("5_gyhft") hp_max = 100.0 -shield_max = 0.0 attack = 10.0 diff --git a/config/character_shield/normal.tres b/config/character_shield/normal.tres new file mode 100644 index 0000000..0c57a08 --- /dev/null +++ b/config/character_shield/normal.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="ShieldCfg" load_steps=2 format=3 uid="uid://dlaekoamystx3"] + +[ext_resource type="Script" path="res://script/config/shield_cfg.gd" id="1_gyix3"] + +[resource] +script = ExtResource("1_gyix3") +shield_max = 100.0 +recover_speed = 10.0 +recover_cd = 5.0 diff --git a/config/character_stun/normal.tres b/config/character_stun/normal.tres new file mode 100644 index 0000000..aba3cd9 --- /dev/null +++ b/config/character_stun/normal.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="StunCfg" load_steps=2 format=3 uid="uid://cac6mk6g078vn"] + +[ext_resource type="Script" path="res://script/config/stun_cfg.gd" id="1_2kfjh"] + +[resource] +script = ExtResource("1_2kfjh") +stun_max = 100.0 +recover_speed = 10.0 +recover_cd = 2.0 +recover_break_speed = 20.0 +recover_break_cd = 2.0 diff --git a/scene/character/character.tscn b/scene/character/character.tscn index f8d6ec7..87f613b 100644 --- a/scene/character/character.tscn +++ b/scene/character/character.tscn @@ -62,14 +62,14 @@ libraries = { } script = ExtResource("6_h4xqy") -[node name="Battle" type="Node3D" parent="."] -unique_name_in_owner = true -script = ExtResource("8_w84sf") - [node name="Buff" type="Node3D" parent="."] unique_name_in_owner = true script = ExtResource("9_jlnhy") +[node name="Battle" type="Node3D" parent="."] +unique_name_in_owner = true +script = ExtResource("8_w84sf") + [node name="Effect" type="Node3D" parent="."] unique_name_in_owner = true script = ExtResource("12_eyfcd") diff --git a/scene/ui/item/headbar.tscn b/scene/ui/item/headbar.tscn index 8d7ff8f..b60b66c 100644 --- a/scene/ui/item/headbar.tscn +++ b/scene/ui/item/headbar.tscn @@ -27,6 +27,53 @@ offset_right = 32.0 offset_bottom = 8.0 grow_horizontal = 2 grow_vertical = 2 +value = 60.0 +stretch_margin_left = 10 +stretch_margin_top = 10 +stretch_margin_right = 10 +stretch_margin_bottom = 10 +texture_under = ExtResource("2_g5t31") +texture_progress = ExtResource("3_vh1p5") +tint_progress = Color(1, 0, 0, 1) + +[node name="ShieldBar" type="TextureProgressBar" parent="."] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -32.0 +offset_top = -8.0 +offset_right = 32.0 +offset_bottom = 8.0 +grow_horizontal = 2 +grow_vertical = 2 +value = 50.0 +stretch_margin_left = 10 +stretch_margin_top = 10 +stretch_margin_right = 10 +stretch_margin_bottom = 10 +texture_under = ExtResource("2_g5t31") +texture_progress = ExtResource("3_vh1p5") +tint_progress = Color(0, 1, 1, 1) + +[node name="StunBar" type="TextureProgressBar" parent="."] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -32.0 +offset_top = 16.0 +offset_right = 32.0 +offset_bottom = 32.0 +grow_horizontal = 2 +grow_vertical = 2 +scale = Vector2(1, 0.439999) value = 50.0 stretch_margin_left = 10 stretch_margin_top = 10 @@ -34,3 +81,4 @@ stretch_margin_right = 10 stretch_margin_bottom = 10 texture_under = ExtResource("2_g5t31") texture_progress = ExtResource("3_vh1p5") +tint_progress = Color(0, 1, 1, 1) diff --git a/script/character/battle.gd b/script/character/battle.gd index 91e24c1..606b701 100644 --- a/script/character/battle.gd +++ b/script/character/battle.gd @@ -55,25 +55,70 @@ func settle(hit_info:HitInfo): if !character_from or !character_to: return + var cfg_from = character_from.cfg() + var cfg_to = character_to.cfg() + var attack = hit_info.attack + var is_floating = attack.is_floating or not character_to.get_status("is_on_floor") + var is_hit_down = attack.is_hit_down + var is_rebound = attack.is_rebound + var is_stun = character_to.get_status("is_stun") + var is_break_shield = false + var is_break_stun = false + var is_kill = false #造成伤害 - var damage = attack.damage_rate * character_from.get_property("attack") + var damage = attack.damage_rate * cfg_from.attack var hp = character_to.get_status("hp") - damage = min(hp,damage) - character_to.set_status("hp",hp-damage) + var shield = character_to.get_status("shield") + var has_shield = shield > 0 + if has_shield: + damage = min(shield,damage) + character_to.set_status("shield",shield-damage) + is_break_shield = damage == shield + if is_break_shield: + character_to.remove_buff("shield_recover_cd") + character_to.remove_buff("shield_recover") + else: + character_to.remove_buff("shield_recover") + character_to.add_buff("shield_recover_cd",cfg_to.shield.recover_cd) + else: + damage = min(hp,damage) + character_to.set_status("hp",hp-damage) + is_kill = damage == hp + + #眩晕值累加 + if not is_stun: + var stun_damage = attack.stun_attack + var stun = character_to.get_status("stun") + var stun_max = character_to.get_status("stun_max") + stun_damage = min(stun_max-stun,stun_damage) + character_to.set_status("stun",stun+stun_damage) + is_break_stun = stun_damage == stun_max-stun + if is_break_stun: + character_to.set_status("is_stun",true) + character_to.remove_buff("stun_recover_cd") + character_to.remove_buff("stun_recover") + character_to.add_buff("stun_recover_break_cd",cfg_to.stun.recover_break_cd) + else: + character_to.remove_buff("stun_recover") + character_to.add_buff("stun_recover_cd",cfg_to.stun.recover_cd) #取消技能 - character_to.cancel_skill() + if character_to.get_status("is_skill_running"): + character_to.cancel_skill() + #受击动画 - if attack.is_rebound: - character_to.set_view_trigger("rebound") - else: - character_to.set_view_trigger("hit") + var trigger_hit = "hit" + if is_rebound: trigger_hit="rebound" + elif is_floating: trigger_hit = "air_hit_down" if is_hit_down else "air_hit_up" + elif is_break_stun: trigger_hit="stun_hit" + elif is_stun: trigger_hit="stun_hit" + character_to.set_view_trigger(trigger_hit) #浮空 击落 强制位移 var hit_up_speed = attack.hit_up_speed - if attack.is_floating or not character_to.get_status("is_on_floor"): + if is_floating: character_to.add_buff("stagger",-1) character_to.add_buff("floating",-1) if hit_info.dir.x!=0: @@ -81,7 +126,7 @@ func settle(hit_info:HitInfo): else: character_to.add_buff("stagger",1) hit_up_speed = 0 - if attack.is_hit_down: + if is_hit_down: character_to.add_buff("hit_down",-1) character_to.set_hit_move(hit_info.dir,attack.hit_back_speed,hit_up_speed) character_to.add_buff("hit_back",attack.hit_back_duration) diff --git a/script/character/buff.gd b/script/character/buff.gd index 54b3383..389a8dc 100644 --- a/script/character/buff.gd +++ b/script/character/buff.gd @@ -80,7 +80,30 @@ func on_end_floating(rate):status.is_floating = false #战斗状态 func on_start_stagger(rate):status.is_stagger = true func on_end_stagger(rate):status.is_stagger = false -func on_end_stun(rate):status.is_stun = false +func on_end_shield_recover_cd(rate):add_buff("shield_recover",-1) +func on_update_shield_recover(rate): + var shield_add = get_process_delta_time() * status.cfg.shield.recover_speed + shield_add = min(status.shield_max - status.shield,shield_add) + if shield_add == status.shield_max - status.shield: + remove_buff("shield_recover") + character.set_status("shield",status.shield+shield_add) + +func on_end_stun_recover_break_cd(rate):add_buff("stun_recover_break",-1) +func on_update_stun_recover_break(rate): + var stun_sub = get_process_delta_time() * status.cfg.stun.recover_break_speed + stun_sub = min(status.stun,stun_sub) + character.set_status("stun",status.stun-stun_sub) + if status.stun == 0: + remove_buff("stun_recover_break") + character.set_status("is_stun",false) + +func on_end_stun_recover_cd(rate):add_buff("stun_recover",-1) +func on_update_stun_recover(rate): + var stun_sub = get_process_delta_time() * status.cfg.stun.recover_speed + stun_sub = min(status.stun,stun_sub) + character.set_status("stun",status.stun-stun_sub) + if status.stun == 0: + remove_buff("stun_recover") #表现 func on_second_pause(rate):status.is_pause = true diff --git a/script/character/character.gd b/script/character/character.gd index 0aa99f3..4ca5396 100644 --- a/script/character/character.gd +++ b/script/character/character.gd @@ -22,28 +22,32 @@ func init(id:int,cfg:CharacterCfg,team:Enum.ETeam): skill.init() func init_after(): - var cfg = status.cfg + var cfg = status.cfg as CharacterCfg set_status("hp",cfg.hp_max) set_status("hp_max",cfg.hp_max) - set_status("shield",cfg.shield_max) - set_status("shield_max",cfg.shield_max) + set_status("shield",cfg.shield.shield_max) + set_status("shield_max",cfg.shield.shield_max) + set_status("stun",0) + set_status("stun_max",cfg.stun.stun_max) func set_material(material:ShaderMaterial): view.material_override = material #==getter== func id()->int:return status.id +func cfg()->CharacterCfg:return status.cfg 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 #==interface== -func get_property(prop_name:String)->float:return status.cfg.get(prop_name) func get_status(status_name:String):return status.get_status(status_name) func set_status(status_name:String,value):status.set_status(status_name,value) func set_pos(pos:Vector3):position = pos func add_buff(buff_name:String,duration:float,ignore_pause:bool=false):buff.add_buff(buff_name,duration,ignore_pause) +func remove_buff(buff_name:String):buff.remove_buff(buff_name) +func has_buff(buff_name:String)->bool:return buff.has_buff(buff_name) func set_hit_move(hit_back_dir:Vector2,hit_back_speed:float,hit_up_speed:float):status.hit_back_dir = hit_back_dir;status.hit_back_speed = hit_back_speed;status.hit_up_speed = hit_up_speed func cancel_skill():skill.cancel_skill() func set_view_trigger(trigger_name:String):status.set("trigger_%s"%trigger_name,true) diff --git a/script/character/status.gd b/script/character/status.gd index df69af8..d8c01d1 100644 --- a/script/character/status.gd +++ b/script/character/status.gd @@ -14,6 +14,8 @@ class_name Status @export var hp_max : float #血量最大值 @export var shield : float #当前护盾 @export var shield_max : float #护盾最大值 +@export var stun : float #当前眩晕值 +@export var stun_max : float #眩晕值最大值 @export_category("表现状态") @export var basic_offset : Vector3 #基本偏移值 @@ -59,10 +61,13 @@ class_name Status @export_category("动画触发器") @export var trigger_jump : bool #跳跃 -@export var trigger_hit : bool #受击-轻 -@export var trigger_mhit : bool #受击-中 -@export var trigger_lhit : bool #受击-重 -@export var trigger_rebound : bool #反弹 +@export var trigger_hit : bool #受击-地面-轻 +@export var trigger_mhit : bool #受击-地面-中 +@export var trigger_lhit : bool #受击-地面-重 +@export var trigger_air_hit_up : bool #受击-空中受击-向上 +@export var trigger_air_hit_down : bool #受击-空中受击-向上 +@export var trigger_rebound : bool #受击-反弹 +@export var trigger_stun_hit : bool #受击-眩晕 func get_status(status_name:String):return get(status_name) diff --git a/script/character/view.gd b/script/character/view.gd index dc5ba12..1b97f89 100644 --- a/script/character/view.gd +++ b/script/character/view.gd @@ -34,21 +34,22 @@ func _ready(): trans("jump5","run1","speed_xz",">",1) #地面受击 - trigger_with_condition("any","hit1","trigger_hit","is_floating","=",false) - trigger_with_condition("any","mhit","trigger_mhit","is_floating","=",false) - trigger_with_condition("any","lhit","trigger_lhit","is_floating","=",false) + trigger("any","hit1","trigger_hit") + trigger("any","mhit","trigger_mhit") + trigger("any","lhit","trigger_lhit") run("hit1","hit2_loop") - run("hit3","idle_loop") - run("mhit3","idle_loop") + run("mhit1","mhit2_loop") + run("lhit1","lhit2_loop") trans("hit2_loop","hit3","is_stagger","=",false) trans("mhit2_loop","mhit3","is_stagger","=",false) trans("lhit2_loop","lhit3","is_stagger","=",false) - run("mhit1","mhit2_loop") - run("lhit1","lhit2_loop") + run("hit3","idle_loop") + run("mhit3","idle_loop") run("lhit3","idle_loop") #空中受击 - trigger_with_condition("any","airhit1","trigger_hit","is_floating","=",true) + 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) run("airhit3","airhit4_loop") @@ -57,6 +58,16 @@ func _ready(): trans("ground1_loop","ground2","is_stagger","=",false) run("ground2","idle_loop") + #眩晕受击 + trigger_with_condition("any","stunhit","trigger_stun_hit","is_on_floor","=",true) + run("stunhit","ground_stun1_loop") + trans("ground_stun1_loop","ground_stun2","is_stun","=",false) + run("ground_stun2","idle_loop") + + #空中眩晕受击 + trans("airhit5","airhit5_stun","is_stun","=",true) + run("airhit5_stun","ground_stun1_loop") + #落地反弹 trigger("any","rebound","trigger_rebound") run("rebound","airhit2_loop") diff --git a/script/config/attack_cfg.gd b/script/config/attack_cfg.gd index f28060e..b74c825 100644 --- a/script/config/attack_cfg.gd +++ b/script/config/attack_cfg.gd @@ -1,4 +1,3 @@ -@tool extends Resource class_name AttackCfg @@ -8,6 +7,7 @@ class_name AttackCfg #数值信息 @export var damage_rate : float = 1 #伤害系数 @export var break_level : int #硬直等级 +@export var stun_attack : float = 10 #眩晕值伤害 @export var hit_back_speed : float #击退速度 @export var hit_back_duration : float #击退持续时间 @export var hit_up_speed : float #击飞速度 diff --git a/script/config/character_cfg.gd b/script/config/character_cfg.gd index b40b86e..6545a65 100644 --- a/script/config/character_cfg.gd +++ b/script/config/character_cfg.gd @@ -11,10 +11,11 @@ class_name CharacterCfg @export var sprite_harf_height : int @export var sprite_width : int -#移动 +#基本组件 @export var move : CharacterMoveCfg +@export var shield : ShieldCfg +@export var stun : StunCfg #战斗信息 @export var hp_max : float -@export var shield_max : float @export var attack : float diff --git a/script/config/shield_cfg.gd b/script/config/shield_cfg.gd new file mode 100644 index 0000000..211e675 --- /dev/null +++ b/script/config/shield_cfg.gd @@ -0,0 +1,8 @@ +extends Resource + +class_name ShieldCfg + +@export var shield_max : float = 100 #护盾最大值 +@export var recover_speed : float = 10 #护盾恢复速度 +@export var recover_cd : float = 5 #护盾恢复延迟 + diff --git a/script/config/stun_cfg.gd b/script/config/stun_cfg.gd new file mode 100644 index 0000000..d70623c --- /dev/null +++ b/script/config/stun_cfg.gd @@ -0,0 +1,9 @@ +extends Resource + +class_name StunCfg + +@export var stun_max : float = 100 #眩晕值最大值 +@export var recover_speed : float = 10 #眩晕恢复速度 +@export var recover_cd : float = 2 #眩晕恢复延迟 +@export var recover_break_speed : float = 20 #眩晕触发后恢复速度 +@export var recover_break_cd : float = 2 #眩晕触发后恢复延迟 diff --git a/script/ui/headbar/headbar.gd b/script/ui/headbar/headbar.gd index ebef39b..1f2f27c 100644 --- a/script/ui/headbar/headbar.gd +++ b/script/ui/headbar/headbar.gd @@ -2,6 +2,8 @@ extends Control class_name Headbar @onready var hpbar = (%HpBar as TextureProgressBar) +@onready var shieldbar = (%ShieldBar as TextureProgressBar) +@onready var stunbar = (%StunBar as TextureProgressBar) func _ready(): pass @@ -9,8 +11,9 @@ func _ready(): func _process(delta): pass -func on_hp_changed(value): - hpbar.value = value - -func on_hp_max_changed(value): - hpbar.max_value = value +func on_hp_changed(value):hpbar.value = value +func on_hp_max_changed(value):hpbar.max_value = value +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