|  |  |  | extends AnimatedSprite3D | 
					
						
							|  |  |  | class_name View | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @onready var status: 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: Array[Trans] = [] | 
					
						
							|  |  |  | 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", "hit", "trigger_hit") | 
					
						
							|  |  |  | 	trigger("any", "mhit", "trigger_mhit") | 
					
						
							|  |  |  | 	trigger("any", "lhit", "trigger_lhit") | 
					
						
							|  |  |  | 	run("hit", "idle_loop") | 
					
						
							|  |  |  | 	run("mhit", "idle_loop") | 
					
						
							|  |  |  | 	run("lhit", "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) -> void: | 
					
						
							|  |  |  | 	tick_view() | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func tick_view() -> void: | 
					
						
							|  |  |  | 	update_flip() | 
					
						
							|  |  |  | 	if not sprite_frames: return | 
					
						
							|  |  |  | 	if status.is_be_throw: return | 
					
						
							|  |  |  | 	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_trans(false) | 
					
						
							|  |  |  | 	update_material() | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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) | 
					
						
							|  |  |  | 		break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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() -> void: | 
					
						
							|  |  |  | 	call_deferred("_update_material") | 
					
						
							|  |  |  | 	return | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func _update_material(): | 
					
						
							|  |  |  | 	if not sprite_frames: | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	var material: ShaderMaterial  = material_override as ShaderMaterial | 
					
						
							|  |  |  | 	var material2: ShaderMaterial = material_override.next_pass as ShaderMaterial | 
					
						
							|  |  |  | 	var tex: Texture2D            = sprite_frames.get_frame_texture(animation, frame) | 
					
						
							|  |  |  | 	var deformation_rate: float   = status.deformation_rate * (0.5 if status.is_floating else 0.4) | 
					
						
							|  |  |  | 	if material: | 
					
						
							|  |  |  | 		material.set_shader_parameter("flash_white", status.flash_white_rate) | 
					
						
							|  |  |  | 		material.set_shader_parameter("deformation_dir", status.deformation_dir) | 
					
						
							|  |  |  | 		material.set_shader_parameter("deformation_rate", deformation_rate) | 
					
						
							|  |  |  | 		material.set_shader_parameter("tex", tex) | 
					
						
							|  |  |  | 	if material2: | 
					
						
							|  |  |  | 		material2.set_shader_parameter("flash_white", status.flash_white_rate) | 
					
						
							|  |  |  | 		material2.set_shader_parameter("deformation_dir", status.deformation_dir) | 
					
						
							|  |  |  | 		material2.set_shader_parameter("deformation_rate", deformation_rate) | 
					
						
							|  |  |  | 		material2.set_shader_parameter("tex", tex) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func play_animation(animation_name: String) -> void: | 
					
						
							|  |  |  | 	if not sprite_frames: | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	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) |