65 lines
1.6 KiB
C++
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)...));
|
|
}
|