Extra2D/src/scene/director.cpp

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