#pragma once #include #include #include #include #include #include #include namespace extra2d { // 前向声明 struct RenderCommand; // ============================================================================ // 场景管理器 - 管理场景的生命周期和切换 // ============================================================================ class SceneManager { public: // ------------------------------------------------------------------------ // 单例访问 // ------------------------------------------------------------------------ static SceneManager &getInstance(); // ------------------------------------------------------------------------ // 场景栈操作 // ------------------------------------------------------------------------ // 运行第一个场景 void runWithScene(IntrusivePtr scene); // 替换当前场景 void replaceScene(IntrusivePtr scene); // 压入新场景(当前场景暂停) void pushScene(IntrusivePtr scene); // 弹出当前场景(恢复上一个场景) void popScene(); // 弹出到根场景 void popToRootScene(); // 弹出到指定场景 void popToScene(const std::string &name); // ------------------------------------------------------------------------ // 获取场景 // ------------------------------------------------------------------------ IntrusivePtr getCurrentScene() const; IntrusivePtr getPreviousScene() const; IntrusivePtr getRootScene() const; // 通过名称获取场景 IntrusivePtr 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); void collectRenderCommands(std::vector &commands); // ------------------------------------------------------------------------ // 清理 // ------------------------------------------------------------------------ void end(); void purgeCachedScenes(); public: SceneManager() = default; ~SceneManager() = default; SceneManager(const SceneManager &) = delete; SceneManager &operator=(const SceneManager &) = delete; // 场景切换(供 Application 使用) void enterScene(IntrusivePtr scene); private: void doSceneSwitch(); void dispatchPointerEvents(Scene &scene); std::stack> sceneStack_; std::unordered_map> namedScenes_; // Next scene to switch to (queued during transition) IntrusivePtr nextScene_; bool sendCleanupToScene_ = false; Node *hoverTarget_ = nullptr; Node *captureTarget_ = nullptr; Vec2 lastPointerWorld_ = Vec2::Zero(); bool hasLastPointerWorld_ = false; }; } // namespace extra2d