Add WindowManager Class

This commit is contained in:
2025-12-06 10:24:54 +08:00
parent eaf7ea27f7
commit db87a54e8b
2 changed files with 98 additions and 0 deletions

View File

@@ -0,0 +1,69 @@
#include "WindowManager.h"
WindowManager::WindowManager() : m_renderer(nullptr),
m_window(nullptr)
{
}
WindowManager::~WindowManager() {
Shutdown();
}
bool WindowManager::Initialize(GameConfig& config) {
m_width = config.windowWidth;
m_height = config.windowHeight;
// 创建窗口支持高DPI和横屏[3,4](@ref)
m_window = SDL_CreateWindow(
"孢子棋", // 窗口标题,显示在标题栏上
m_width, // 窗口的逻辑宽度(例如 800用于统一布局不受屏幕 DPI 影响
m_height, // 窗口的逻辑高度(例如 600
SDL_WINDOW_HIGH_PIXEL_DENSITY | // 启用高像素密度支持HiDPI/Retina确保在高分屏上画面清晰
SDL_WINDOW_RESIZABLE // 允许用户调整窗口大小(可拉伸)
);
if (!m_window) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"创建窗口失败: %s", SDL_GetError());
return false;
}
// 创建渲染器
m_renderer = SDL_CreateRenderer(m_window, nullptr); //自动选择合适渲染器,开启硬件加速和垂直同步
if (!m_renderer) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
"创建渲染器失败: %s", SDL_GetError());
return false;
}
// 设置逻辑呈现模式,实现分辨率自适应[3](@ref)
SDL_SetRenderLogicalPresentation(m_renderer,
m_width,
m_height,
SDL_LOGICAL_PRESENTATION_LETTERBOX);
SDL_SetWindowSize(m_window, m_width, m_height);
return true;
}
void WindowManager::Shutdown() {
if (m_renderer) SDL_DestroyRenderer(m_renderer);
if (m_window) SDL_DestroyWindow(m_window);
}
void WindowManager::Clear() {
// 设置画笔颜色
SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 255);
// 使用画笔颜色填充整个屏幕
SDL_RenderClear(m_renderer);
}
void WindowManager::Present() {
SDL_RenderPresent(m_renderer);
}
SDL_Renderer* WindowManager::GetRenderer() {
return m_renderer;
}
SDL_Window* WindowManager::GetWindow() {
return m_window;
}

29
src/core/WindowManager.h Normal file
View File

@@ -0,0 +1,29 @@
#pragma once
#include<SDL3/SDL.h>
#include "utils/Config.h"
class WindowManager {
public:
WindowManager();
~WindowManager();
// 初始化
bool Initialize(GameConfig& config);
//关闭
void Shutdown();
//清理上一帧窗口
void Clear();
//呈现窗口
void Present();
SDL_Renderer* GetRenderer();
SDL_Window* GetWindow();
private:
SDL_Window* m_window;
SDL_Renderer* m_renderer;
int m_width;
int m_height;
};