主要观点:2024 年 8 月 4 日周日,介绍了名为 high_impact 的小型 2D 动作游戏引擎,用 C 编写,可编译为 Windows、Mac、Linux 以及 Web 的 WASM ,灵感源自 2010 年的 Impact 引擎,名字是对 C 曾被视为高级语言时代的致敬,MIT 许可,源代码在 github 上。
关键信息:
- 2010 年 Steve Jobs 发表“Thoughts on Flash”,Flash 在浏览器中重要性降低,作者用 JavaScript Canvas2D API 制作 Biolab Disaster 证明无需 Flash 也能制作网页游戏,后发布 Impact 并成功,最终免费开源。
- 用 C 重写 Impact 是因为 C 有趣简单又深奥,能重新找回对它的热爱,重写过程中重新实现了多个项目。
- high_impact 概念简单,以直截了当的方式实现,是框架而非库,底部是 platform 后端,可通过 SDL 或 Sokol 编译,游戏代码在场景中,场景通过函数指针实现,支持 JSON 格式的地图和实体加载。
- 实体共享 entity_t 结构体,可通过宏扩展,每个实体类型需提供 entity_vtab_t ,high_impact 有固定大小的实体存储,通过 entity_ref_t 管理实体引用。
- 碰撞检测通过追踪实体框与地图碰撞计算精确碰撞点,处理实体间碰撞分开处理,通过 broad phase 碰撞检测排序实体。
- 渲染有 OpenGL 和软件渲染器,通过简单 API 实现,软件渲染器支持轴对齐四边形,OpenGL 渲染器将所有要绘制的四边形收集到一个大缓冲区中一次绘制,所有纹理合并到一个纹理 atlas 中。
- 声音输出由 SDL2 或 Sokol 处理,系统可按需解压缩 QOA ,声音可改变音量、声相和音高,静态分配,自动处理声音播放和释放。
- 内存管理通过静态分配一个“hunk”字节数组,用 bump 分配器和临时分配器管理内存,可在不同阶段进行分配和释放,还可使用 alloc_pool 进行额外的分配上下文管理。
- 包含 Weltmeister 级编辑器,用 JavaScript 编写,可在现代浏览器中使用 FileSystemAPI 读取和保存文件,读取 C 源文件收集实体类型,可通过宏配置实体在编辑器中的外观和行为。
- 移植了 Biolab Disaster 和 Drop 两个游戏到 C ,以验证 high_impact 作为游戏引擎的可行性。
- high_impact 可扩展性强,平台和渲染器可扩展,欢迎各种系统的支持和 pull 请求。
重要细节: - Biolab Disaster 是侧滚 Jump'n'Gun 游戏,Drop 是简单的街机游戏,都有 high_impact WASM 版本和原始 JS 版本。
- 内存管理中不同阶段的分配和释放规则,如场景加载、场景运行和帧结束时的内存处理。
- 实体系统中 OOP 与组合方式在游戏开发中的讨论,以及实体 vtab_t 中函数的可选性。
- 碰撞检测中不同情况下的处理方式,如处理快速移动对象的碰撞和实体间的碰撞。
- 渲染中纹理 atlas 的大小可配置,以及不同渲染器的实现细节。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。