From db87a54e8b565e0bbd02d07239e6ba742a67c5f2 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Sat, 6 Dec 2025 10:24:54 +0800 Subject: [PATCH] Add WindowManager Class --- src/core/WindowManager.cpp | 69 ++++++++++++++++++++++++++++++++++++++ src/core/WindowManager.h | 29 ++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 src/core/WindowManager.cpp create mode 100644 src/core/WindowManager.h diff --git a/src/core/WindowManager.cpp b/src/core/WindowManager.cpp new file mode 100644 index 0000000..c665543 --- /dev/null +++ b/src/core/WindowManager.cpp @@ -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; +} \ No newline at end of file diff --git a/src/core/WindowManager.h b/src/core/WindowManager.h new file mode 100644 index 0000000..3323395 --- /dev/null +++ b/src/core/WindowManager.h @@ -0,0 +1,29 @@ +#pragma once +#include +#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; + +}; \ No newline at end of file