64 lines
1.6 KiB
GDScript
64 lines
1.6 KiB
GDScript
extends StateMachine
|
|
|
|
onready var anim_tree = $"../FlyerSprite/AnimationTree"
|
|
onready var anim_state_playback = $"../FlyerSprite/AnimationTree".get("parameters/playback")
|
|
|
|
func _ready() -> void:
|
|
add_state("searching")
|
|
add_state("hunting")
|
|
add_state("fleeing")
|
|
add_state("sleeping")
|
|
state = states.searching
|
|
set_state(states.searching)
|
|
print(self.state)
|
|
for state in states:
|
|
if state_matching_method_exists(state):
|
|
continue
|
|
else:
|
|
printerr("StateMachine -> State: " + state + " has no matching method in parent.")
|
|
push_error("StateMachine -> State: " + state + " has no matching method in parent.")
|
|
|
|
|
|
# Game logic consequences of state
|
|
func _state_logic(delta):
|
|
var state_action_ref = funcref(parent, self.state)
|
|
parent.path_direction = state_action_ref.call_func()
|
|
parent.execute_movement(delta)
|
|
|
|
|
|
func _get_transition(_delta):
|
|
parent.get_node("StateLabel").text = self.state
|
|
_animation_logic()
|
|
var new_state
|
|
if parent.target == null:
|
|
new_state = states.searching
|
|
if parent.target != null:
|
|
new_state = states.hunting
|
|
if parent.is_hurt:
|
|
new_state = states.sleeping
|
|
if new_state != self.state:
|
|
return new_state
|
|
return null
|
|
|
|
|
|
func _enter_state(_new_state, _previous_state):
|
|
pass
|
|
|
|
|
|
func _exit_state(_previous_state, _new_state):
|
|
pass
|
|
|
|
|
|
func _animation_logic():
|
|
_set_blendspaces_direction()
|
|
if self.state == "searching":
|
|
anim_state_playback.travel("searching")
|
|
else:
|
|
anim_state_playback.travel("hunting")
|
|
|
|
|
|
func _set_blendspaces_direction():
|
|
var value = parent.get_facing_direction()
|
|
anim_tree.set("parameters/searching/blend_position", value)
|
|
anim_tree.set("parameters/hunting/blend_position", value)
|