【免费下载链接】sonic3air
Source and data to build Sonic 3 A.I.R. (Angel Island Revisited) and the Oxygen Engine
📌librmx是 Sonic 3 A.I.R.(《Sonic 3 & Knuckles》同人重制版)仓库中的 C++ 基础库集合,由rmxbase(通用工具类)与rmxmedia(基于 SDL + OpenGL 的游戏框架)两大核心组成,为上层 Oxygen Engine 引擎提供字符串、数学、位图、文件、音频、渲染等全部底层能力。本文带你快速看懂它的分层设计与关键模块。
librmx 是什么:Sonic 3 A.I.R. 的三层地基
在官方 README.md 中,作者把整个仓库描述为"自下而上"的分层结构:
| 层级 | 模块 | 作用 |
|---|---|---|
| 外部依赖 | SDL、Ogg/Vorbis、zlib、curl、imgui(framework/external/) | 跨平台多媒体与网络能力 |
| 基础库 | librmx(rmxbase + rmxmedia) | 游戏框架:文件、数学、位图、音频、渲染、线程 |
| 引擎层 | Oxygen Engine(Oxygen/oxygenengine/) | 输入、图形、音频、模拟 Sega Genesis 硬件 |
| 游戏层 | Sonic 3 A.I.R. 脚本与 C++ 代码 | 关卡、角色、MOD 支持 |
librmx 源码集中在 librmx/ 目录,由三个库组成:
- rmxbase—— 纯 C++ 工具集,不依赖图形硬件;
- rmxmedia—— 构建在 SDL 与 OpenGL 之上的游戏应用框架;
- rmxext_oggvorbis—— Ogg/Vorbis 音频解码扩展。
三个库都提供统一的初始化宏INIT_RMX(定义于 rmxmedia.h),一行调用完成全部底层初始化。
跨平台基石:一份代码,8 个平台
librmx 的多平台能力来自 PlatformDefinitions.h,它根据编译器宏自动识别目标平台:
PLATFORM_WINDOWS/PLATFORM_LINUX/PLATFORM_MACPLATFORM_ANDROID/PLATFORM_IOSPLATFORM_WEB(emscripten 编译的 Web 版)PLATFORM_SWITCH/PLATFORM_VITA(主机移植)
配套的 export.h 负责 DLL/静态库的符号导出,而 rmxmedia_sdl3_compat.h 则通过宏重命名兼容了 SDL2 与 SDL3 两套 API——这就是 Sonic 3 A.I.R. 能同时运行在 PC、手机、浏览器和游戏主机上的底层原因。
rmxbase:字符串、数学与位图三大支柱
1️⃣ Bitmap:加载像素艺术的核心类
rmxbase 的 bitmap/ 模块用Bitmap与PaletteBitmap两类统一管理图像数据:
Bitmap支持 4/8/16/24/32 位色深转换(见 Bitmap.h);- 内置 BMP、PNG、JPG、ICO 四种编解码器(BitmapCodecs.h),采用"按格式注册解码器"的策略,易于扩展;
- 配合
InputStream/OutputStream抽象,位图既可来自磁盘,也可来自压缩包或网络流。
游戏中的角色精灵正是通过它解码的,下图是 Sonic 的完整精灵图集:
2️⃣ 文件虚拟文件系统:挂载点设计
FileSystem.h 是 rmxbase 中设计最巧妙的一块。它把"文件来源"抽象为可插拔的FileProvider,并支持挂载点(Mount Point)机制:
FTX::FileSystem->addMountPoint(*provider, L"data/", basePath + L"data/", 0x10);不同 Provider 按优先级依次查找文件——这正是 Sonic 3 A.I.R. 实现 MOD 热加载的关键:引擎把data/目录、MOD 的 zip 包按优先级挂载到同一虚拟路径下(见 EngineMain.cpp),上层代码读写data/sprites/xxx.png时根本感知不到资源来自哪里。
3️⃣ 数学库与内存工具
- math/Math.h 提供
Vec2/3/4、Mat3/4、Rect、Box、Ray、Plane等几何类型及射线-平面相交等运算函数,覆盖了 2D 游戏所需的全部向量数学; - memory/ 提供
String(带 UTF-8 转换)、ObjectPool对象池、BinarySerializer二进制序列化、RmxDeflate/ZlibDeflate压缩; - data/ 提供
SmartPtr、Singleton等所有权辅助类。
rmxmedia:SDL + OpenGL 之上的游戏框架
rmxmedia 把 SDL 的窗口/输入/音频能力和 OpenGL 渲染封装成一套"开箱即用"的框架,入口见 rmxmedia.h。
FTX 全局单例:框架的"门面"
rmxmedia.h 声明了五个全局单例,构成整个框架的门面(Facade):
| 单例 | 类型 | 职责 |
|---|---|---|
FTX::System | SystemManager | 主循环、计时、键盘鼠标状态 |
FTX::Video | VideoManager | 窗口创建、尺寸、渲染目标 |
FTX::Audio | AudioManager | 音频缓冲与混音 |
FTX::Painter | Painter | OpenGL 2D 绘制:矩形、纹理、文字、裁剪 |
FTX::JobManager | JobManager | 多线程任务队列 |
开发者只需继承GuiBase实现initialize()/update()/render()三个虚函数,即可得到一个完整的游戏应用骨架。
输入与多线程
InputContext统一处理键盘、鼠标、手柄事件;JobManager则用工作线程池执行后台任务(如资源异步加载),支持按优先级插入作业。移动端触摸按键的贴图资源就来自引擎的输入系统:
渲染管线:从 Texture 到 Painter
opengl 子模块包含Texture、Shader、Framebuffer、VertexArrayObject、SpriteAtlas(精灵图集)等组件。Painter在其之上提供drawRect()、print()、setScissor()等高层 API——Oxygen Engine 的画面输出全部建立在这条管线之上。音频侧则用AudioBuffer+ AudioMixer(支持树形混合器结构)完成混音。
rmxext_oggvorbis:Ogg 音频扩展
OggLoader 将 libogg/libvorbis 包装成 rmxmedia 音频系统的"插件",配合INIT_RMXEXT_OGGVORBIS宏完成初始化(见 EngineMain.cpp)。Ogg 流的复用原理如下图所示:
Hello World:rmx_test 最小示例
仓库自带的最小演示 rmx_test/main.cpp 展示了标准使用流程,非常值得新手阅读:
INIT_RMX;—— 初始化全部底层库;FTX::System->initialize();—— 启动系统管理器;FTX::Video->initialize(rmx::VideoConfig(false, 1200, 672, "rmx_test"));—— 创建 1200×672 窗口;FTX::System->run<App>();—— 进入主循环运行自定义的App类;FTX::Video->setPixelView();—— 以"像素视图"模式渲染,保证重制版游戏在高分屏下的锐利像素效果。
整个"窗口 + 主循环 + 渲染"只用了不到 15 行代码,这就是 rmxmedia 框架抽象的价值。
总结:为什么这样设计?
🏁 librmx 的设计可以概括为三条主线:
- 严格分层:rmxbase 零图形依赖、rmxmedia 只管"框架"不管"游戏"、Oxygen 负责引擎逻辑——各层可独立复用;
- 面向抽象:
FileProvider挂载点、位图解码器、SDL2/SDL3 兼容层,全部用接口隔离变化,让 MOD 系统和跨平台成为"免费获得"的能力; - 门面式 API:五个
FTX单例 +GuiBase模板,把复杂系统收敛成极小的学习成本。
如果你想深入,建议从 librmx/source/rmxbase.h 的模块清单、rmxmedia.h 的模块清单,再到 rmx_test/main.cpp 的顺序通读一遍,即可完整掌握 Sonic 3 A.I.R. 的地基设计。
【免费下载链接】sonic3air
Source and data to build Sonic 3 A.I.R. (Angel Island Revisited) and the Oxygen Engine
相关推荐
Sonic 3 A.I.R. 配置完全指南:config.json、存档状态与开发者模式详解
Sonic 3 A.I.R. 配置完全指南:config.json、存档状态与开发者模式详解 想要深度定制 Sonic 3 A.I.R. (Angel Isla
架构深度剖析:ViT基础模型 vit_base_patch16_224.sam_in1k 的 Patch Embedding、注意力层与 Token 池化完全指南
架构深度剖析:ViT基础模型 vit_base_patch16_224.sam_in1k 的 Patch Embedding、注意力层与 Token 池化完全指
从底层到实战:Cangjie-TPC/CJQT框架QCore模块深度剖析与应用指南
从底层到实战:Cangjie TPC/CJQT框架QCore模块深度剖析与应用指南 一、QCore模块架构概览:核心能力与设计哲学 Cangjie TPC/CJ
桌面应用跨平台
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考