You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			177 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			GDScript
		
	
			
		
		
	
	
			177 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			GDScript
		
	
| 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()
 | |
| 	if status.is_pause:return
 | |
| 	update_flip()
 | |
| 	update_trans(false)
 | |
| 	update_material()
 | |
| 	update_view()
 | |
| 
 | |
| func init(default:SpriteFrames):
 | |
| 	sprite_frames = default
 | |
| 	move_sprite_frames = default
 | |
| 	play_animation("idle_loop")
 | |
| 
 | |
| func reset():
 | |
| 	sprite_frames = move_sprite_frames
 | |
| 	play_animation("idle_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():
 | |
| 	var material = material_override as ShaderMaterial
 | |
| 	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",status.deformation_rate*0.4)
 | |
| 	call_deferred("refresh_texture")
 | |
| 
 | |
| func refresh_texture():
 | |
| 	var material = material_override as ShaderMaterial
 | |
| 	var tex = sprite_frames.get_frame_texture(animation,frame)
 | |
| 	material.set_shader_parameter("tex",tex)
 | |
| 
 | |
| func clone(target:AnimatedSprite3D):
 | |
| 	target.sprite_frames = sprite_frames
 | |
| 	target.animation = animation
 | |
| 	target.frame = frame
 | |
| 	target.frame_progress = frame_progress
 | |
| 	target.scale.x = scale.x
 | |
| 
 | |
| func play_animation(animation_name:String):
 | |
| 	if animation_name == animation:
 | |
| 		frame = 0
 | |
| 		frame_progress = 0
 | |
| 	else:
 | |
| 		play(animation_name)
 | |
| 		
 |