这几天我做了一件挺疯狂的事:把一个自制的精简字节码虚拟机塞进射击游戏里,再用全屏像素着色器渲染所有图形,最终生成一个只有 3KB 的 Windows 可执行文件。 这个项目是为 Langjam Gamejam 做的。这是一场为期 7 天的挑战,参赛者要先创造一门编程语言,再用这门语言做出一款游戏。 老实说,这个项目把我最喜欢的几件事全凑齐了:语言工具、游戏开发、程序化图形,还有 demoscene 式的体积限制。游戏 jam 的形式逼着我控制规模、尝试新想法,而且整个过程真的很好玩。 代码已经放到 GitHub 上,也可以直接在 itch.io 上玩到。另外我还录了一段 YouTube 演示视频,方便大家快速看效果。 说到灵感来源,最初我看到这个游戏 jam 时就很感兴趣。我犹豫了好几天,因为要为一门新语言找到真正合适的游戏玩法并不容易——总不能又做一个 TIS-100 那样的编程游戏吧。 后来我想到了 demoscene 作品里用自定义字节码来压缩体积的做法。一个典型例子是 2010 年在 Amiga 上运行的 4KB demo《Ikadalawampu》。不过我当时仍然有些怀疑:为了把代码体积缩小,真的值得嵌入一个解释器吗?答案是:值得一试。 另一个启发我的是 2004 年的第一人称射击游戏《kkrieger》,它整个游戏只有 96KB。在那之后,体积编码风格的好游戏少之又少,我一直想探索这个方向,这次游戏 jam 正好给了我一个理由。 我的计划很明确: - 设计一门语言。 - 用 F# 写一个编译器,把语言编译成字节码。 - 用 C++ 写一个字节码解释器。 - 用这门自定义语言做一款射击游戏。 - 用一个 GLSL 着色器完成全部图形渲染。 虽然整个设计思路都是为了体积压缩,但我并不打算花太多时间做精细优化。最初我估计游戏体积会在 4 到 8KB 左右,所以给这个项目取名叫 shmup8。 最后做出来的结果比预期还小,只有 3KB。这个体积里不仅包含游戏逻辑,还包含自研语言运行时和解释器。这也说明,体积限制并不是一种束缚,反而能逼你找到更聪明的实现方式。
热门跟贴