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.
		
		
		
		
		
			
		
			
				
	
	
		
			200 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			GDScript
		
	
			
		
		
	
	
			200 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			GDScript
		
	
| 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:
 | |
|     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)
 | |
|     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) -> 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)
 |