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.

148 lines
4.5 KiB
GDScript

2 years ago
extends AnimatedSprite3D
class_name View
@onready var status = (%Status as Status)
class Trans:
var condition:StringName
var compareType:String
var conditionValue
var from:StringName
2 years ago
var to:StringName
2 years ago
var trigger_name:StringName
var on_end:bool
2 years ago
var trans_list = []
2 years ago
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)
2 years ago
#地面受击
2 years ago
trigger_with_condition("any","hit1","trigger_hit","is_floating","=",false)
trigger_with_condition("any","mhit","trigger_mhit","is_floating","=",false)
trigger_with_condition("any","lhit","trigger_lhit","is_floating","=",false)
run("hit1","hit2_loop")
run("hit3","idle_loop")
2 years ago
run("mhit3","idle_loop")
trans("hit2_loop","hit3","is_stagger","=",false)
trans("mhit2_loop","mhit3","is_stagger","=",false)
trans("lhit2_loop","lhit3","is_stagger","=",false)
run("mhit1","mhit2_loop")
run("lhit1","lhit2_loop")
run("lhit3","idle_loop")
#空中受击
2 years ago
trigger_with_condition("any","airhit1","trigger_hit","is_floating","=",true)
2 years ago
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)
2 years ago
run("ground2","idle_loop")
2 years ago
2 years ago
func _process(delta):
2 years ago
update_view()
if not status.is_skill_running and status.is_pause == is_playing():
if status.is_pause:pause();
else:play();
if status.is_pause:return
2 years ago
update_flip()
2 years ago
update_trans(false)
2 years ago
update_texture()
update_flash_white()
2 years ago
func init(default:SpriteFrames):
sprite_frames = default
move_sprite_frames = default
play("idle_loop")
func reset():
sprite_frames = move_sprite_frames
play("idle_loop")
func run(from:StringName,to:StringName):
2 years ago
_add_trans(from,to,"","","","",true)
func run_with_condition(from:StringName,to:StringName,condition,compareType,conditionValue):
_add_trans(from,to,condition,compareType,conditionValue,"",true)
2 years ago
func trans(from:StringName,to:StringName,condition,compareType,conditionValue):
2 years ago
_add_trans(from,to,condition,compareType,conditionValue,"",false)
func trigger(from:StringName,to:StringName,trigger_name:StringName):
_add_trans(from,to,"","","",trigger_name,false)
2 years ago
2 years ago
func trigger_with_condition(from:StringName,to:StringName,trigger_name:StringName,condition,compareType,conditionValue):
_add_trans(from,to,condition,compareType,conditionValue,trigger_name,false)
2 years ago
2 years ago
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)
2 years ago
func update_trans(on_end:bool):
for trans in trans_list:
2 years ago
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:
2 years ago
">":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(trans.to)
2 years ago
func update_flip():
scale.x = 1 if status.is_right else -1
2 years ago
2 years ago
func update_view():
position = status.basic_offset + status.shake_offset
2 years ago
func _on_animation_finished():
2 years ago
update_trans(true)
2 years ago
2 years ago
func update_texture():
var tex = sprite_frames.get_frame_texture(animation,frame)
var material = material_override as ShaderMaterial
material.set_shader_parameter("tex",tex)
func update_flash_white():
var material = material_override as ShaderMaterial
material.set_shader_parameter("flash_white",status.flash_white_rate)
2 years ago
func clone(target:AnimatedSprite3D):
target.sprite_frames = sprite_frames
target.animation = animation
target.frame = frame
target.frame_progress = frame_progress
target.scale = scale