extends AnimatedSprite3D class_name View @onready var status = (%Status as Status) class Trans: var condition:StringName var compareType:String var conditionValue var from:StringName var to:StringName var trigger_name:StringName var on_end:bool var trans_list = [] var move_sprite_frames:SpriteFrames func _ready(): # 地面行走 trans("idle_loop","run1","speed_xz",">",1) run("run1","run2_loop") trans("run1","run3","speed_xz","<",1) trans("run2_loop","run3","speed_xz","<",1) run("run3","idle_loop") trans("run3","run1","speed_xz",">",1) # 跳跃 trigger("any","jump1","trigger_jump") run("jump1","jump2_loop") trans("jump2_loop","jump3","speed_y","<=",0) run("jump3","jump4_loop") trans("jump4_loop","jump5","is_on_floor","=",true) run("jump5","idle_loop") trans("jump5","run1","speed_xz",">",1) #地面受击 trigger("any","hit1","trigger_hit") trigger("any","mhit1","trigger_mhit") trigger("any","lhit1","trigger_lhit") run("hit1","hit2_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("hit3","idle_loop") run("mhit3","idle_loop") run("lhit3","idle_loop") #空中受击 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") trans("airhit4_loop","airhit5","is_on_floor","=",true) run("airhit5","ground1_loop") 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") func _process(delta): if not status.is_skill_running and status.is_pause == is_playing(): if status.is_pause:pause() else:play_animation(animation) update_view() if status.is_pause:return update_flip() update_trans(false) update_material() func init(default:SpriteFrames): sprite_frames = default move_sprite_frames = default play_animation("idle_loop") func reset(): sprite_frames = move_sprite_frames if status.is_on_floor: play_animation("idle_loop") else: play_animation("jump4_loop") func run(from:StringName,to:StringName): _add_trans(from,to,"","","","",true) func run_with_condition(from:StringName,to:StringName,condition,compareType,conditionValue): _add_trans(from,to,condition,compareType,conditionValue,"",true) func trans(from:StringName,to:StringName,condition,compareType,conditionValue): _add_trans(from,to,condition,compareType,conditionValue,"",false) func trigger(from:StringName,to:StringName,trigger_name:StringName): _add_trans(from,to,"","","",trigger_name,false) func trigger_with_condition(from:StringName,to:StringName,trigger_name:StringName,condition,compareType,conditionValue): _add_trans(from,to,condition,compareType,conditionValue,trigger_name,false) func _add_trans(from:StringName,to:StringName,condition,compareType,conditionValue,trigger_name:StringName,on_end:bool): var new_trans = Trans.new() new_trans.condition = condition new_trans.compareType = compareType new_trans.conditionValue = conditionValue new_trans.from = from new_trans.to = to new_trans.trigger_name = trigger_name new_trans.on_end = on_end trans_list.append(new_trans) func update_trans(on_end:bool): for trans in trans_list: if on_end != trans.on_end: continue if not (trans.from == "any" or trans.from == animation): continue if trans.condition != "": var conditionValue = status.get(trans.condition) 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_animation(trans.to) func update_flip(): scale.x = 1 if status.is_right else -1 func update_view(): position = status.basic_offset + status.shake_offset global_position = Util.snap_vector3(global_position) func _on_animation_finished(): update_trans(true) func update_material(): call_deferred("_update_material") func _update_material(): var material = material_override as ShaderMaterial var material2 = material_override.next_pass as ShaderMaterial var tex = sprite_frames.get_frame_texture(animation,frame) var deformation_rate = status.deformation_rate * (0.5 if status.is_floating else 0.4) material2.set_shader_parameter("flash_white",status.flash_white_rate) material.set_shader_parameter("deformation_dir",status.deformation_dir) material2.set_shader_parameter("deformation_dir",status.deformation_dir) material.set_shader_parameter("deformation_rate",deformation_rate) material2.set_shader_parameter("deformation_rate",deformation_rate) material.set_shader_parameter("tex",tex) material2.set_shader_parameter("tex",tex) func play_animation(animation_name:String): if not sprite_frames.has_animation(animation_name): print("无效动画:",animation_name) return if animation_name == animation: frame = 0 frame_progress = 0 play() else: play(animation_name,Setting.animation_speed_scale)