wave-survival/modules/wave_survival/state_machine.cpp

60 lines
1.4 KiB
C++

#include "state_machine.h"
#include "state.h"
void StateMachine::_bind_methods() {}
void StateMachine::switch_to_state(State *state) {
if (this->current_state != nullptr) {
this->current_state->exit_state();
}
this->current_state = state;
if (this->current_state != nullptr) {
this->current_state->enter_state();
} else {
print_error("StateMachine::switch_to_state: New state is nullptr, StateMachine will now stop working");
}
}
void StateMachine::process(double delta) {
if (this->current_state) {
this->current_state->process(delta);
String new_state{ this->current_state->get_next_state() };
if (new_state != this->current_state->get_class()) {
this->switch_to_state(this->states.has(new_state) ? this->states[new_state] : nullptr);
}
}
}
void StateMachine::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_READY:
set_process(true);
return;
case NOTIFICATION_PROCESS:
process(get_process_delta_time());
return;
}
}
StateMachine::~StateMachine() {
for (KeyValue<StringName, State *> kvp : this->states) {
if (kvp.value != nullptr) {
memdelete(kvp.value);
}
}
}
void StateMachine::add_state(State *state) {
state->set_state_machine(this);
state->set_target(this->get_parent());
this->states.insert(state->get_class(), state);
if (this->current_state == nullptr) {
this->switch_to_state(state);
}
}