diff --git a/scene/character/character.tscn b/scene/character/character.tscn index d63ea99..2a38e4c 100644 --- a/scene/character/character.tscn +++ b/scene/character/character.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" uid="uid://cms637d0jt6sk" path="res://script/character/hitbox.gd" id="2_6xf87"] [ext_resource type="Script" uid="uid://bfi4gneebe3oq" path="res://script/character/status.gd" id="2_txdip"] [ext_resource type="Script" uid="uid://cnaqs44siwa45" path="res://script/character/move.gd" id="4_66r53"] -[ext_resource type="SpriteFrames" uid="uid://ce83cuqwgwwi4" path="res://resource/animation/character/hero01_long_attack.aseprite" id="4_sox5o"] +[ext_resource type="SpriteFrames" uid="uid://cajgs8smbkjan" path="res://resource/animation/character/hero01_fist_skill01.aseprite" id="4_sox5o"] [ext_resource type="Script" uid="uid://c247mf44qb3uf" path="res://script/character/view.gd" id="4_vijjv"] [ext_resource type="Script" uid="uid://c24is3uqqcmcn" path="res://script/character/skill.gd" id="6_h4xqy"] [ext_resource type="AnimationLibrary" uid="uid://croik07a1qko5" path="res://resource/skill_animation_library/animation_library.tres" id="6_pakq5"] @@ -143,7 +143,7 @@ gi_mode = 0 pixel_size = 0.02 alpha_cut = 1 sprite_frames = ExtResource("4_sox5o") -animation = &"long_attack02" +animation = &"fist_skill01_add" script = ExtResource("4_vijjv") [node name="Move" type="Node3D" parent="."] @@ -193,7 +193,7 @@ script = ExtResource("14_gua01") [node name="Throw" type="AnimatedSprite3D" parent="."] unique_name_in_owner = true -transform = Transform3D(-1, 0, 0, 0, -1, 1.50996e-07, 0, -1.50996e-07, -1, 0.75, 0.4, 0) +transform = Transform3D(-1, 0, 0, 0, 1, -1.50996e-07, 0, 1.50996e-07, 1, 0.75, 0.4, 0) visible = false pixel_size = 0.02 sprite_frames = ExtResource("15_70jx1") diff --git a/scene/ui/item/headbar.tscn b/scene/ui/item/headbar.tscn index dc53e52..bceaafa 100644 --- a/scene/ui/item/headbar.tscn +++ b/scene/ui/item/headbar.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=8 format=3 uid="uid://dy0u26ba7dle"] -[ext_resource type="Script" path="res://script/ui/hud/headbar.gd" id="1_k0rtd"] +[ext_resource type="Script" uid="uid://d01gac1vyca5t" path="res://script/ui/hud/headbar.gd" id="1_k0rtd"] [ext_resource type="Texture2D" uid="uid://cwhu1ec03t3c8" path="res://resource/ui/hud/headbar_hp_empty.png" id="2_g5t31"] [ext_resource type="Texture2D" uid="uid://b4ly1exl0owck" path="res://resource/ui/hud/headbar_hp.png" id="3_vh1p5"] [ext_resource type="Texture2D" uid="uid://c5xgdirnx5gq8" path="res://resource/ui/hud/headbar_shield.png" id="4_5g4h6"] @@ -185,3 +185,13 @@ offset_right = 80.0 offset_bottom = -6.0 theme_override_font_sizes/font_size = 10 text = "123,123" + +[node name="AnimationLabel" type="Label" parent="DebugInfo"] +unique_name_in_owner = true +layout_mode = 0 +offset_left = 24.0 +offset_top = -32.0 +offset_right = 80.0 +offset_bottom = -18.0 +theme_override_font_sizes/font_size = 10 +text = "123,123" diff --git a/script/character/status.gd b/script/character/status.gd index 2b4973a..ea0876d 100644 --- a/script/character/status.gd +++ b/script/character/status.gd @@ -15,115 +15,117 @@ class BulletOrder: signal character_status_changed #实体属性 -var id: int #id -var owner_id: int #所有者id -var sub_character_id: int #伴生随从id -var team: Enum.ETeam #队伍 +var id: int # id +var owner_id: int # 所有者id +var sub_character_id: int # 伴生随从id +var team: Enum.ETeam # 队伍 #静态属性 -var cfg: CharacterCfg #配置表 +var cfg: CharacterCfg # 配置表 var height: float # 受击框高度 var radius: float # 受击框半径 #战斗状态 -var hp: float #当前血量 -var hp_max: float #血量最大值 -var shield: float #当前护盾 -var shield_max: float #护盾最大值 -var stun: float #当前眩晕值 -var stun_max: float #眩晕值最大值 -var mp: int #mp最大值 -var mp_max: int #mp最大值 -var mp_sub: float #次级mp -var mp_sub_max: float #次级mp最大值 -var is_dead: bool #是否死亡 -var target: int #目标角色 -var is_lock: bool #是否主动锁定 -var throw_target: int #投技目标 -var break_level_def: int #硬直抗性等级 +var hp: float # 当前血量 +var hp_max: float # 血量最大值 +var shield: float # 当前护盾 +var shield_max: float # 护盾最大值 +var stun: float # 当前眩晕值 +var stun_max: float # 眩晕值最大值 +var mp: int # mp最大值 +var mp_max: int # mp最大值 +var mp_sub: float # 次级mp +var mp_sub_max: float # 次级mp最大值 +var is_dead: bool # 是否死亡 +var target: int # 目标角色 +var is_lock: bool # 是否主动锁定 +var throw_target: int # 投技目标 +var break_level_def: int # 硬直抗性等级 #表现状态 -var basic_offset: Vector3 #基本偏移值 -var shake_offset: Vector3 #抖动偏移值 -var ui_offset: Vector3 #ui挂点偏移值 -var ui_center_offset: Vector3 #ui中心挂点偏移值 -var is_pause: bool #是否暂停 -var flash_white_rate: float #闪白比例 -var deformation_dir: Vector2 #形变方向 -var deformation_rate: float #形变比例 +var basic_offset: Vector3 # 基本偏移值 +var shake_offset: Vector3 # 抖动偏移值 +var ui_offset: Vector3 # ui挂点偏移值 +var ui_center_offset: Vector3 # ui中心挂点偏移值 +var is_pause: bool # 是否暂停 +var flash_white_rate: float # 闪白比例 +var deformation_dir: Vector2 # 形变方向 +var deformation_rate: float # 形变比例 #移动状态 -var move_dir: Vector2 #移动方向 -var speed_dir: Vector2 #速度方向 -var velocity_change: Vector3 #一帧内速度变化值 -var speed_down_push_rate: float #来自软阻挡的速度减少比率 +var move_dir: Vector2 # 移动方向 +var speed_dir: Vector2 # 速度方向 +var velocity_change: Vector3 # 一帧内速度变化值 +var speed_down_push_rate: float # 来自软阻挡的速度减少比率 -@export var speed_up_rate: float #移动速度比率 +@export var speed_up_rate: float # 移动速度比率 -var speed_xz: float #水平移动速度 -var speed_y: float #竖直移动速度 -var is_free_control: bool = true #是否可以自由控制 -var is_on_floor: bool #是否在地面 -var is_free_turn: bool = true #是否允许转向 -var is_right: bool = true #是否向右 -var is_jumping: bool #是否正在跳跃 -var is_jumped: bool #是否已跳跃 +var speed_xz: float # 水平移动速度 +var speed_y: float # 竖直移动速度 +var is_free_control: bool = true # 是否可以自由控制 +var is_on_floor: bool # 是否在地面 +var is_free_turn: bool = true # 是否允许转向 +var is_right: bool = true # 是否向右 +var is_jumping: bool # 是否正在跳跃 +var is_jumped: bool # 是否已跳跃 -@export var is_speed_y_freeze: bool #是否冻结竖直速度 +@export var is_speed_y_freeze: bool # 是否冻结竖直速度 #buff状态 -var is_stagger: bool #是否硬直 -var is_stun: bool #是否眩晕 -var is_floating: bool #是否正在浮空 -var is_be_throw: bool #是否被投 -var is_rising: bool #是否正在开始浮空 -var hit_back_dir: Vector2 #击退方向 -var hit_back_speed: float #击退速度 -var hit_up_speed: float #击飞速度 -var pause_time: float #卡帧时间 +var is_stagger: bool # 是否硬直 +var is_stun: bool # 是否眩晕 +var is_floating: bool # 是否正在浮空 +var is_be_throw: bool # 是否被投 +var is_rising: bool # 是否正在开始浮空 +var hit_back_dir: Vector2 # 击退方向 +var hit_back_speed: float # 击退速度 +var hit_up_speed: float # 击飞速度 +var pause_time: float # 卡帧时间 #技能状态 -var skill_cfg: SkillCfg #当前技能 -var is_skill_running: bool #技能是否正在释放 -var skill_dir: Vector2 #技能释放方向 -var skill_move_dir: Vector2 #技能位移方向 -var skill_action_key: String #技能输入指令 -var skill_repeat_count: int #技能重复释放次数 -var is_hit_character: bool #是否击中角色 -var is_hit_wall: bool #是否移动击中墙 - -@export var skill_move_speed: float #技能位移速度 -@export var skill_float_speed: float #技能y位移速度 -@export var skill_move_stop: bool #技能位移速度是否停止生效 -@export var skill_break_level_add: int #技能额外打断等级 +var skill_cfg: SkillCfg # 当前技能 +var is_skill_running: bool # 技能是否正在释放 +var skill_dir: Vector2 # 技能释放方向 +var skill_move_dir: Vector2 # 技能位移方向 +var skill_action_key: String # 技能输入指令 +var skill_repeat_count: int # 技能重复释放次数 +var is_hit_character: bool # 是否击中角色 +var is_hit_wall: bool # 是否移动击中墙 + +@export var skill_move_speed: float # 技能位移速度 +@export var skill_float_speed: float # 技能y位移速度 +@export var skill_move_stop: bool # 技能位移速度是否停止生效 +@export var skill_break_level_add: int # 技能额外打断等级 #核心状态 -var core_active_list: Array[CoreCfg] = [] #主动核心列表 8个 -var core_passive_list: Array[CoreCfg] = [] #被动核心列表 +var core_active_list: Array[CoreCfg] = [] # 主动核心列表 8个 +var core_passive_list: Array[CoreCfg] = [] # 被动核心列表 #玩家技能状态 -var input_dir: Vector2 #指令方向 - -@export var stance: Enum.EStance #技能姿态 -@export var break_level: Enum.EBreakLevel #打断等级 - -var weapon_list: Array[WeaponCfg] = [] #武器列表 -var weapon_index: int #当前武器下标 -var weapon_index_change_dir: int #武器下标操作变化方向 -var weapon_index_change_rate: float #武器下标操作变化进度 -var is_switch: bool #是否切换到核心释放模式 -var is_charging: bool #是否蓄力 -var charging_level: int #蓄力等级 +var input_dir: Vector2 # 指令方向 + +@export var stance: Enum.EStance # 技能姿态 +@export var break_level: Enum.EBreakLevel # 打断等级 + +var weapon_list: Array[WeaponCfg] = [] # 武器列表 +var weapon_index: int # 当前武器下标 +var weapon_index_change_dir: int # 武器下标操作变化方向 +var weapon_index_change_rate: float # 武器下标操作变化进度 +var is_switch: bool # 是否切换到核心释放模式 +var is_charging: bool # 是否蓄力 +var charging_level: int # 蓄力等级 #ai状态 -var ai_role: int #ai角色 -var ai_skill_order: Array[SkillOrder] = [] #ai技能指令 -var ai_bullet_order: Array[BulletOrder] = [] #ai子弹指令 -var ai_alert_max: float #警戒值最大值 -var ai_alert: float #警戒值 -var ai_is_alert: bool #是否已激活 +var ai_role: int # ai角色 +var ai_skill_order: Array[SkillOrder] = [] # ai技能指令 +var ai_bullet_order: Array[BulletOrder] = [] # ai子弹指令 +var ai_alert_max: float # 警戒值最大值 +var ai_alert: float # 警戒值 +var ai_is_alert: bool # 是否已激活 +#动画状态 +var current_animation: String #动画触发器 -var trigger_jump: bool #跳跃 -var trigger_hit: bool #受击-地面-轻 -var trigger_mhit: bool #受击-地面-中 -var trigger_lhit: bool #受击-地面-重 -var trigger_air_hit_up: bool #受击-空中受击-向上 -var trigger_air_hit_down: bool #受击-空中受击-向上 -var trigger_rebound: bool #受击-反弹 -var trigger_stun_hit: bool #受击-眩晕 +var trigger_jump: bool # 跳跃 +var trigger_hit: bool # 受击-地面-轻 +var trigger_mhit: bool # 受击-地面-中 +var trigger_lhit: bool # 受击-地面-重 +var trigger_air_hit_up: bool # 受击-空中受击-向上 +var trigger_air_hit_down: bool # 受击-空中受击-向上 +var trigger_rebound: bool # 受击-反弹 +var trigger_stun_hit: bool # 受击-眩晕 func get_status(status_name: String) -> Variant: return get(status_name) @@ -155,6 +157,6 @@ func set_skill_break_level_add(value: int): func refresh_break_level_def(): - break_level_def = cfg.shield.break_level_on if shield>0 else cfg.shield.break_level_off + break_level_def = cfg.shield.break_level_on if shield > 0 else cfg.shield.break_level_off break_level_def += skill_break_level_add emit_status("break_level_def") diff --git a/script/character/view.gd b/script/character/view.gd index c288867..736bafb 100644 --- a/script/character/view.gd +++ b/script/character/view.gd @@ -13,8 +13,8 @@ class Trans: var trigger_name: StringName var trans_dict: Dictionary = {} # {condition/trigger:{from:Trans[]}} +var status_change_cache = [] var move_sprite_frames: SpriteFrames -var current_animation: String func init(default: SpriteFrames): sprite_frames = default @@ -61,7 +61,7 @@ func trans_register() -> void: run("lhit", "idle_loop") #地面眩晕受击 - trigger_with_condition("any", "stunhit", "trigger_stun_hit", "is_on_floor", "=", true) + trigger("any", "stunhit", "trigger_stun_hit") run("stunhit", "ground_stun1_loop") #空中受击 @@ -89,7 +89,17 @@ func trans_register() -> void: trigger("any", "rebound", "trigger_rebound") run("rebound", "airhit2_loop") -func _on_character_status_changed(status_name, value) -> void: +func _process(_delta) -> void: + if status.is_be_throw: return + if status.is_pause: return + for status_change_cache_single in status_change_cache: + update_trans(status_change_cache_single) + status_change_cache.clear() + +func _on_character_status_changed(status_name, _value) -> void: + if status_name in trans_dict: + status_change_cache.append(status_name) + return if status_name == "is_right": scale.x = 1 if status.is_right else -1 if status.is_be_throw: return @@ -100,15 +110,13 @@ func _on_character_status_changed(status_name, value) -> void: if status_name == "basic_offset" or status_name == "shake_offset": position = status.basic_offset + status.shake_offset # global_position = Util.snap_vector3(global_position) - if status.is_pause: - return - if status_name in ["deformation_rate", "is_floating", "flash_white_rate", "deformation_rate"]: + if status.is_pause: return + if status_name in ["deformation_rate", "flash_white_rate"]: update_material() - update_trans(status_name, value) func _on_animation_finished(): - update_trans("animation_end", null) + update_trans("animation_end") func _on_animation_changed() -> void: update_material_tex() @@ -133,10 +141,6 @@ func trigger(from: StringName, to: StringName, trigger_name: StringName): _add_trans(from, to, trigger_name, "", "", "", trigger_name) -func trigger_with_condition(from: StringName, to: StringName, trigger_name: StringName, condition, compareType, conditionValue): - _add_trans(from, to, trigger_name, condition, compareType, conditionValue, trigger_name) - - func _add_trans(from: StringName, to: StringName, key: String, condition, compareType, conditionValue, trigger_name: StringName): var new_trans = Trans.new() new_trans.condition = condition @@ -153,20 +157,19 @@ func _add_trans(from: StringName, to: StringName, key: String, condition, compar trans_dict[key][from].append(new_trans) -func update_trans(key: String, value) -> void: +func update_trans(key: String) -> void: if not key in trans_dict: return - if current_animation in trans_dict[key]: - update_trans_single(trans_dict[key][current_animation], value) + if status.current_animation in trans_dict[key]: + update_trans_single(trans_dict[key][status.current_animation]) if "any" in trans_dict[key]: - update_trans_single(trans_dict[key]["any"], value) + update_trans_single(trans_dict[key]["any"]) -func update_trans_single(trans_list, value) -> void: +func update_trans_single(trans_list) -> void: for trans_single in trans_list: if trans_single.condition != "": - if value == null: - value = status.get_status(trans_single.condition) + var value = status.get_status(trans_single.condition) match trans_single.compareType: ">": if value <= trans_single.conditionValue: continue "<": if value >= trans_single.conditionValue: continue @@ -225,11 +228,11 @@ func _update_material_tex(): func play_animation(animation_name: String) -> void: - current_animation = animation_name + status.set_status("current_animation", animation_name) if not sprite_frames: return if not sprite_frames.has_animation(animation_name): - update_trans("animation_end", null) + update_trans("animation_end") return if animation_name == animation: frame = 0 diff --git a/script/manager/item_manager.gd b/script/manager/item_manager.gd index 366399b..3ee7332 100644 --- a/script/manager/item_manager.gd +++ b/script/manager/item_manager.gd @@ -2,6 +2,7 @@ extends Node3D class_name ItemManager var pt_count: int +var pt_cache: int func _ready(): Global.item_mgr = self @@ -13,6 +14,8 @@ func on_level_loading_start(): func create_pt(type: Enum.EPtType, value: int, pos: Vector3): + value += pt_cache + pt_cache = 0 if pt_count < 20: value = randi_range(int(0.5 * value), int(1.5 * value)) var pt_slice: Array[int] = [100, 50, 20, 10, 5, 2, 1] @@ -23,8 +26,10 @@ func create_pt(type: Enum.EPtType, value: int, pos: Vector3): value -= i _create_pt(type, i, pos) break - else: + elif pt_count < 50: _create_pt(type, value, pos) + else: + pt_cache = value func destroy_pt(pt: PT): diff --git a/script/ui/hud/headbar.gd b/script/ui/hud/headbar.gd index 7d515f5..fa31aa0 100644 --- a/script/ui/hud/headbar.gd +++ b/script/ui/hud/headbar.gd @@ -13,6 +13,8 @@ class_name Headbar @onready var mp_sub_bar: TextureProgressBar = (%MpSubBar as TextureProgressBar) @onready var pos_lable: Label = (%PosLabel as Label) @onready var role_lable: Label = (%RoleLabel as Label) +@onready var animation_label: Label = (%AnimationLabel as Label) + var is_show_debug_info: bool @@ -112,6 +114,11 @@ func on_ai_role_changed(value): role_lable.text = str(value) +func on_current_animation_changed(value): + if is_show_debug_info: + animation_label.text = str(value) + + func on_hit_text(value: String): var hit_text: HitText = get_hit_text_object() hit_text.show_hit_text(value)