47 lines
1.0 KiB
GDScript
47 lines
1.0 KiB
GDScript
class_name PlayerStateMachine extends Node
|
|
|
|
var states: Array[State]
|
|
var previous_state: State
|
|
var current_state: State
|
|
|
|
func _ready() -> void:
|
|
process_mode = Node.PROCESS_MODE_DISABLED
|
|
|
|
func _process(delta: float) -> void:
|
|
change_state(current_state.process(delta))
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
change_state(current_state.process(delta))
|
|
|
|
func _unhandled_input(event) -> void:
|
|
change_state(current_state.handle_input(event))
|
|
|
|
func initialize(player: Player) -> void:
|
|
states = []
|
|
for child in get_children():
|
|
if child is State:
|
|
states.append(child)
|
|
if states.is_empty():
|
|
return
|
|
|
|
var firstState = states[0]
|
|
firstState.player = player
|
|
firstState.state_machine = self
|
|
|
|
for state in states:
|
|
state.init()
|
|
|
|
change_state(firstState)
|
|
process_mode = Node.PROCESS_MODE_INHERIT
|
|
|
|
func change_state(new_state: State) -> void:
|
|
if new_state == null or new_state == current_state:
|
|
return
|
|
|
|
if current_state:
|
|
current_state.exit()
|
|
|
|
previous_state = current_state
|
|
current_state = new_state
|
|
current_state.enter()
|