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 | 641db1c86bf624527173b0323bd3c832338c3662 (patch) | |
| tree | 188fe41c2351b8b426b8904ea23faec68f4144a4 /src/Core/StateManager.cpp | |
| parent | 6afeab30f84bc19fc4fc3dd842e7b093d4c5a9fa (diff) | |
[add]: State manager
Diffstat (limited to 'src/Core/StateManager.cpp')
| -rw-r--r-- | src/Core/StateManager.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/Core/StateManager.cpp b/src/Core/StateManager.cpp new file mode 100644 index 0000000..30d6b1d --- /dev/null +++ b/src/Core/StateManager.cpp @@ -0,0 +1,82 @@ +#include "StateManager.h" +#include "Log.h" + +namespace Donut +{ + void StateManager::Shutdown() + { + if (m_CurrentState) + m_CurrentState->OnExit(); + + DestroyStates(); + DONUT_INFO("StateManager shutdown"); + } + + void StateManager::DestroyStates() + { + m_States.clear(); + m_CurrentState = nullptr; + m_CurrentStateName = ""; + } + + void StateManager::RegisterState(const std::string& stateName, std::unique_ptr<State> state) + { + if (m_States.find(stateName) != m_States.end()) + DONUT_WARN("State '{}' already exists, overwriting", stateName); + m_States[stateName] = std::move(state); + DONUT_INFO("Registered state: {}", stateName); + } + + void StateManager::SwitchToState(const std::string& stateName) + { + auto it = m_States.find(stateName); + if (it == m_States.end()) + { + DONUT_ERROR("Attempted to switch to unknown state: {}", stateName); + return; + } + + State* newState = it->second.get(); + if (newState == m_CurrentState) + return; + + if (m_CurrentState) + m_CurrentState->OnExit(); + + m_CurrentState = newState; + m_CurrentStateName = stateName; + m_CurrentState->OnEnter(); + DONUT_INFO("Switched to state: {}", stateName); + } + + State* StateManager::GetState(const std::string& stateName) + { + auto it = m_States.find(stateName); + if (it != m_States.end()) + return it->second.get(); + return nullptr; + } + + bool StateManager::HasState(const std::string& stateName) const + { + return m_States.find(stateName) != m_States.end(); + } + + void StateManager::Update(float deltaTime) + { + if (m_CurrentState) + m_CurrentState->OnUpdate(deltaTime); + } + + void StateManager::Render() + { + if (m_CurrentState) + m_CurrentState->OnRender(); + } + + void StateManager::OnEvent(Event& event) + { + if (m_CurrentState) + m_CurrentState->OnEvent(event); + } +} |
