From 10d9988f9900dd3cf835afce21b410daadf0d9ea Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Thu, 25 Dec 2025 13:06:30 +0800 Subject: [PATCH] Added UI RenderTexture --- src/core/GameApplication.cpp | 1 + src/core/WindowManager.cpp | 52 ++++++++++++++++++++++++++++++------ src/core/WindowManager.h | 9 ++++--- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/src/core/GameApplication.cpp b/src/core/GameApplication.cpp index bab9ca5..566254f 100644 --- a/src/core/GameApplication.cpp +++ b/src/core/GameApplication.cpp @@ -60,6 +60,7 @@ SDL_AppResult GameApplication::handleInputEvent(SDL_Event* event) { m_windowManager->setFullscreen(input.isFullscreen); // 改变窗口时清理旧的缓存 if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) { + m_windowManager->onWindowResize(); m_textRenderer->clearCache(); } diff --git a/src/core/WindowManager.cpp b/src/core/WindowManager.cpp index e1d3aff..7109885 100644 --- a/src/core/WindowManager.cpp +++ b/src/core/WindowManager.cpp @@ -58,7 +58,17 @@ bool WindowManager::Initialize(Config& config) { ); // 设置纹理缩放模式为最近邻 SDL_SetTextureScaleMode(m_logicalTexture, SDL_SCALEMODE_NEAREST); - + + + // 创建文本渲染层 + m_textTexture = SDL_CreateTexture( + m_renderer, + SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, + m_viewport.windowWidth, + m_viewport.windowHeight + ); + return true; } @@ -73,14 +83,11 @@ void WindowManager::Clear() { SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 255); SDL_RenderClear(m_renderer); - // 清除逻辑纹理(世界层) - SDL_SetRenderTarget(m_renderer, m_logicalTexture); - SDL_SetRenderDrawColor(m_renderer, 0, 0, 0, 0); // 透明黑色 - SDL_RenderClear(m_renderer); + - onWindowResize(); + } /* @@ -101,29 +108,47 @@ void WindowManager::Present() { //SDL_FRect dstRect; //calculateDstRect(dstRect); + SDL_FRect textDis = { + 0.0f, + 0.0f, + static_cast (m_viewport.windowWidth), + static_cast (m_viewport.windowHeight) + }; + SDL_RenderTexture ( m_renderer, m_logicalTexture, // 源:你已经画好的逻辑画布 nullptr, // srcRect:源区域(nullptr = 整张) &m_viewport.dst // dstRect:贴到哪里 & 贴多大 ); + SDL_RenderTexture ( + m_renderer, + m_textTexture, + nullptr, + &textDis + ); SDL_RenderPresent(m_renderer); } void WindowManager::beginWorld() { // 设置渲染目标为逻辑纹理 + // 清除逻辑纹理(世界层) SDL_SetRenderTarget(m_renderer, m_logicalTexture); + SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 255); + SDL_RenderClear(m_renderer); } void WindowManager::endWorld() { - + SDL_SetRenderTarget(m_renderer, nullptr); } void WindowManager::beginUI() { // 设置渲染目标为窗口 - SDL_SetRenderTarget(m_renderer, nullptr); + SDL_SetRenderTarget(m_renderer, m_textTexture); + SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 0); + SDL_RenderClear(m_renderer); } void WindowManager::endUI() { @@ -214,6 +239,17 @@ void WindowManager::onWindowResize() { // - scale 可供所有系统使用 // - dst 是渲染 & 输入转换的唯一依据 // - windowSize 不需要再到处 SDL_GetWindowSize + + // 创建文本渲染层 + SDL_DestroyTexture(m_textTexture); + m_textTexture = SDL_CreateTexture( + m_renderer, + SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, + m_viewport.windowWidth, + m_viewport.windowHeight + ); + } Viewport const& WindowManager::getViewport() const { diff --git a/src/core/WindowManager.h b/src/core/WindowManager.h index 4a5823c..29e7c66 100644 --- a/src/core/WindowManager.h +++ b/src/core/WindowManager.h @@ -29,6 +29,10 @@ public: SDL_Renderer* GetRenderer(); SDL_Window* GetWindow(); + // 计算缩放后的目标矩形 + //void calculateDstRect(SDL_FRect& dstRect); + void onWindowResize(); + private: SDL_Window* m_window; @@ -40,8 +44,5 @@ private: //int m_windowHeight; bool m_isFullscreen = false; SDL_Texture* m_logicalTexture = nullptr; - // 计算缩放后的目标矩形 - //void calculateDstRect(SDL_FRect& dstRect); - void onWindowResize(); - + SDL_Texture* m_textTexture = nullptr; }; \ No newline at end of file