#pragma once #include #include #include #include #include #include #include #include #include #include namespace extra2d { /** * @brief 窗口事件回调 */ using ResizeCb = std::function; using CloseCb = std::function; /** * @brief 窗口模块 - OpenGL ES 3.2 版本 * * 管理 SDL2 窗口,支持 OpenGL ES 3.2 渲染 * 使用新的 Module 基类,支持自动注册 */ class WindowModule : public Module { // 自动注册到模块系统,优先级为 0(最先初始化) E2D_REGISTER_MODULE(WindowModule, "Window", 0) public: WindowModule(); ~WindowModule() override; // 禁止拷贝和移动 WindowModule(const WindowModule &) = delete; WindowModule &operator=(const WindowModule &) = delete; WindowModule(WindowModule &&) = delete; WindowModule &operator=(WindowModule &&) = delete; // Module 接口实现 bool init() override; void shutdown() override; /** * @brief 使用配置创建窗口 */ bool create(const WindowCfg &cfg); /** * @brief 处理窗口事件 * @return true 继续运行,false 应退出 */ bool pollEvents(); /** * @brief 获取 SDL 窗口句柄 */ SDL_Window *handle() const { return window_; } /** * @brief 获取窗口尺寸 */ Size getSize() const; /** * @brief 获取窗口位置 */ Vec2 getPosition() const; /** * @brief 设置窗口尺寸 */ void setSize(int32 w, int32 h); /** * @brief 设置窗口标题 */ void setTitle(const std::string &title); /** * @brief 设置全屏模式 */ void setFullscreen(bool fullscreen); /** * @brief 检查是否全屏 */ bool isFullscreen() const; /** * @brief 显示/隐藏窗口 */ void setVisible(bool visible); /** * @brief 检查窗口是否可见 */ bool isVisible() const; /** * @brief 设置窗口关闭回调 */ void setOnClose(CloseCb cb) { onClose_ = std::move(cb); } /** * @brief 设置窗口大小改变回调 */ void setOnResize(ResizeCb cb) { onResize_ = std::move(cb); } /** * @brief 请求关闭窗口 */ void requestClose() { shouldClose_ = true; } /** * @brief 检查是否应该关闭 */ bool shouldClose() const { return shouldClose_; } private: void handleWindowEvent(const SDL_WindowEvent &evt); /** * @brief 监听模块配置事件 * @param config 应用配置对象 * * 处理 AppConfig 类型的配置,创建窗口 */ void onModuleConfig(const AppConfig &config); /** * @brief 监听渲染呈现事件 * * 当渲染完成时调用 swapBuffers 呈现渲染结果 */ void onRenderPresent(); SDL_Window *window_ = nullptr; bool shouldClose_ = false; CloseCb onClose_; ResizeCb onResize_; // 模块配置事件监听器 std::unique_ptr::Listener> configListener_; // 渲染呈现事件监听器 std::unique_ptr renderPresentListener_; }; } // namespace extra2d