mirror of
https://github.com/zhenyan121/SporeBG-Conid.git
synced 2026-04-10 06:14:08 +08:00
Added UI RenderTexture
This commit is contained in:
@@ -60,6 +60,7 @@ SDL_AppResult GameApplication::handleInputEvent(SDL_Event* event) {
|
|||||||
m_windowManager->setFullscreen(input.isFullscreen);
|
m_windowManager->setFullscreen(input.isFullscreen);
|
||||||
// 改变窗口时清理旧的缓存
|
// 改变窗口时清理旧的缓存
|
||||||
if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
|
if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
|
||||||
|
m_windowManager->onWindowResize();
|
||||||
m_textRenderer->clearCache();
|
m_textRenderer->clearCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,7 +58,17 @@ bool WindowManager::Initialize(Config& config) {
|
|||||||
);
|
);
|
||||||
// 设置纹理缩放模式为最近邻
|
// 设置纹理缩放模式为最近邻
|
||||||
SDL_SetTextureScaleMode(m_logicalTexture, SDL_SCALEMODE_NEAREST);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,14 +83,11 @@ void WindowManager::Clear() {
|
|||||||
SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 255);
|
SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 255);
|
||||||
SDL_RenderClear(m_renderer);
|
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;
|
//SDL_FRect dstRect;
|
||||||
//calculateDstRect(dstRect);
|
//calculateDstRect(dstRect);
|
||||||
|
|
||||||
|
SDL_FRect textDis = {
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
static_cast<float> (m_viewport.windowWidth),
|
||||||
|
static_cast<float> (m_viewport.windowHeight)
|
||||||
|
};
|
||||||
|
|
||||||
SDL_RenderTexture (
|
SDL_RenderTexture (
|
||||||
m_renderer,
|
m_renderer,
|
||||||
m_logicalTexture, // 源:你已经画好的逻辑画布
|
m_logicalTexture, // 源:你已经画好的逻辑画布
|
||||||
nullptr, // srcRect:源区域(nullptr = 整张)
|
nullptr, // srcRect:源区域(nullptr = 整张)
|
||||||
&m_viewport.dst // dstRect:贴到哪里 & 贴多大
|
&m_viewport.dst // dstRect:贴到哪里 & 贴多大
|
||||||
);
|
);
|
||||||
|
SDL_RenderTexture (
|
||||||
|
m_renderer,
|
||||||
|
m_textTexture,
|
||||||
|
nullptr,
|
||||||
|
&textDis
|
||||||
|
);
|
||||||
SDL_RenderPresent(m_renderer);
|
SDL_RenderPresent(m_renderer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void WindowManager::beginWorld() {
|
void WindowManager::beginWorld() {
|
||||||
// 设置渲染目标为逻辑纹理
|
// 设置渲染目标为逻辑纹理
|
||||||
|
// 清除逻辑纹理(世界层)
|
||||||
SDL_SetRenderTarget(m_renderer, m_logicalTexture);
|
SDL_SetRenderTarget(m_renderer, m_logicalTexture);
|
||||||
|
SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 255);
|
||||||
|
SDL_RenderClear(m_renderer);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowManager::endWorld() {
|
void WindowManager::endWorld() {
|
||||||
|
SDL_SetRenderTarget(m_renderer, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowManager::beginUI() {
|
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() {
|
void WindowManager::endUI() {
|
||||||
@@ -214,6 +239,17 @@ void WindowManager::onWindowResize() {
|
|||||||
// - scale 可供所有系统使用
|
// - scale 可供所有系统使用
|
||||||
// - dst 是渲染 & 输入转换的唯一依据
|
// - dst 是渲染 & 输入转换的唯一依据
|
||||||
// - windowSize 不需要再到处 SDL_GetWindowSize
|
// - 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 {
|
Viewport const& WindowManager::getViewport() const {
|
||||||
|
|||||||
@@ -29,6 +29,10 @@ public:
|
|||||||
SDL_Renderer* GetRenderer();
|
SDL_Renderer* GetRenderer();
|
||||||
SDL_Window* GetWindow();
|
SDL_Window* GetWindow();
|
||||||
|
|
||||||
|
// 计算缩放后的目标矩形
|
||||||
|
//void calculateDstRect(SDL_FRect& dstRect);
|
||||||
|
void onWindowResize();
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SDL_Window* m_window;
|
SDL_Window* m_window;
|
||||||
@@ -40,8 +44,5 @@ private:
|
|||||||
//int m_windowHeight;
|
//int m_windowHeight;
|
||||||
bool m_isFullscreen = false;
|
bool m_isFullscreen = false;
|
||||||
SDL_Texture* m_logicalTexture = nullptr;
|
SDL_Texture* m_logicalTexture = nullptr;
|
||||||
// 计算缩放后的目标矩形
|
SDL_Texture* m_textTexture = nullptr;
|
||||||
//void calculateDstRect(SDL_FRect& dstRect);
|
|
||||||
void onWindowResize();
|
|
||||||
|
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user