133 lines
2.5 KiB
C++
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
|