#pragma once #include "scene/Scene.hpp" #include #include /** * Owns current scene and supports immediate or queued transitions. */ class SceneManager { public: template void ChangeScene(Args &&...args); template void QueueSceneChange(Args &&...args); void ChangeScene(std::unique_ptr nextScene); void QueueSceneChange(std::unique_ptr nextScene); void Update(float dt); void Draw(); private: std::unique_ptr current; std::unique_ptr queued; }; inline void SceneManager::ChangeScene(std::unique_ptr nextScene) { if (current) { current->Exit(); } current = std::move(nextScene); if (current) { current->Enter(); } } inline void SceneManager::QueueSceneChange(std::unique_ptr nextScene) { queued = std::move(nextScene); } inline void SceneManager::Update(float dt) { if (queued) { ChangeScene(std::move(queued)); } if (current) { current->Update(dt); } if (queued) { ChangeScene(std::move(queued)); } } inline void SceneManager::Draw() { if (current) { current->Draw(); } } template inline void SceneManager::ChangeScene(Args &&...args) { ChangeScene(std::make_unique(*this, std::forward(args)...)); } template inline void SceneManager::QueueSceneChange(Args &&...args) { QueueSceneChange(std::make_unique(*this, std::forward(args)...)); }