diff options
| author | hachem <im@hachem.wtf> | 2025-08-14 00:02:01 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2025-08-14 00:02:01 +0200 |
| commit | 1b251bd174527951eec220ecbcb7eca89328e5b8 (patch) | |
| tree | c47632a340b4cbdd97812f8c92798fc36146558c /src/core/state_manager.cpp | |
| parent | 1ac0f136629ce4046a5f6529cf3d1e51e96df408 (diff) | |
feat: state manager
Diffstat (limited to 'src/core/state_manager.cpp')
| -rw-r--r-- | src/core/state_manager.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/core/state_manager.cpp b/src/core/state_manager.cpp new file mode 100644 index 0000000..5da601c --- /dev/null +++ b/src/core/state_manager.cpp @@ -0,0 +1,82 @@ +#include "state_manager.h" +#include "log.h" + +namespace Donut +{ + void StateManager::shutdown() + { + if (m_current_state) + m_current_state->on_exit(); + + destroy_states(); + DONUT_INFO("StateManager shutdown"); + } + + void StateManager::destroy_states() + { + m_states.clear(); + m_current_state = nullptr; + m_current_state_name = ""; + } + + void StateManager::register_state(const std::string& state_name, std::unique_ptr<State> state) + { + if (m_states.find(state_name) != m_states.end()) + DONUT_WARN("State '{}' already exists, overwriting", state_name); + m_states[state_name] = std::move(state); + DONUT_INFO("Registered state: {}", state_name); + } + + void StateManager::switch_to_state(const std::string& state_name) + { + auto it = m_states.find(state_name); + if (it == m_states.end()) + { + DONUT_ERROR("Attempted to switch to unknown state: {}", state_name); + return; + } + + State* new_state = it->second.get(); + if (new_state == m_current_state) + return; + + if (m_current_state) + m_current_state->on_exit(); + + m_current_state = new_state; + m_current_state_name = state_name; + m_current_state->on_enter(); + DONUT_INFO("Switched to state: {}", state_name); + } + + State* StateManager::get_state(const std::string& state_name) + { + auto it = m_states.find(state_name); + if (it != m_states.end()) + return it->second.get(); + return nullptr; + } + + bool StateManager::has_state(const std::string& state_name) const + { + return m_states.find(state_name) != m_states.end(); + } + + void StateManager::update(float delta_time) + { + if (m_current_state) + m_current_state->on_update(delta_time); + } + + void StateManager::render() + { + if (m_current_state) + m_current_state->on_render(); + } + + void StateManager::on_event(Event& event) + { + if (m_current_state) + m_current_state->on_event(event); + } +} |
