142 lines
2.5 KiB
C++
142 lines
2.5 KiB
C++
#include <event/events.h>
|
|
#include <scene/components/camera_component.h>
|
|
#include <scene/director.h>
|
|
#include <utils/logger.h>
|
|
|
|
namespace extra2d {
|
|
|
|
Director::Director() {}
|
|
|
|
Director::~Director() { shutdown(); }
|
|
|
|
bool Director::init() { return true; }
|
|
|
|
void Director::shutdown() {
|
|
// 结束当前场景
|
|
if (runningScene_) {
|
|
runningScene_->onExit();
|
|
runningScene_.reset();
|
|
}
|
|
|
|
// 清空场景栈
|
|
while (!sceneStack_.empty()) {
|
|
sceneStack_.pop();
|
|
}
|
|
|
|
running_ = false;
|
|
}
|
|
|
|
void Director::runScene(Ptr<Scene> scene) {
|
|
if (!scene)
|
|
return;
|
|
|
|
// 结束当前场景
|
|
if (runningScene_) {
|
|
runningScene_->onExit();
|
|
}
|
|
|
|
// 清空场景栈
|
|
while (!sceneStack_.empty()) {
|
|
sceneStack_.pop();
|
|
}
|
|
|
|
// 运行新场景
|
|
runningScene_ = scene;
|
|
runningScene_->onEnter();
|
|
running_ = true;
|
|
needEnd_ = false;
|
|
}
|
|
|
|
void Director::replaceScene(Ptr<Scene> scene) {
|
|
if (!scene)
|
|
return;
|
|
|
|
// 结束当前场景
|
|
if (runningScene_) {
|
|
runningScene_->onExit();
|
|
}
|
|
|
|
// 替换场景
|
|
runningScene_ = scene;
|
|
runningScene_->onEnter();
|
|
}
|
|
|
|
void Director::pushScene(Ptr<Scene> scene) {
|
|
if (!scene)
|
|
return;
|
|
|
|
// 暂停当前场景
|
|
if (runningScene_) {
|
|
// 可以在这里添加暂停逻辑
|
|
sceneStack_.push(runningScene_);
|
|
}
|
|
|
|
// 运行新场景
|
|
runningScene_ = scene;
|
|
runningScene_->onEnter();
|
|
}
|
|
|
|
void Director::popScene() {
|
|
if (sceneStack_.empty()) {
|
|
// 没有场景可以弹出,结束运行
|
|
end();
|
|
return;
|
|
}
|
|
|
|
// 结束当前场景
|
|
if (runningScene_) {
|
|
runningScene_->onExit();
|
|
}
|
|
|
|
// 弹出栈顶场景
|
|
runningScene_ = sceneStack_.top();
|
|
sceneStack_.pop();
|
|
|
|
// 恢复场景
|
|
// 可以在这里添加恢复逻辑
|
|
}
|
|
|
|
void Director::end() {
|
|
needEnd_ = true;
|
|
running_ = false;
|
|
|
|
if (runningScene_) {
|
|
runningScene_->onExit();
|
|
runningScene_.reset();
|
|
}
|
|
}
|
|
|
|
Scene *Director::getRunningScene() const { return runningScene_.get(); }
|
|
|
|
CameraComponent *Director::getMainCamera() const {
|
|
if (runningScene_) {
|
|
return runningScene_->getMainCamera();
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
void Director::update(float dt) {
|
|
if (!running_ || !runningScene_)
|
|
return;
|
|
|
|
runningScene_->update(dt);
|
|
}
|
|
|
|
void Director::render() {
|
|
if (!running_ || !runningScene_)
|
|
return;
|
|
|
|
// 从场景获取相机并上传矩阵
|
|
CameraComponent *camera = runningScene_->getMainCamera();
|
|
if (camera) {
|
|
Mat4 viewProj = camera->getViewProjectionMatrix();
|
|
events::OnRenderSetCamera::emit(viewProj);
|
|
} else {
|
|
E2D_LOG_WARN("Director::render: No main camera set!");
|
|
}
|
|
|
|
runningScene_->render();
|
|
}
|
|
|
|
} // namespace extra2d
|