游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?( 二 )


如果要单纯地减小这些图片体积,我们可以使用压图工具进行压缩 。
比如一个原本 173kb 的图片,重复压缩四次后就只有 80kb ,如果再重复压缩下去,可能最后只有几 kb 。
游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?
文章图片
当然,这个方法未免有点效率太低 。
有些开发者采用了另外一种方法:用光圈来代替原图 。
比如大赛里有一个 3D 迷宫博物馆的游戏,场景里放满了各种世界名画,有梵高也有蒙娜丽莎 。
游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?
文章图片
要展示一张蒙娜丽莎的画像,我们可以利用算法,让几十个光圈的无限组合,最后得到一张最接近的图片 。
游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?
文章图片
如果你摘掉眼镜拿远了看下图( 不近视的请尝试让眼睛失焦 ),就会发现右边的光圈看起来其实跟左边没啥区别了 。
游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?
文章图片
所以,在游戏里告诉玩家这是一张蒙娜丽莎的画像,我们不需要放上一张几百 kb 的图片 。
利用这些光圈,只需要在代码中敲出每个光圈位置、半径和颜色数据就行了 。
游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?
文章图片
当然了,就算你把素材压缩足够小,但要是素材数量太多,还是会超过 13kb 的限制 。
所以开发者们最要做的,就是把素材重复利用 。
比如上面的忍者游戏,你仔细观察会发现看似丰富的场景下,其实有很多重复的素材,有的最多也只是换了一种颜色 。
游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?
文章图片
除了上面这些素材图片要处理,游戏里的文字也是让参赛者头大的一个问题 。
要在游戏里显示文字,就需要调用字体库 。
尽管一个通用字体库只有十几 kb,但这明显不适合用在 13kb 大小的游戏上 。
所以有聪明的开发者想到做像素字体 。
首先他创立一个对象,这个对象由 3x5 个空白格子组成,每个格子里可以填入 true( 真 )或者 false( 假 ) 。
游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?
文章图片
当填入 true 的时候,格子就会被涂上一个黑色的像素 。
那如果填入 false,这个格子就会被跳过,留下空白 。
那么要把这个对象涂成一个字母 A,我们可以按照下面的方式填入 true 和 false 。
游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?
文章图片
这个填入方式对应的代码也就是:
游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?
文章图片
多 1 个字母就会多占 1 个字节,为了把体积缩到最小,我们可以用 1 来代替 true,把 false 删掉 。
所以优化后的代码如下 。
游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?
文章图片
这样一来,原本在游戏里显示一个字母 A 需要调用十几 kb 字库,现在只需要十几个字节了 。
解决了文字和图片的问题,开发者还需要把代码压缩得尽可能小 。
通常做一个游戏都需要借助游戏引擎或者框架,来减少一些工作量 。
但常见的游戏框架肯定不适合做 13kb 的游戏 。
好在这游戏已经举办了不少年,有一些早期参赛选手自己做了一些游戏微框架,并提供给后来的参赛者 。
比如有人做出了一个非常轻量级的游戏框架 Kontra.js 。
如果要在游戏中做出一个不断循环的元素,原本可能需要敲下几十行的代码,但通过Kontra.js 只需要几行代码就能实现 。
游戏|一群大佬猛肝30天 最后就做出个13kb的游戏?
文章图片
光是这种方式缩减代码还不够 。
在编程中有一类工具叫混淆器,它在保证不破坏原功能的前提上,把源代码混淆成让人难以理解的格式,来保护源代码 。


推荐阅读