Cubedoom: 使用 Spectre 编程语言打造的类 DOOM 射击游戏

从零开始构建一款游戏是一项重大的工程,但使用一种自定义构建的编程语言来完成这项工作则提升了挑战性和成就感。Cubedoom 是一款受 Wolfenstein 3D 和原版 DOOM 启发而设计的竞技场射击游戏,它是 Spectre 编程语言能力的引人注目的展示。该项目不仅提供了一种极简且引人入胜的游戏体验,还作为 Spectre 设计原则的实际展示,包括其多维数组处理和强大的 C 互操作性。

Cubedoom: 概览

Cubedoom 是一款竞技场射击游戏,旨在让玩家沉浸在迷宫般的环境中,在与单一敌人的战斗中努力生存。其游戏玩法是有意设计的极简风格,专注于导航和战斗的核心循环,让人联想起早期的 FPS 游戏。游戏包含生命值条、小地图 HUD 和经典的视角晃动(viewbob)机制等基本元素,增添了复古感。

用于复古 3D 的光线投射技术

游戏的 3D 世界渲染采用了光线投射(raycasting)技术,这是一种由早期第一人称射击游戏推广的方法。这种方法涉及在每一帧从玩家的位置投射一组光线,在地图网格中步进,直到检测到墙壁碰撞。随后,到该碰撞点的距离决定了绘制到屏幕上的垂直切片高度,从而在没有复杂渲染流水线带来的计算开销的情况下,有效地创造出深度错觉。

需要注意的是该技术的具体实现方式。正如一位评论者所澄清的:

At runtime each frame casts a set of rays from the player’s position, stepping through the map grid until a wall collision is detected. It's not how Doom works. It's more like Wolfenstein 3D.

这一区别强调了,虽然 Cubedoom 从 DOOM 中汲取了灵感,但其渲染架构更接近于 Wolfenstein 3D 中使用的更简单但有效的光线投射技术,从而保持了引擎的轻量化和高性能。 \n### Spectre 中的技术基础

Cubedoom 完全使用 Spectre 编程语言构建,并依赖 SDL2 和 SDL2_Image 开发库进行图形和输入处理。该项目最初是一个实验,旨在推动 Spectre 的多维数组能力及其 C 互操作性。Cubedoom 的开发甚至促成了特定的语言增强功能,例如引入了与 extern-相关的 "header" 语法,以提高与备选编译器后端的兼容性。

游戏的源代码在 GitHub 上公开可用,欢迎社区的贡献。

Spectre 编程语言: 为 Cubedoom 提供动力

Spectre 是 Cubedoom 背后的基础技术,其持续的开发对于此类项目至关重要。Spectre 最近的更新(特别是 v0.0.5)展示了其不断的演进和日益增长的能力:

  • C-to-Spectre 转换: 一个新的 --translate-c 标志允许将 C 代码转换为 Spectre,从而简化了迁移和集成。
  • 实验性后端: 引入了新的实验性 LLVM 和 C99 后端,扩展了 Spectre 的编译目标和优化潜力。
  • 改进的类型系统: 对类型级不变式(type-level invariant)语法的增强提供了更强大的类型安全性和表达能力。
  • 性能优化: 语义分析和模块解析方面的显著改进带来了更快的编译时间。

这些进步使得 Spectre 成为一种更通用且高效的语言,用于开发复杂的应用程序,正如 Cubedoom 所证明的那样。

未来方向与社区参与

Cubedoom 的路线图包括令人兴奋的新增内容,例如音效、更多种类的敌人类型以及弹药计数系统,以深化游戏体验。Cubedoom 和 Spectre 编程语言都是开源项目,积极寻求对语言设计、游戏开发或两者皆感兴趣的开发者进行贡献。

社区的反馈突显了这一努力的满足感:

Must be satisfying. a game in your own lang.

以及其经典灵感的持久吸引力:

Got to love these classic games that were so amazing in their glory days and still fun today!

Cubedoom 不仅仅是一款游戏;它是自定义语言开发力量和潜力的证明,提供了一种复古游戏怀旧感与前沿编程探索的独特结合。

Sources