cs381/as6/scene/SceneManager.hpp

65 lines
1.6 KiB
C++

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