Extra2D/include/scene/director.h

133 lines
2.5 KiB
C++

#pragma once
#include <scene/scene.h>
#include <types/ptr/intrusive_ptr.h>
#include <types/ptr/ref_counted.h>
#include <stack>
namespace extra2d {
// 前向声明
class CameraComponent;
/**
* @brief 导演类
*
* 管理场景的生命周期和切换
*/
class Director : public RefCounted {
public:
/**
* @brief 构造函数
*/
Director();
/**
* @brief 析构函数
*/
~Director() override;
// 禁止拷贝
Director(const Director&) = delete;
Director& operator=(const Director&) = delete;
// ========================================
// 生命周期
// ========================================
/**
* @brief 初始化导演
* @return 是否成功
*/
bool init();
/**
* @brief 关闭导演
*/
void shutdown();
// ========================================
// 场景管理
// ========================================
/**
* @brief 运行场景
* @param scene 场景
*/
void runScene(Ptr<Scene> scene);
/**
* @brief 替换当前场景
* @param scene 新场景
*/
void replaceScene(Ptr<Scene> scene);
/**
* @brief 压入场景(场景栈)
* @param scene 场景
*/
void pushScene(Ptr<Scene> scene);
/**
* @brief 弹出场景(场景栈)
*/
void popScene();
/**
* @brief 结束当前场景
*/
void end();
// ========================================
// 属性获取
// ========================================
/**
* @brief 获取当前运行的场景
* @return 场景指针
*/
Scene* getRunningScene() const;
/**
* @brief 获取主相机
* @return 相机组件指针
*/
CameraComponent* getMainCamera() const;
/**
* @brief 是否正在运行场景
* @return 是否运行中
*/
bool isRunning() const { return running_; }
// ========================================
// 生命周期
// ========================================
/**
* @brief 更新当前场景
* @param dt 帧间隔时间
*/
void update(float dt);
/**
* @brief 渲染当前场景
*/
void render();
/**
* @brief 设置主相机
* @param camera 相机组件
*/
void setMainCamera(CameraComponent* camera) { mainCamera_ = camera; }
private:
Ptr<Scene> runningScene_;
std::stack<Ptr<Scene>> sceneStack_;
CameraComponent* mainCamera_ = nullptr;
bool running_ = false;
bool needEnd_ = false;
};
} // namespace extra2d