更名完成
This commit is contained in:
parent
8619316289
commit
c94e43089b
|
|
@ -1,567 +0,0 @@
|
||||||
# Frostbite2D 引擎架构说明
|
|
||||||
|
|
||||||
## 1. 整体架构图
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ 用户应用层 (main.cpp) │
|
|
||||||
│ 创建配置 → 初始化应用 → 游戏循环 → 清理 │
|
|
||||||
└─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ 应用程序层 (Application) │
|
|
||||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
||||||
│ │ 单例管理 │ │ 模块系统 │ │ 时间管理 │ │ 窗口管理 │ │
|
|
||||||
│ │ get() │ │ use/init │ │ deltaTime() │ │ Window │ │
|
|
||||||
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|
||||||
│ │ │
|
|
||||||
│ ┌───────────┴───────────┐ │
|
|
||||||
│ ▼ ▼ │
|
|
||||||
│ mainLoop() ────────► update()/render() │
|
|
||||||
└─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
┌────────────────────────────┼────────────────────────────┐
|
|
||||||
│ │ │
|
|
||||||
▼ ▼ ▼
|
|
||||||
┌─────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐
|
|
||||||
│ 渲染系统 │ │ 着色器系统 │ │ 输入系统 │
|
|
||||||
│ (GLRenderer) │◄────►│ (ShaderManager) │ │ (SDL Events) │
|
|
||||||
└─────────────────┘ └─────────────────────┘ └─────────────────────┘
|
|
||||||
|
|
||||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ 渲染核心层 │
|
|
||||||
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ ┌───────────┐ │
|
|
||||||
│ │ 2D图形绘制 │ │ 精灵批处理 │ │ 字体渲染 │ │ 相机 │ │
|
|
||||||
│ │ drawRect() │ │ GLSpriteBatch │ │ GLFontAtlas │ │ Camera │ │
|
|
||||||
│ │ fillCircle() │ │ 10000 sprites │ │ stb_truetype │ │ view/proj │ │
|
|
||||||
│ │ drawLine() │ │ drawSprite() │ │ cache glyphs │ │ move/zoom │ │
|
|
||||||
│ │ drawText() │ │ endBatch() │ │ measureText() │ │ │ │
|
|
||||||
│ └────────────────┘ └────────────────┘ └────────────────┘ └───────────┘ │
|
|
||||||
│ │
|
|
||||||
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
|
|
||||||
│ │ 纹理管理 │ │ 着色器实现 │ │ OpenGL资源 │ │
|
|
||||||
│ │ GLTexture │ │ GLShader │ │ VAO/VBO │ │
|
|
||||||
│ │ load from file│ │ vertex/frag │ │ shape/line │ │
|
|
||||||
│ └────────────────┘ └────────────────┘ └────────────────┘ │
|
|
||||||
└─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ 平台抽象层 │
|
|
||||||
│ ┌─────────────────────────┐ ┌─────────────────────────────────────┐ │
|
|
||||||
│ │ Window 窗口 │ │ SDL2 跨平台库 │ │
|
|
||||||
│ │ - 创建/销毁窗口 │ │ 窗口管理 | 事件处理 | OpenGL上下文 │ │
|
|
||||||
│ │ - OpenGL 上下文 │ │ │ │
|
|
||||||
│ │ - 事件轮询 │ │ 支持: Windows | Linux | macOS │ │
|
|
||||||
│ │ - 交换缓冲区 │ │ Android | iOS | Switch │ │
|
|
||||||
│ └─────────────────────────┘ └─────────────────────────────────────┘ │
|
|
||||||
└─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ 第三方库 │
|
|
||||||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
|
|
||||||
│ │ OpenGL │ │ SDL2 │ │ GLAD │ │ GLM │ │ stb_truetype │ │
|
|
||||||
│ │ ES 3.2 │ │ 2.32.2 │ │ Loader │ │ 1.0.3 │ │ rect_pack │ │
|
|
||||||
│ │ 图形API │ │ 窗口/输入 │ │ 函数加载 │ │ 数学库 │ │ 字体渲染 │ │
|
|
||||||
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────────┘ │
|
|
||||||
└─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## 2. 模块详细说明
|
|
||||||
|
|
||||||
### 2.1 应用程序层 (Application)
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────┐
|
|
||||||
│ Application 单例 │
|
|
||||||
├─────────────────────────────────────────┤
|
|
||||||
│ + get() : Application& │
|
|
||||||
│ + init(config) : bool │
|
|
||||||
│ + run() : void │
|
|
||||||
│ + quit() : void │
|
|
||||||
│ + deltaTime() : float │
|
|
||||||
│ + fps() : int │
|
|
||||||
├─────────────────────────────────────────┤
|
|
||||||
│ - window_ : Window* │
|
|
||||||
│ - modules_ : vector<Module*> │
|
|
||||||
│ - running_ : bool │
|
|
||||||
│ - deltaTime_ : float │
|
|
||||||
│ - currentFps_ : int │
|
|
||||||
└─────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
**生命周期流程:**
|
|
||||||
```
|
|
||||||
main()
|
|
||||||
│
|
|
||||||
├─► AppConfig config = AppConfig::createDefault()
|
|
||||||
│
|
|
||||||
├─► Application::get().init(config)
|
|
||||||
│ ├─► 创建 Window
|
|
||||||
│ ├─► 初始化 SDL
|
|
||||||
│ └─► 初始化 GLAD (OpenGL 函数加载)
|
|
||||||
│
|
|
||||||
├─► ShaderManager::getInstance().init(factory)
|
|
||||||
│ ├─► 加载 sprite shader
|
|
||||||
│ └─► 加载 shape shader
|
|
||||||
│
|
|
||||||
├─► GLRenderer.init(window)
|
|
||||||
│ ├─► 创建 VAO/VBO
|
|
||||||
│ ├─► 初始化 SpriteBatch
|
|
||||||
│ └─► 设置 OpenGL 状态
|
|
||||||
│
|
|
||||||
├─► 游戏主循环
|
|
||||||
│ ├─► 处理输入事件 (SDL_PollEvent)
|
|
||||||
│ ├─► renderer.beginFrame(color) // 清除缓冲区
|
|
||||||
│ ├─► 绘制图形
|
|
||||||
│ │ ├─► fillRect() 填充矩形
|
|
||||||
│ │ ├─► fillCircle() 填充圆形
|
|
||||||
│ │ ├─► drawLine() 绘制线条
|
|
||||||
│ │ ├─► drawText() 绘制文字
|
|
||||||
│ │ └─► ...
|
|
||||||
│ ├─► renderer.endFrame() // 提交批次
|
|
||||||
│ └─► SDL_GL_SwapWindow() // 显示到屏幕
|
|
||||||
│
|
|
||||||
├─► 清理资源
|
|
||||||
│ ├─► renderer.shutdown()
|
|
||||||
│ ├─► ShaderManager::shutdown()
|
|
||||||
│ └─► Application::shutdown()
|
|
||||||
│
|
|
||||||
└─► return 0
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2.2 渲染系统 (GLRenderer)
|
|
||||||
|
|
||||||
**核心功能:**
|
|
||||||
|
|
||||||
| 功能类别 | 方法 | 说明 |
|
|
||||||
|---------|------|------|
|
|
||||||
| **帧管理** | `beginFrame()` / `endFrame()` | 开始/结束渲染帧 |
|
|
||||||
| **2D形状** | `fillRect()` / `drawRect()` | 填充/描边矩形 |
|
|
||||||
| **圆形** | `fillCircle()` / `drawCircle()` | 填充/描边圆形 |
|
|
||||||
| **线条** | `drawLine()` | 绘制线段 |
|
|
||||||
| **三角形** | `fillTriangle()` / `drawTriangle()` | 填充/描边三角形 |
|
|
||||||
| **多边形** | `fillPolygon()` / `drawPolygon()` | 填充/描边多边形 |
|
|
||||||
| **精灵** | `drawSprite()` | 绘制纹理精灵 |
|
|
||||||
| **文字** | `drawText()` | 渲染文字 |
|
|
||||||
| **变换** | `pushTransform()` / `popTransform()` | 矩阵变换栈 |
|
|
||||||
| **视口** | `setViewport()` | 设置渲染区域 |
|
|
||||||
| **混合** | `setBlendMode()` | 设置混合模式 |
|
|
||||||
|
|
||||||
**渲染管线:**
|
|
||||||
|
|
||||||
```
|
|
||||||
┌──────────────┐ ┌────────────────────────────────────────────────┐
|
|
||||||
│ drawRect() │────►│ │
|
|
||||||
└──────────────┘ │ 形状批处理缓冲区 │
|
|
||||||
┌──────────────┐ │ shapeVertexCache_[MAX_SHAPE_VERTICES] │
|
|
||||||
│ fillCircle() │────►│ │
|
|
||||||
└──────────────┘ │ 顶点格式: {x, y, r, g, b, a} │
|
|
||||||
┌──────────────┐ │ │
|
|
||||||
│fillTriangle()│────►│ 当缓冲区满或模式改变时: flushShapeBatch() │
|
|
||||||
└──────────────┘ │ │
|
|
||||||
└────────────────────┬───────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌────────────────────────────────────────────────┐
|
|
||||||
│ 线条批处理缓冲区 │
|
|
||||||
│ lineVertexCache_[MAX_LINE_VERTICES] │
|
|
||||||
│ │
|
|
||||||
│ 绘制模式: GL_LINES (每线条2顶点) │
|
|
||||||
│ 支持线宽设置 │
|
|
||||||
└────────────────────┬───────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌────────────────────────────────────────────────┐
|
|
||||||
│ 精灵批处理系统 │
|
|
||||||
│ GLSpriteBatch (10000精灵) │
|
|
||||||
│ │
|
|
||||||
│ 图集纹理 → 顶点数据 → VBO → GPU 批量绘制 │
|
|
||||||
│ │
|
|
||||||
│ beginSpriteBatch() → drawSprite() → endBatch()│
|
|
||||||
└────────────────────┬───────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌────────────────────────────────────────────────┐
|
|
||||||
│ OpenGL 渲染 │
|
|
||||||
│ │
|
|
||||||
│ glDrawArrays(GL_TRIANGLES, ...) │
|
|
||||||
│ glDrawArrays(GL_LINES, ...) │
|
|
||||||
└────────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2.3 着色器系统 (ShaderManager)
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────────────────────────────┐
|
|
||||||
│ ShaderManager 单例 │
|
|
||||||
├─────────────────────────────────────────────────────────────────┤
|
|
||||||
│ │
|
|
||||||
│ ┌──────────────┐ ┌────────────────────────────────────┐ │
|
|
||||||
│ │ IShader │◄───┤ GLShader (OpenGL实现) │ │
|
|
||||||
│ │ 接口 │ │ - 编译 vertex/fragment shader │ │
|
|
||||||
│ │ │ │ - 创建 program │ │
|
|
||||||
│ │ bind() │ │ - 设置 uniform │ │
|
|
||||||
│ │ setUniform() │ │ - 绑定/解绑 │ │
|
|
||||||
│ └──────────────┘ └────────────────────────────────────┘ │
|
|
||||||
│ ▲ │
|
|
||||||
│ │ │
|
|
||||||
│ ┌──────────────┐ ┌────────────────────────────────────┐ │
|
|
||||||
│ │ IShaderFactory│◄──┤ GLShaderFactory │ │
|
|
||||||
│ │ 工厂接口 │ │ - createShader() │ │
|
|
||||||
│ │ │ │ - 创建 OpenGL Shader 实例 │ │
|
|
||||||
│ └──────────────┘ └────────────────────────────────────┘ │
|
|
||||||
│ │
|
|
||||||
│ 管理: unordered_map<string, ShaderInfo> shaders_ │
|
|
||||||
│ │
|
|
||||||
└─────────────────────────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
**内置着色器:**
|
|
||||||
|
|
||||||
| 着色器 | 文件 | 用途 |
|
|
||||||
|-------|------|------|
|
|
||||||
| **sprite** | sprite.vert / sprite.frag | 纹理精灵渲染 (支持颜色混合) |
|
|
||||||
| **shape** | shape.vert / shape.frag | 2D形状渲染 (顶点颜色) |
|
|
||||||
|
|
||||||
### 2.4 字体渲染 (GLFontAtlas)
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────────────────────────────┐
|
|
||||||
│ 字体图集系统 │
|
|
||||||
├─────────────────────────────────────────────────────────────────┤
|
|
||||||
│ │
|
|
||||||
│ 初始化流程: │
|
|
||||||
│ ┌───────────┐ ┌───────────┐ ┌──────────────────────┐ │
|
|
||||||
│ │ 加载字体 │───►│ 初始化stb │───►│ 创建 1024x1024 图集 │ │
|
|
||||||
│ │ 文件(.ttf)│ │ _truetype │ │ 纹理 (RGBA) │ │
|
|
||||||
│ └───────────┘ └───────────┘ └──────────────────────┘ │
|
|
||||||
│ │ │
|
|
||||||
│ 渲染字符时: │ │
|
|
||||||
│ ┌───────────┐ ┌───────────┐ ┌────────▼──────────┐ │
|
|
||||||
│ │ 字符查缓存 │───►│ 缓存未命中 │───►│ stbtt_MakeCodepoint│ │
|
|
||||||
│ │ │ │ │ │ _Bitmap() 栅格化 │ │
|
|
||||||
│ └─────┬─────┘ └───────────┘ └────────┬──────────┘ │
|
|
||||||
│ │ │ │
|
|
||||||
│ │ ┌───────────┐ ┌─────────▼──────────┐ │
|
|
||||||
│ └────────►│ 返回字形 │◄───│ stb_rect_pack 打包 │ │
|
|
||||||
│ │ 信息 │ │ 到图集纹理 │ │
|
|
||||||
│ └───────────┘ └────────────────────┘ │
|
|
||||||
│ │
|
|
||||||
│ Glyph 信息: │
|
|
||||||
│ - 尺寸 (width, height) │
|
|
||||||
│ - 偏移 (bearingX, bearingY) │
|
|
||||||
│ - 步进 (advance) │
|
|
||||||
│ - 纹理坐标 (u0, v0, u1, v1) │
|
|
||||||
│ │
|
|
||||||
└─────────────────────────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2.5 相机系统 (Camera)
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────┐
|
|
||||||
│ Camera 相机 │
|
|
||||||
├─────────────────────────────────────────┤
|
|
||||||
│ │
|
|
||||||
│ 视口配置: │
|
|
||||||
│ ┌─────────────────────────────────┐ │
|
|
||||||
│ │ left = 0 │ │
|
|
||||||
│ │ right = 800 ─────────────── │ │
|
|
||||||
│ │ top = 0 │ │ │ │
|
|
||||||
│ │ bottom = 600 │ 世界坐标 │ │ │
|
|
||||||
│ │ │ │ │ │
|
|
||||||
│ │ 默认位置(0,0) │ │ │ │
|
|
||||||
│ │ 看向左上角 └─────────────┘ │ │
|
|
||||||
│ │ 视口 (0,0) │ │
|
|
||||||
│ └─────────────────────────────────┘ │
|
|
||||||
│ │
|
|
||||||
│ 变换矩阵: │
|
|
||||||
│ ┌───────────────┐ │
|
|
||||||
│ │ viewMatrix │ 视图矩阵 (相机位置) │
|
|
||||||
│ ├───────────────┤ │
|
|
||||||
│ │ projMatrix │ 正交投影矩阵 │
|
|
||||||
│ ├───────────────┤ │
|
|
||||||
│ │ viewProj │ view * projection │
|
|
||||||
│ └───────────────┘ │
|
|
||||||
│ │
|
|
||||||
│ 控制: │
|
|
||||||
│ - move(x, y) 移动相机 │
|
|
||||||
│ - setZoom(z) 设置缩放 │
|
|
||||||
│ - setPosition() 设置位置 │
|
|
||||||
│ │
|
|
||||||
└─────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2.6 模块系统 (Module)
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────┐
|
|
||||||
│ Module 模块基类 │
|
|
||||||
├─────────────────────────────────────────┤
|
|
||||||
│ + setupModule() 初始化 │
|
|
||||||
│ + destroyModule() 销毁 │
|
|
||||||
│ + onUpdate() 每帧更新 │
|
|
||||||
│ + beforeRender() 渲染前 │
|
|
||||||
│ + onRender() 渲染时 │
|
|
||||||
│ + afterRender() 渲染后 │
|
|
||||||
│ + handleEvent() 事件处理 │
|
|
||||||
│ + getName() 模块名称 │
|
|
||||||
│ + getPriority() 优先级 (越小越优先) │
|
|
||||||
└─────────────────────────────────────────┘
|
|
||||||
▲
|
|
||||||
│ 继承
|
|
||||||
┌──────────────┼──────────────┐
|
|
||||||
│ │ │
|
|
||||||
┌───┴───┐ ┌─────┴─────┐ ┌────┴────┐
|
|
||||||
│渲染模块│ │ 物理模块 │ │音频模块 │
|
|
||||||
│ │ │ │ │ │
|
|
||||||
└───────┘ └───────────┘ └─────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## 3. 数据流图
|
|
||||||
|
|
||||||
### 3.1 一帧的渲染流程
|
|
||||||
|
|
||||||
```
|
|
||||||
┌──────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ 游戏主循环 │
|
|
||||||
└─────────────────────────────────┬────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌──────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ ① 处理输入事件 │
|
|
||||||
│ SDL_PollEvent() → 键盘/鼠标事件 → 更新相机/游戏逻辑 │
|
|
||||||
└─────────────────────────────────┬────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌──────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ ② 开始新帧 (beginFrame) │
|
|
||||||
│ glClear() 清除颜色缓冲区 + 重置渲染统计 │
|
|
||||||
└─────────────────────────────────┬────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌──────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ ③ 设置渲染状态 │
|
|
||||||
│ setViewport() + setViewProjection(camera.getViewProjectionMatrix)│
|
|
||||||
└─────────────────────────────────┬────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌──────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ ④ 绘制各种图形 │
|
|
||||||
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
|
|
||||||
│ │ fillRect() │ │fillCircle() │ │ drawLine() │ │drawSprite() │ │
|
|
||||||
│ │ │ │ │ │ │ │ │ │
|
|
||||||
│ │ 顶点数据 ──►│ │ 顶点数据 ──►│ │ 顶点数据 ──►│ │ 精灵数据 ──►│ │
|
|
||||||
│ │ 形状缓冲区 │ │ 形状缓冲区 │ │ 线条缓冲区 │ │ 精灵批次 │ │
|
|
||||||
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
|
|
||||||
└─────────────────────────────────┬────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌──────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ ⑤ 结束帧 (endFrame) │
|
|
||||||
│ flushShapeBatch() + flushLineBatch() + endSpriteBatch() │
|
|
||||||
│ 提交所有待渲染数据到 GPU │
|
|
||||||
└─────────────────────────────────┬────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌──────────────────────────────────────────────────────────────────────┐
|
|
||||||
│ ⑥ 交换缓冲区 │
|
|
||||||
│ SDL_GL_SwapWindow() 将渲染结果显示到屏幕 │
|
|
||||||
└──────────────────────────────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3.2 资源加载流程
|
|
||||||
|
|
||||||
```
|
|
||||||
纹理加载:
|
|
||||||
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
||||||
│ 文件路径 │───►│ stb_image│───►│ 像素数据 │───►│ GLTexture │
|
|
||||||
│ .png/.jpg│ │ 解码 │ │ RGBA │ │ glTexImage2D
|
|
||||||
└──────────┘ └──────────┘ └──────────┘ └──────────┘
|
|
||||||
|
|
||||||
字体加载:
|
|
||||||
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
||||||
│ .ttf文件 │───►│读取到内存│───►│stbtt_Init│───►│GLFontAtlas│
|
|
||||||
│ │ │ │ │Font() │ │ 创建图集 │
|
|
||||||
└──────────┘ └──────────┘ └──────────┘ └──────────┘
|
|
||||||
|
|
||||||
着色器加载:
|
|
||||||
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
||||||
│.vert文件 │───►│读取源码 │───►│glCompile │───►│glLink │
|
|
||||||
│.frag文件 │───►│ │ │Shader() │ │Program │
|
|
||||||
└──────────┘ └──────────┘ └──────────┘ └──────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## 4. 项目目录结构
|
|
||||||
|
|
||||||
```
|
|
||||||
Frostbite2D/
|
|
||||||
├── xmake.lua # 主构建配置
|
|
||||||
├── platform/
|
|
||||||
│ └── windows.lua # Windows 平台配置
|
|
||||||
├── shaders/
|
|
||||||
│ ├── shape.vert # 形状着色器 - 顶点
|
|
||||||
│ ├── shape.frag # 形状着色器 - 片段
|
|
||||||
│ ├── sprite.vert # 精灵着色器 - 顶点
|
|
||||||
│ └── sprite.frag # 精灵着色器 - 片段
|
|
||||||
└── Fostbite2D/
|
|
||||||
├── include/
|
|
||||||
│ ├── fostbite2D/
|
|
||||||
│ │ ├── app/
|
|
||||||
│ │ │ └── application.h # 应用主类
|
|
||||||
│ │ ├── config/
|
|
||||||
│ │ │ ├── app_config.h # 应用配置
|
|
||||||
│ │ │ └── platform_config.h # 平台配置
|
|
||||||
│ │ ├── core/
|
|
||||||
│ │ │ ├── color.h # 颜色类
|
|
||||||
│ │ │ ├── math_types.h # 数学类型
|
|
||||||
│ │ │ └── types.h # 基础类型定义
|
|
||||||
│ │ ├── module/
|
|
||||||
│ │ │ └── module.h # 模块基类
|
|
||||||
│ │ ├── platform/
|
|
||||||
│ │ │ └── window.h # 窗口类
|
|
||||||
│ │ └── render/
|
|
||||||
│ │ ├── camera.h # 相机
|
|
||||||
│ │ ├── font.h # 字体接口
|
|
||||||
│ │ ├── texture.h # 纹理接口
|
|
||||||
│ │ ├── opengl/
|
|
||||||
│ │ │ ├── gl_font_atlas.h # OpenGL字体图集
|
|
||||||
│ │ │ ├── gl_renderer.h # OpenGL渲染器
|
|
||||||
│ │ │ ├── gl_shader.h # OpenGL着色器
|
|
||||||
│ │ │ ├── gl_sprite_batch.h # 精灵批处理
|
|
||||||
│ │ │ └── gl_texture.h # OpenGL纹理
|
|
||||||
│ │ └── shader/
|
|
||||||
│ │ ├── shader_interface.h # 着色器接口
|
|
||||||
│ │ └── shader_manager.h # 着色器管理器
|
|
||||||
│ ├── glad/
|
|
||||||
│ │ └── glad.h # OpenGL 加载器
|
|
||||||
│ ├── KHR/
|
|
||||||
│ │ └── khrplatform.h # Khronos 平台定义
|
|
||||||
│ └── stb/
|
|
||||||
│ ├── stb_image.h # 图片加载
|
|
||||||
│ ├── stb_rect_pack.h # 矩形打包
|
|
||||||
│ └── stb_truetype.h # 字体渲染
|
|
||||||
└── src/
|
|
||||||
├── main.cpp # 程序入口
|
|
||||||
├── glad/
|
|
||||||
│ └── glad.c # GLAD 实现
|
|
||||||
└── fostbite2D/
|
|
||||||
├── app/
|
|
||||||
│ └── application.cpp # Application 实现
|
|
||||||
├── config/
|
|
||||||
│ └── app_config.cpp # 配置实现
|
|
||||||
├── platform/
|
|
||||||
│ └── window.cpp # Window 实现
|
|
||||||
└── render/
|
|
||||||
├── camera.cpp # Camera 实现
|
|
||||||
├── texture.cpp # Texture 实现
|
|
||||||
├── opengl/ # OpenGL 实现
|
|
||||||
└── shader/ # Shader 实现
|
|
||||||
```
|
|
||||||
|
|
||||||
## 5. 核心类关系图
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────┐
|
|
||||||
│ Application │
|
|
||||||
│ 单例 │
|
|
||||||
└────────┬────────┘
|
|
||||||
│
|
|
||||||
┌───────────────────────────┼───────────────────────────┐
|
|
||||||
│ │ │
|
|
||||||
▼ ▼ ▼
|
|
||||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
||||||
│ Window │◄───────►│ ShaderManager │◄───────►│ GLRenderer │
|
|
||||||
│ (SDL2) │ │ 单例 │ │ │
|
|
||||||
└─────────────────┘ └────────┬────────┘ └───────┬─────────┘
|
|
||||||
│ │
|
|
||||||
▼ ▼
|
|
||||||
┌─────────────────┐ ┌─────────────────┐
|
|
||||||
│ IShader │ │ GLSpriteBatch │
|
|
||||||
│ 接口 │ │ 精灵批处理 │
|
|
||||||
└────────┬────────┘ └───────┬─────────┘
|
|
||||||
│ │
|
|
||||||
▼ ▼
|
|
||||||
┌─────────────────┐ ┌─────────────────┐
|
|
||||||
│ GLShader │ │ GLTexture │
|
|
||||||
│ OpenGL实现 │ │ 纹理管理 │
|
|
||||||
└─────────────────┘ └─────────────────┘
|
|
||||||
|
|
||||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
||||||
│ Camera │◄───────►│ GLFontAtlas │◄───────►│ FontAtlas │
|
|
||||||
│ 2D相机 │ │ 字体图集 │ │ 接口 │
|
|
||||||
│ view/proj矩阵 │ │ stb_truetype │ │ │
|
|
||||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## 6. 关键技术点
|
|
||||||
|
|
||||||
### 6.1 批处理渲染 (Batch Rendering)
|
|
||||||
|
|
||||||
- **形状批处理**: 8192 个顶点缓冲区,减少 draw call
|
|
||||||
- **线条批处理**: 16384 个顶点,支持线宽变化时 flush
|
|
||||||
- **精灵批处理**: 10000 个精灵,使用单一 draw call
|
|
||||||
|
|
||||||
### 6.2 字体图集 (Font Atlas)
|
|
||||||
|
|
||||||
- 使用 `stb_rect_pack` 进行矩形打包
|
|
||||||
- 1024x1024 RGBA 纹理存储字形
|
|
||||||
- 动态缓存:首次使用字符时渲染到图集
|
|
||||||
|
|
||||||
### 6.3 坐标系
|
|
||||||
|
|
||||||
- **世界坐标**: Y轴向下 (0,0) 在左上角
|
|
||||||
- **纹理坐标**: OpenGL 标准,(0,0) 在左下角
|
|
||||||
- **相机**: 正交投影,可移动/缩放
|
|
||||||
|
|
||||||
### 6.4 渲染状态管理
|
|
||||||
|
|
||||||
- 自动处理 OpenGL 状态缓存
|
|
||||||
- 混合模式切换 (None/Alpha/Additive/Multiply)
|
|
||||||
- 变换矩阵栈支持嵌套变换
|
|
||||||
|
|
||||||
## 7. 使用示例
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
// 1. 初始化
|
|
||||||
AppConfig config = AppConfig::createDefault();
|
|
||||||
config.windowConfig.title = "My Game";
|
|
||||||
Application::get().init(config);
|
|
||||||
|
|
||||||
// 2. 初始化渲染
|
|
||||||
GLRenderer renderer;
|
|
||||||
renderer.init(sdlWindow);
|
|
||||||
|
|
||||||
// 3. 加载字体
|
|
||||||
GLFontAtlas font("C:/Windows/Fonts/arial.ttf", 24);
|
|
||||||
|
|
||||||
// 4. 游戏循环
|
|
||||||
while (running) {
|
|
||||||
// 处理事件...
|
|
||||||
|
|
||||||
// 开始渲染
|
|
||||||
renderer.beginFrame(Color(0.1f, 0.1f, 0.15f, 1.0f));
|
|
||||||
renderer.setViewProjection(camera.getViewProjectionMatrix());
|
|
||||||
|
|
||||||
// 绘制图形
|
|
||||||
renderer.fillRect(Rect(100, 100, 200, 150), Colors::Red);
|
|
||||||
renderer.fillCircle(Vec2(400, 300), 50.0f, Colors::Blue, 32);
|
|
||||||
renderer.drawLine(Vec2(0, 0), Vec2(800, 600), Colors::White, 2.0f);
|
|
||||||
|
|
||||||
// 绘制文字
|
|
||||||
renderer.beginSpriteBatch();
|
|
||||||
renderer.drawText(font, "Hello World!", 100, 100, Colors::White);
|
|
||||||
renderer.endSpriteBatch();
|
|
||||||
|
|
||||||
// 结束渲染
|
|
||||||
renderer.endFrame();
|
|
||||||
SDL_GL_SwapWindow(sdlWindow);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 5. 清理
|
|
||||||
renderer.shutdown();
|
|
||||||
Application::get().shutdown();
|
|
||||||
```
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fostbite2D/core/window.h>
|
#include <frostbite2D/core/window.h>
|
||||||
#include <fostbite2D/module/module.h>
|
#include <frostbite2D/module/module.h>
|
||||||
#include <fostbite2D/types/type_alias.h>
|
#include <frostbite2D/types/type_alias.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace frostbite2D {
|
namespace frostbite2D {
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <fostbite2D/types/type_alias.h>
|
#include <frostbite2D/types/type_alias.h>
|
||||||
#include <fostbite2D/types/type_math.h>
|
#include <frostbite2D/types/type_math.h>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
|
@ -64,7 +64,7 @@ struct Icon {
|
||||||
struct WindowConfig {
|
struct WindowConfig {
|
||||||
uint32_t width = 640; ///< 窗口宽度
|
uint32_t width = 640; ///< 窗口宽度
|
||||||
uint32_t height = 480; ///< 窗口高度
|
uint32_t height = 480; ///< 窗口高度
|
||||||
std::string title = "fostbite2D Game"; ///< 窗口标题
|
std::string title = "frostbite2D Game"; ///< 窗口标题
|
||||||
Icon icon; ///< 窗口图标
|
Icon icon; ///< 窗口图标
|
||||||
bool resizable = false; ///< 窗口大小可调整
|
bool resizable = false; ///< 窗口大小可调整
|
||||||
bool fullscreen = false; ///< 窗口全屏
|
bool fullscreen = false; ///< 窗口全屏
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fostbite2D/core/types.h>
|
#include <frostbite2D/core/types.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <glm/vec4.hpp>
|
#include <glm/vec4.hpp>
|
||||||
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <fostbite2D/types/type_alias.h>
|
#include <frostbite2D/types/type_alias.h>
|
||||||
#include <glm/gtc/matrix_transform.hpp>
|
#include <glm/gtc/matrix_transform.hpp>
|
||||||
#include <glm/mat4x4.hpp>
|
#include <glm/mat4x4.hpp>
|
||||||
#include <glm/vec2.hpp>
|
#include <glm/vec2.hpp>
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <fostbite2D/types/type_alias.h>
|
#include <frostbite2D/types/type_alias.h>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <fostbite2D/core/application.h>
|
#include <frostbite2D/core/application.h>
|
||||||
#include <fostbite2D/platform/switch.h>
|
#include <frostbite2D/platform/switch.h>
|
||||||
namespace frostbite2D {
|
namespace frostbite2D {
|
||||||
|
|
||||||
Application &Application::get() {
|
Application &Application::get() {
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include "SDL_log.h"
|
#include "SDL_log.h"
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <fostbite2D/core/window.h>
|
#include <frostbite2D/core/window.h>
|
||||||
#include <glad/glad.h>
|
#include <glad/glad.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#include <fostbite2D/platform/switch.h>
|
#include <frostbite2D/platform/switch.h>
|
||||||
|
|
||||||
#ifdef __SWITCH__
|
#ifdef __SWITCH__
|
||||||
namespace frostbite2D {
|
namespace frostbite2D {
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#include <fostbite2D/utils/asset.h>
|
#include <frostbite2D/utils/asset.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <system_error>
|
#include <system_error>
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
#include "SDL_log.h"
|
#include "SDL_log.h"
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <fostbite2D/core/application.h>
|
#include <frostbite2D/core/application.h>
|
||||||
#include <fostbite2D/core/window.h>
|
#include <frostbite2D/core/window.h>
|
||||||
#include <fostbite2D/utils/asset.h>
|
#include <frostbite2D/utils/asset.h>
|
||||||
|
|
||||||
#include <glad/glad.h>
|
#include <glad/glad.h>
|
||||||
|
|
||||||
279
README.md
279
README.md
|
|
@ -1,279 +0,0 @@
|
||||||
# Frostbite2D
|
|
||||||
|
|
||||||
一个轻量级、跨平台的 2D 游戏引擎,使用现代 C++ 编写。
|
|
||||||
|
|
||||||
[](https://opensource.org/licenses/MIT)
|
|
||||||
[](https://en.cppreference.com/w/cpp/17)
|
|
||||||
[](#平台支持)
|
|
||||||
|
|
||||||
## 特性
|
|
||||||
|
|
||||||
- **跨平台**: 支持 Windows、Linux、macOS 和 Nintendo Switch
|
|
||||||
- **现代 C++17**: 类型安全的代码,使用智能指针
|
|
||||||
- **OpenGL ES 3.2**: 硬件加速的 2D 渲染
|
|
||||||
- **模块化架构**: 灵活的模块系统,易于扩展
|
|
||||||
- **UTF-8 支持**: 完整支持中文及其他 Unicode 路径
|
|
||||||
- **批量渲染**: 高效的精灵批处理,支持数千个精灵
|
|
||||||
- **字体渲染**: 通过 stb_truetype 支持 TrueType 字体
|
|
||||||
|
|
||||||
## 平台支持
|
|
||||||
|
|
||||||
| 平台 | 状态 |
|
|
||||||
|------|------|
|
|
||||||
| Windows | ✅ 已支持 |
|
|
||||||
| Linux | ✅ 已支持 |
|
|
||||||
| macOS | ✅ 已支持 |
|
|
||||||
| Nintendo Switch | ✅ 已支持 (homebrew) |
|
|
||||||
|
|
||||||
## 依赖库
|
|
||||||
|
|
||||||
- **SDL2** - 窗口管理和输入处理
|
|
||||||
- **OpenGL ES 3.2** - 图形 API
|
|
||||||
- **GLAD** - OpenGL 函数加载器
|
|
||||||
- **GLM** - 数学库
|
|
||||||
- **stb 库** - 图像加载、字体渲染等
|
|
||||||
|
|
||||||
## 构建
|
|
||||||
|
|
||||||
### 环境要求
|
|
||||||
|
|
||||||
- [xmake](https://xmake.io/zh-cn/) 构建系统
|
|
||||||
- 支持 C++17 的编译器
|
|
||||||
- SDL2 开发库
|
|
||||||
|
|
||||||
### 构建命令
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 克隆仓库
|
|
||||||
git clone https://github.com/yourusername/Frostbite2D.git
|
|
||||||
cd Frostbite2D
|
|
||||||
|
|
||||||
# 构建项目
|
|
||||||
xmake build
|
|
||||||
|
|
||||||
# 运行
|
|
||||||
xmake run
|
|
||||||
```
|
|
||||||
|
|
||||||
### 指定平台构建
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Windows
|
|
||||||
xmake config --plat=windows
|
|
||||||
xmake build
|
|
||||||
|
|
||||||
# Linux
|
|
||||||
xmake config --plat=linux
|
|
||||||
xmake build
|
|
||||||
|
|
||||||
# Nintendo Switch (需要 devkitPro)
|
|
||||||
xmake config --plat=switch
|
|
||||||
xmake build
|
|
||||||
```
|
|
||||||
|
|
||||||
## 快速开始
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include <fostbite2D/core/application.h>
|
|
||||||
#include <fostbite2D/utils/asset.h>
|
|
||||||
|
|
||||||
using namespace frostbite2D;
|
|
||||||
|
|
||||||
class GameModule : public Module {
|
|
||||||
public:
|
|
||||||
const char* getName() const override { return "GameModule"; }
|
|
||||||
|
|
||||||
void setupModule() override {
|
|
||||||
auto& asset = Asset::get();
|
|
||||||
asset.setWorkingDirectory("assets");
|
|
||||||
}
|
|
||||||
|
|
||||||
void onRender() override {
|
|
||||||
// 在这里编写渲染代码
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
auto& app = Application::get();
|
|
||||||
|
|
||||||
AppConfig config = AppConfig::createDefault();
|
|
||||||
config.appName = "我的游戏";
|
|
||||||
config.windowConfig.width = 1280;
|
|
||||||
config.windowConfig.height = 720;
|
|
||||||
|
|
||||||
if (!app.init(config)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
app.use(new GameModule());
|
|
||||||
app.run();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 架构
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ 用户应用层 │
|
|
||||||
└─────────────────────────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ 应用程序层 │
|
|
||||||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
|
||||||
│ │ 单例管理 │ │ 模块系统 │ │ 时间管理 │ │ 窗口管理 │ │
|
|
||||||
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
|
||||||
└─────────────────────────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ 核心系统层 │
|
|
||||||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
|
||||||
│ │ 渲染器 │ │ 着色器 │ │ 资源管理 │ │ 输入系统 │ │
|
|
||||||
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
|
|
||||||
└─────────────────────────────────────────────────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────────────────────────────────────────────────┐
|
|
||||||
│ 平台抽象层 │
|
|
||||||
│ SDL2 + OpenGL │
|
|
||||||
└─────────────────────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## 核心模块
|
|
||||||
|
|
||||||
### Application(应用程序)
|
|
||||||
|
|
||||||
主入口点和生命周期管理器。
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
Application::get().init(config); // 初始化
|
|
||||||
Application::get().use(module); // 添加模块
|
|
||||||
Application::get().run(); // 运行主循环
|
|
||||||
```
|
|
||||||
|
|
||||||
### Window(窗口)
|
|
||||||
|
|
||||||
跨平台窗口管理,支持 OpenGL 上下文。
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
WindowConfig config;
|
|
||||||
config.width = 1280;
|
|
||||||
config.height = 720;
|
|
||||||
config.title = "我的窗口";
|
|
||||||
config.vsync = true;
|
|
||||||
config.fullscreen = false;
|
|
||||||
```
|
|
||||||
|
|
||||||
### Asset(资源管理)
|
|
||||||
|
|
||||||
文件系统工具,支持 UTF-8 中文路径。
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
auto& asset = Asset::get();
|
|
||||||
|
|
||||||
// 设置工作目录
|
|
||||||
asset.setWorkingDirectory("D:/游戏/资源");
|
|
||||||
|
|
||||||
// 读取文件
|
|
||||||
std::string content;
|
|
||||||
asset.readTextFile("config.json", content);
|
|
||||||
|
|
||||||
// 遍历文件
|
|
||||||
auto files = asset.listFiles("textures", true);
|
|
||||||
auto pngs = asset.listFilesWithExtension("sprites", ".png");
|
|
||||||
```
|
|
||||||
|
|
||||||
### Math Types(数学类型)
|
|
||||||
|
|
||||||
基于 GLM 的 2D 数学工具。
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
Vec2 position(100.0f, 200.0f);
|
|
||||||
Size size(50.0f, 50.0f);
|
|
||||||
Rect bounds(position, size);
|
|
||||||
|
|
||||||
// 变换
|
|
||||||
auto transform = Transform2D::translation(100, 100)
|
|
||||||
* Transform2D::rotation(45.0f)
|
|
||||||
* Transform2D::scaling(2.0f);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Module System(模块系统)
|
|
||||||
|
|
||||||
创建自定义模块来扩展功能。
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
class MyModule : public Module {
|
|
||||||
public:
|
|
||||||
const char* getName() const override { return "MyModule"; }
|
|
||||||
|
|
||||||
void setupModule() override { /* 初始化 */ }
|
|
||||||
void onUpdate() override { /* 更新逻辑 */ }
|
|
||||||
void onRender() override { /* 渲染 */ }
|
|
||||||
void destroyModule() override { /* 清理 */ }
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
## 项目结构
|
|
||||||
|
|
||||||
```
|
|
||||||
Frostbite2D/
|
|
||||||
├── Fostbite2D/
|
|
||||||
│ ├── include/
|
|
||||||
│ │ └── fostbite2D/
|
|
||||||
│ │ ├── core/ # 应用程序、窗口
|
|
||||||
│ │ ├── module/ # 模块系统
|
|
||||||
│ │ ├── platform/ # 平台相关代码
|
|
||||||
│ │ ├── types/ # 数学类型、颜色
|
|
||||||
│ │ └── utils/ # 资源管理
|
|
||||||
│ └── src/
|
|
||||||
│ └── fostbite2D/
|
|
||||||
│ ├── core/
|
|
||||||
│ ├── platform/
|
|
||||||
│ └── utils/
|
|
||||||
├── platform/ # 平台构建配置
|
|
||||||
│ ├── windows.lua
|
|
||||||
│ ├── linux.lua
|
|
||||||
│ └── switch.lua
|
|
||||||
├── xmake.lua # 构建配置
|
|
||||||
└── README.md
|
|
||||||
```
|
|
||||||
|
|
||||||
## API 参考
|
|
||||||
|
|
||||||
### Application
|
|
||||||
|
|
||||||
| 方法 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| `get()` | 获取单例实例 |
|
|
||||||
| `init(config)` | 使用配置初始化 |
|
|
||||||
| `run()` | 启动主循环 |
|
|
||||||
| `quit()` | 请求退出 |
|
|
||||||
| `use(module)` | 添加模块 |
|
|
||||||
| `deltaTime()` | 获取帧间隔时间 |
|
|
||||||
| `fps()` | 获取当前帧率 |
|
|
||||||
|
|
||||||
### Asset
|
|
||||||
|
|
||||||
| 方法 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| `readTextFile(path, out)` | 读取文本文件 |
|
|
||||||
| `writeTextFile(path, content)` | 写入文本文件 |
|
|
||||||
| `readBinaryFile(path, out)` | 读取二进制文件 |
|
|
||||||
| `listFiles(dir, recursive)` | 列出目录中的文件 |
|
|
||||||
| `exists(path)` | 检查路径是否存在 |
|
|
||||||
| `setWorkingDirectory(path)` | 设置工作目录 |
|
|
||||||
|
|
||||||
## 许可证
|
|
||||||
|
|
||||||
本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件。
|
|
||||||
|
|
||||||
## 致谢
|
|
||||||
|
|
||||||
- [SDL2](https://www.libsdl.org/) - 跨平台多媒体库
|
|
||||||
- [GLM](https://github.com/g-truc/glm) - OpenGL 数学库
|
|
||||||
- [stb libraries](https://github.com/nothings/stb) - 单文件库集合
|
|
||||||
- [xmake](https://xmake.io/zh-cn/) - 跨平台构建系统
|
|
||||||
|
|
@ -4,9 +4,9 @@ add_requires("glm")
|
||||||
|
|
||||||
target("Frostbite2D")
|
target("Frostbite2D")
|
||||||
set_kind("binary")
|
set_kind("binary")
|
||||||
add_files(path.join(os.projectdir(), "Fostbite2D/src/**.cpp"))
|
add_files(path.join(os.projectdir(), "Frostbite2D/src/**.cpp"))
|
||||||
add_files(path.join(os.projectdir(), "Fostbite2D/src/**.c"))
|
add_files(path.join(os.projectdir(), "Frostbite2D/src/**.c"))
|
||||||
add_includedirs(path.join(os.projectdir(), "Fostbite2D/include"))
|
add_includedirs(path.join(os.projectdir(), "Frostbite2D/include"))
|
||||||
|
|
||||||
add_packages("libsdl2")
|
add_packages("libsdl2")
|
||||||
add_packages("glm")
|
add_packages("glm")
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ add_requires("glm")
|
||||||
|
|
||||||
target("Frostbite2D")
|
target("Frostbite2D")
|
||||||
set_kind("binary")
|
set_kind("binary")
|
||||||
add_files(path.join(os.projectdir(), "Fostbite2D/src/**.cpp"))
|
add_files(path.join(os.projectdir(), "Frostbite2D/src/**.cpp"))
|
||||||
add_files(path.join(os.projectdir(), "Fostbite2D/src/**.c"))
|
add_files(path.join(os.projectdir(), "Frostbite2D/src/**.c"))
|
||||||
add_includedirs(path.join(os.projectdir(), "Fostbite2D/include"))
|
add_includedirs(path.join(os.projectdir(), "Frostbite2D/include"))
|
||||||
|
|
||||||
add_packages("libsdl2")
|
add_packages("libsdl2")
|
||||||
add_packages("glm")
|
add_packages("glm")
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
|
|
||||||
target("Frostbite2D")
|
target("Frostbite2D")
|
||||||
set_kind("binary")
|
set_kind("binary")
|
||||||
add_files(path.join(os.projectdir(), "Fostbite2D/src/**.cpp"))
|
add_files(path.join(os.projectdir(), "Frostbite2D/src/**.cpp"))
|
||||||
add_files(path.join(os.projectdir(), "Fostbite2D/src/**.c"))
|
add_files(path.join(os.projectdir(), "Frostbite2D/src/**.c"))
|
||||||
add_includedirs(path.join(os.projectdir(), "Fostbite2D/include"))
|
add_includedirs(path.join(os.projectdir(), "Frostbite2D/include"))
|
||||||
|
|
||||||
-- 检查 DEVKITPRO 环境变量(Windows 上使用 C:/devkitPro)
|
-- 检查 DEVKITPRO 环境变量(Windows 上使用 C:/devkitPro)
|
||||||
local devkitPro = os.getenv("DEVKITPRO") or "L:/Switch/devkitPro"
|
local devkitPro = os.getenv("DEVKITPRO") or "L:/Switch/devkitPro"
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ add_requires("glm")
|
||||||
|
|
||||||
target("Frostbite2D")
|
target("Frostbite2D")
|
||||||
set_kind("binary")
|
set_kind("binary")
|
||||||
add_files(path.join(os.projectdir(), "Fostbite2D/src/**.cpp"))
|
add_files(path.join(os.projectdir(), "Frostbite2D/src/**.cpp"))
|
||||||
add_files(path.join(os.projectdir(), "Fostbite2D/src/**.c"))
|
add_files(path.join(os.projectdir(), "Frostbite2D/src/**.c"))
|
||||||
add_includedirs(path.join(os.projectdir(), "Fostbite2D/include"))
|
add_includedirs(path.join(os.projectdir(), "Frostbite2D/include"))
|
||||||
|
|
||||||
add_packages("libsdl2")
|
add_packages("libsdl2")
|
||||||
add_packages("glm")
|
add_packages("glm")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue