#include #include #include #include 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) { 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) { if (!scene) return; // 结束当前场景 if (runningScene_) { runningScene_->onExit(); } // 替换场景 runningScene_ = scene; runningScene_->onEnter(); } void Director::pushScene(Ptr 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(); // 调试输出:打印视图投影矩阵 static bool logged = false; if (!logged) { const float* m = glm::value_ptr(viewProj); E2D_LOG_INFO("ViewProjection Matrix:"); E2D_LOG_INFO(" {:.4f} {:.4f} {:.4f} {:.4f}", m[0], m[4], m[8], m[12]); E2D_LOG_INFO(" {:.4f} {:.4f} {:.4f} {:.4f}", m[1], m[5], m[9], m[13]); E2D_LOG_INFO(" {:.4f} {:.4f} {:.4f} {:.4f}", m[2], m[6], m[10], m[14]); E2D_LOG_INFO(" {:.4f} {:.4f} {:.4f} {:.4f}", m[3], m[7], m[11], m[15]); logged = true; } events::OnRenderSetCamera::emit(viewProj); } runningScene_->render(); } } // namespace extra2d