fix 动画trigger bug、优化极端情况下pt掉落

master
chendian 8 months ago
parent 973ac74455
commit 047f4eb9b3

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

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

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

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

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

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

Loading…
Cancel
Save