Extra2D/Extra2D/include/extra2d/scene/scene_manager.h

63 lines
1.6 KiB
C++

#pragma once
#include <extra2d/core/types.h>
#include <extra2d/render/renderer.h>
#include <extra2d/scene/scene.h>
#include <stack>
#include <string>
#include <unordered_map>
namespace extra2d {
// ============================================================================
// 场景管理器 - 管理场景的生命周期和切换
// ============================================================================
class SceneManager {
public:
static SceneManager &getInstance();
// 场景栈操作
void runWithScene(Ref<Scene> scene);
void replaceScene(Ref<Scene> scene);
void pushScene(Ref<Scene> scene);
void popScene();
void popToRootScene();
void popToScene(const std::string &name);
// 获取场景
Ref<Scene> getCurrentScene() const;
Ref<Scene> getPreviousScene() const;
Ref<Scene> getRootScene() const;
Ref<Scene> getSceneByName(const std::string &name) const;
// 查询
size_t getSceneCount() const { return sceneStack_.size(); }
bool isEmpty() const { return sceneStack_.empty(); }
bool hasScene(const std::string &name) const;
// 更新和渲染
void update(float dt);
void render(Renderer &renderer);
// 过渡控制
bool isTransitioning() const { return false; }
// 清理
void end();
void purgeCachedScenes();
// 场景切换(供 Application 使用)
void enterScene(Ref<Scene> scene);
private:
SceneManager() = default;
~SceneManager() = default;
SceneManager(const SceneManager &) = delete;
SceneManager &operator=(const SceneManager &) = delete;
std::stack<Ref<Scene>> sceneStack_;
std::unordered_map<std::string, Ref<Scene>> namedScenes_;
};
} // namespace extra2d