PICO-8 是一个虚构游戏平台(Fantasy Console),可用于开发、运行一些复古的像素风格的小游戏。它有很多限制,比如输出只有固定的 128*128 的分辨率,只能使用 16 种颜色等等,这些限制让 PICO-8 保持足够简单,迫使开发者将精力集中在游戏的创意本身,从而快速开发出一些小游戏或者游戏原型,快速验证一些想法是否可行。

PICO-8 使用 Lua 作为编程语言,但并不是标准 Lua,而是一个精简过同时添加了一些新内置函数的 Lua。基本语法与标准 Lua 一致,可用的方法基本上看下面总结出的 Cheat sheet 就可以:

完整的文档见:https://www.lexaloffle.com/pico8_manual.txt

看过文档介绍之后,我决定试用一下,便尝试着将以前用 JavaScript 开发的迷宫游戏移植到 PICO-8 平台。

关于迷宫的生成算法就不多介绍了,大致原理可见这篇文章以及这篇文章。下面记录一下主要开发过程。

首先启动 PICO-8,可以看到类似下面的画面:

看起来很像一个命令行终端,在这儿也的确可以输入一些命令,比如 ls 列出当前目录下的所有文件等。

但与普通终端不同的是,按 ESC 键可以在终端以及编辑器之间切换。编辑器界面类似下图:

在这个界面可以输入代码,进行游戏编辑。不过这个分辨率实在太低,字母看起来实在费眼,还好 PICO-8 也支持使用外部编辑器。

再按 ESC 键退出编辑器,在命令行界面输入 save [filename] 命令可将文件保存到硬盘,比如输入 save maze,刚才编辑的文件就会被保存为 maze.p8 文件,输入 ls 命令可查看当前工作目录下的所有文件。然后,一个很重要的命令来了,输入 folder 命令,即可使用系统的资源管理器打开 PICO-8 的当前工作目录。

PICO-8 生成的文件后缀名是 .p8,其实就是纯文本文件,其中一部分是 Lua 源码,一部分是精灵、地图等文件。你可以用你习惯的编辑器打开刚才生成的 maze.p8 文件进行编辑。如果你使用 Visual Studio Code,可以在插件市场找到 PICO-8 对应的插件。

然后就可以愉快地编写 Lua 代码了。注意 PICO-8 的代码有几个特殊方法,分别是:

  • _init() 会在初始化时调用一次。
  • _update() 每秒调用 30 次,可以将各种状态更新的方法放在这里。对应的还有一个 _update60() 方法,每秒调用 60 次。
  • _draw() 绘制每一帧时调用,可以在这个方法中调用各种绘制方法。

完整代码可见:https://gist.github.com/oldj/5a0a302a42a251bfb930e692bbd7376a

最终,迷宫游戏的运行效果如下:

PICO-8 的作品可以非常方便地导出多种格式,比如本地原生可执行文件(支持 Windows/macOS/Linux),也可以导出为 HTML。所有的导出都只需在 PICO-8 命令行中使用 export 命令即可完成。

这个迷宫游戏的 HTML 版本在线地址为:https://oldj.net/static/pico-8/maze/index.html

小结

PICO-8 是一个很容易上手的小游戏开发平台,可以用于快速试验一些想法。同时,由于上手简单,或许也可以作为儿童编程教育的一个选择。

简单是 PICO-8 的优点,同时也是它的缺点,经过一两天的折腾,我觉得主要有两个缺点:

  1. 调试比较困难。目前只能通过 printh() 方法将日志打印出来进行查看,没有断点调试之类的功能支持;
  2. 对 Lua 的支持有限,比如不支持标准库里的 table.xxx 方法,导致很多网上优秀的基于标准 Lua 写的第三方库无法使用。

总体而言,如果你喜欢复古的像素风格的游戏,PICO-8 还是值得玩一下的。