Frostbite2D/Fostbite2D/include/fostbite2D/platform/window.h

270 lines
5.3 KiB
C
Raw Normal View History

2026-02-17 13:38:56 +08:00
#pragma once
#include <SDL2/SDL.h>
#include <fostbite2D/core/math_types.h>
#include <fostbite2D/core/types.h>
namespace frostbite2D {
/**
* \~chinese
* @brief
*/
enum class CursorType {
Arrow, ///< 指针
TextInput, ///< 文本
Hand, ///< 手
SizeAll, ///< 指向四个方向的箭头
SizeWE, ///< 指向左右方向的箭头
SizeNS, ///< 指向上下方向的箭头
SizeNESW, ///< 指向左下到右上方向的箭头
SizeNWSE, ///< 指向左上到右下方向的箭头
No, ///< 禁止
};
/**
* \~chinese
* @brief
*/
struct Resolution {
uint32_t width = 0; ///< 分辨率宽度
uint32_t height = 0; ///< 分辨率高度
uint32_t refresh_rate = 0; ///< 刷新率
Resolution() = default;
Resolution(uint32_t width, uint32_t height, uint32_t refresh_rate)
: width(width), height(height), refresh_rate(refresh_rate) {}
};
/**
* \~chinese
* @brief
*/
struct Icon {
Icon() = default;
Icon(std::string file_path) : file_path(file_path) {}
std::string file_path; ///< 文件路径
#if defined(_WIN32)
uint32_t resource_id = 0; ///< 资源ID仅在windows上生效
Icon(uint32_t resource_id) : resource_id(resource_id) {}
#endif
};
/**
* \~chinese
* @brief
*/
struct WindowConfig {
uint32_t width = 640; ///< 窗口宽度
uint32_t height = 480; ///< 窗口高度
std::string title = "fostbite2D Game"; ///< 窗口标题
Icon icon; ///< 窗口图标
bool resizable = false; ///< 窗口大小可调整
bool fullscreen = false; ///< 窗口全屏
bool borderless = false; ///< 无边框窗口
bool decorated = true; ///< 窗口装饰
int multisamples = 0; ///< 多重采样数
bool centered = true; ///< 窗口是否居中
bool vsync = true; ///< 是否启用垂直同步
bool showCursor = true; ///< 是否显示光标
};
class Window {
public:
Window() = default;
virtual ~Window() = default;
/**
* @brief
* @param cfg
* @return
*/
virtual bool create(const WindowConfig &cfg);
/**
* @brief
*/
virtual void destroy();
/**
* @brief
*/
virtual void poll();
/**
* @brief
*/
virtual void swap();
/**
* @brief
*/
virtual void close();
/**
* @brief
*/
virtual void setTitle(const std::string &title);
/**
* @brief
*/
virtual void setSize(int w, int h);
/**
* @brief
*/
virtual void setPos(int x, int y);
/**
* @brief
*/
virtual void setFullscreen(bool fs);
/**
* @brief
*/
virtual void setVSync(bool vsync);
/**
* @brief
*/
virtual void setVisible(bool visible);
/**
* @brief
*/
virtual int width() const;
/**
* @brief
*/
virtual int height() const;
/**
* @brief
*/
virtual Size size() const;
/**
* @brief
*/
virtual Vec2 pos() const;
/**
* @brief
*/
virtual bool fullscreen() const;
/**
* @brief
*/
virtual bool vsync() const;
/**
* @brief
*/
virtual bool focused() const;
/**
* @brief
*/
virtual bool minimized() const;
/**
* @brief X
*/
virtual float scaleX() const;
/**
* @brief Y
*/
virtual float scaleY() const;
/**
* @brief
*/
virtual void setCursor(CursorType cursor);
/**
* @brief /
*/
virtual void showCursor(bool show);
/**
* @brief /
*/
virtual void lockCursor(bool lock);
/**
* @brief
*/
using ResizeCb = std::function<void(int, int)>;
/**
* @brief
*/
using CloseCb = std::function<void()>;
/**
* @brief
*/
using FocusCb = std::function<void(bool)>;
/**
* @brief
*/
virtual void onResize(ResizeCb cb);
/**
* @brief
*/
virtual void onClose(CloseCb cb);
/**
* @brief
*/
virtual void onFocus(FocusCb cb);
/**
* @brief
*/
virtual void *native() const;
/**
* @brief SDL
*/
SDL_Window *sdlWindow() const { return sdlWindow_; }
/**
* @brief OpenGL
*/
SDL_GLContext glContext() const { return glContext_; }
private:
SDL_Window *sdlWindow_ = nullptr;
SDL_GLContext glContext_ = nullptr;
int width_ = 1280;
int height_ = 720;
bool fullscreen_ = false;
bool vsync_ = true;
bool focused_ = true;
bool minimized_ = false;
bool shouldClose_ = false;
float scaleX_ = 1.0f;
float scaleY_ = 1.0f;
bool cursorVisible_ = true;
bool cursorLocked_ = false;
ResizeCb resizeCb_;
CloseCb closeCb_;
FocusCb focusCb_;
};
} // namespace frostbite2D