FC(Family Computer)诞生于 1983 年,90 年代开始在中国大面积流行。想必 FC(NES / 红白机 / 小霸王)是各位 80 后、90 后大叔的童年回忆。还记得那个火热的夏天,刚放学的我们,约上几个小伙伴,围坐在电视机前,双打魂斗罗的场景吗?FC 上诞生了太多太多经典的游戏,《魂斗罗》《超级马里奥兄弟》《双截龙》《坦克大战》《雪人兄弟》...... 陪我们度过童年美好的时光。
大家一定很想知道 FC 是如何用孱弱的机能实现精美的游戏画面的吧。(好吧,大家其实并不想)。
在这里我就简单介绍一下 FC 的显示技术,顺便带大家找寻童年的记忆。绝不采用生涩难懂的专业术语,力求以最轻松的方式向大家科普,我的目标是,让我奶奶也看得懂。
FC 游戏最重要的组成部分是:角色与背景
没错,正如大家所选的,一款游戏最重要的组成部分就是角色与背景。
人类历史上第一款家用主机 奥德赛(Odyssey)
《战神 4》游戏
两个游戏都是由背景和角色构成。
最老和最新,两者隔了 46 年,在这 46 年的岁月里游戏画面的基本组成元素从未改变过。
我们就以这两方面入手,说说 FC 游戏的画面技术吧。
文章分为 5 个章节。
1.背景
2.角色
3.水平切割
4.命名表
5.某些游戏运用的奇技淫巧
背景,顾名思义,就是游戏人物活动的场景。没有背景,只有黑漆漆的一片,这游戏还怎么玩?
FC 的分辨率很低,只有区区 256x224,什么概念呢,我们的“真 4K”游戏机 ps4 pro 的分辨率是 FC 的 145 倍,换句话说,ps4 pro 能装下 145 个 FC 画面。
FC 的背景绘制存在极大的限制,毕竟是 1983 年的硬件,当年的程序猿和美工狮是在如此恶劣的环境中开发游戏。
这个场景大家肯定再熟悉不过(为了突出背景,去掉了人物)。玩过 FC 的人不可能没玩过这个游戏。没错,这个游戏就是大名鼎鼎的《魂斗罗》,又名《双截龙》,俗称《坦克大战》,诨名《沙罗曼蛇》......
大家猜猜,绘制这个背景使用了多大的内存?
这个截图以 png 格式保存,大小为 2.43KB。然而,FC 的显存只有 2KB。所以,用现代的方法连一个最简单的场景都做不出来。
聪明的程序猿用一个很聪明的方法完成了这个“Mission: Impossible”。
大家仔细观察一下这个背景,有没有发现,地板和砖块都是用方块拼出来的?
对了,就是用方块(tile)拼!
加上网格就很直白了,大家都看出来了吧,FC 游戏的背景就是用一个个方块拼出来的。
每个网格就是一个方块,方块是 8x8 像素,横着数 32 个方块,竖着数 28 个方块,总共 32x28=896 个方块。
这些方块都是大量地重复使用。
FC 游戏里有个拼图库(个人翻译,专业术语叫 CHR)。
如下图所示:
里面一个有 16x16=256 个方块。
大家仔细找找,这个场景里的所有方块都能在拼图库里找到。库里甚至还能找到一些奇奇怪怪的东西,那是之后的场景素材。
比如说这个问号,就是由 4 个方块组成。
库里每个方块都有自己的索引,简单说就是编号。
如果想用一个方块,直接从拼图库里按编号找就行了。
所以,FC 游戏的画风其实是这样的:
(逼死密集恐惧症)
大家还能脑补出游戏原来的样子吗?
整个屏幕被分成 32x28 个方块,每个方块包含一个编号,根据编号找到拼图库里对应的拼图,然后显示出来。
大家注意到没有,屏幕一共有 32x28 个方块,拼图库一共有 16x16 个方块,所以,拼图库的方块必然有很多被重复使用的。比如说满屏幕的 24 号...... 拼图库里 24 号对应的就是蔚蓝的天空。
16x16/(32x28)=28%,整个背景只有 28% 的内容是不重复的,剩下的 72% 必须重复,这是逼死美工狮的节奏啊。
所以,FC 游戏的过场动画大多都是很小的一块屏幕,比如:
全屏?美工狮:“臣妾做不到啊!”
FC 游戏已经把素材重复利用发挥到了极致。
大家有没有发现,这朵云和这颗树长得一模一样。
没错,云和树用了拼图库里同样的 6 个方块,只是换了颜色而已 。
它们是如何换颜色的呢?
调色板,顾名思义,就是给方块上色的。
FC 一共可以用 53 种颜色,调色盘从这 53 种颜色里选取 3 种颜色,“透明”也算一种颜色(此时显示背景的底色),一共 4 种颜色。
这 4 种颜色用来给方块上色。
这就意味着每个方块只能有 4 种色彩。(注意,每个方块是 8*8=64 个像素)
绝对不可能有超过 4 种颜色的方块存在,请大家尽情地找吧,找到第 5 种颜色有大奖,奖品是 ps4 plus 一台。
调色板可以有 4 个,每个方块就有 4 个配色方案。
4 个调色板如图所示。
每一行就是一个调色板,数字表示该颜色的号码,0F 代表透明色。
聪明的小伙伴们知道云和树分别用的是哪个调色板吗?
当年的程序猿就是用如此巧妙的方法绘制背景来节省内存的。
但是,这种背景绘制方法是美工狮的灾难:
大家有没有发现,这些平台的边缘有点不正常,有锯齿状的东西。
给图片加上网格:
大家看出来了吗,这些锯齿就是因为方块与方块之间的过度没处理好所造成的。
前文说过,每个方块只能有 4 种颜色,如果两个方块用的调色盘颜色差异比较大,处理不好就容易出现这种问题。
所以,背景的绘制很考验美工狮的水平。
美工狮:“总监,我实在肝不动了......”
也有很多天才的美工狮用如此苛刻的条件做出精密的作品。
比如这个场景,惊为天人,完全看不出方块的痕迹,也看不出太多重复的东西。堪
称 FC 游戏美工的典范。
总监:“嗯,干的不错,晚上加鸡腿...... 乔豆麻呆,刚才那个背景也是你画的吧?”
其实这两张图出自同一个游戏,《忍者蛙》。
我带大家复习一下这章的内容。
1.FC 画面是由方块组成,而且方块只能在拼图库里找。
2.构成背景所用的方块至少有 72% 的内容重复。
3.每个方块只能有 4 种颜色,且总共有 4 种配色方案。
那么,用 FC 到底能不能画出美女来呢?必须可以!!大家坐稳,老司机开车了。
拿走,不谢,请叫我雷锋。
现在我们已经有背景了,再加上角色,就可以愉快地游戏了。
很幸运,角色和背景一样,也是由 8x8 的方块构成,然后由 4 色调色盘上色。
为什么说幸运呢?因为我可以不用把同样的内容讲两遍了......
就用大家最熟悉的《双截龙 2》做例子。
《双截龙 2》的主角就是大家最喜爱的比利:
Oh 不,应该是这个比利:
第一章里已经对方块进行过介绍了,在这里我就直接把网格画上。(为何裆部有一块迷之凸起?)
在这里,我们就不能把这个叫做方块了,我们要叫它“活动块”(sprite)。
活动块,顾名思义,就是“可以活动的方块”,背景的方块无法灵活活动,但是,活动块就没有这个限制,所以我们控制的角色可以上天入地,无所不能。
大家可以看出,比利一共由 10 块活动块拼成。游戏里,主角,敌人,子弹等一切活动的东西都是由活动块构成。
但是,活动块也不是无限使用的,不然为何真三国无双不出 FC 版(删除这句话)?
同一个画面最多能使用 64 个活动块。而且,64 块也不能随便乱用,因为 FC 是用“行”为单位逐行输出画面的,由于机能的限制,同一行最多只能输出 8 块活动块。
那么,万一同一行活动块超过这 8 块,会怎么样呢?FC 会瞬间爆炸?
我们先来玩一个找茬的游戏。大家来找茬:
无奖竞猜,以上 3 张图有几处不同?每张图的活动块都有不同程度地缺失。想必大家已经知道答案了吧!
当同一行活动块的数量超过 8 个的时候怎么办?只要让超过部分消失就行了。
程序猿:“我是处女座,每行活动块数量绝对不能超过 8 个!”
但是,消失过狠了,这游戏就没法玩了,可以看出来,图上有 2 颗子弹,一颗红色,一颗绿色,但是 3 张图都没有把子弹显示全。也就是说,子弹隐身了。
“子弹隐身?玩毛啊!”摔手柄。
在消失活动块时有个优先级设置,优先级低的活动块消失。
程序猿在设计游戏时,通常让每个活动块的优先级轮流起来。这一帧你优先级低,你滚蛋,下一帧我优先级低,我消失,谁也不吃亏。
此时,在玩家眼里就表现出闪烁的现象。
子弹并没有消失,只是变闪了,还能愉快玩耍。
但是,FC 游戏里有一些很庞大的 BOSS,怎么解释?
《超级魂斗罗》第一关的直升机 BOSS,宽度明显已经超过 8 个活动块了,为何它
没有闪烁?
这个问题问的太好了(观众:明明是你自己问的好不好)。
我偷偷告诉大家,其实这个 BOSS 不是敌人,而是背景。
惊不惊喜,意不意外?
用背景如何做出 BOSS 来?请看下一章。
上两章内容,已经介绍了 FC 画面的基本原理,这一章就是进阶内容。
水平切割(Raster Scroll)是背景处理的一个特殊技巧,能大幅提高游戏画面效果,广泛运用于 FC 后期的大作中,由于它比较重要,所以单独列出一章。
第一章讲了背景的组成,但是这种方法组成背景有局限性。背景只能有一张,缺乏层次感。
众所周知的一个道理,离我们近的东西走的快,离我们远的东西走的慢。当所有东西都绘制在同一张背景里时,就看不出快慢的区别了。
比如这张图:
当马里奥往前走时,所有的背景(山 树 云 砖块)都是同步运动的,就像在一张巨大的墙纸前移动,没有层次感,这显然和实际生活体验不服。
玩家对画质的追求是无止境的。
但这显然难不倒我们聪明的程序猿。
前面提到过,FC 是用“行”为单位逐行输出画面,那么,在输出完一行时,重写下一行背景的横坐标,就能造成背景行的错位现象,就能实现行与行之间的相对运动。
层次感就这样处来了。
看这个图,是不是舒服多了呢?
水平切割不止能制造出层次感,还能制造出巨大的 boss 来。
回到第二章的结尾。
第二章说过,活动块有 64 个总数限制和同行 8 个限制。直接用活动块做 BOSS 就难免显得小家子气。
《忍者龙剑传 3》的这个 boss,和隼龙差不多大,没有 boss 应有的魄力。但是没办法,这是活动块所能达到的极限了。
怎么办?
中国有句古话,“活动块不够,背景来凑!”
聪明的程序猿想到了用背景充当 boss 的方法。
大家有没有发现一个有趣的现象,凡是打这些用背景做的巨大 boss 时候,背景画面都是纯色的(以纯黑色居多)。
就拿刚才的《超级魂斗罗》为例,在打 boss 前,天上有云:
走过这个房子之后,云消失了,背景变成纯黑色:
打完 boss 之后,云又回来了:
让云消失,背景变成纯黑色,就是为了利用背景来绘制 boss。
假如云没消失,boss 战时云就会跟着 boss 一起动,那就露馅了。
Boss 水平移动的问题解决了。
那么,他是如何垂直移动的呢?
比如《超级魂斗罗》的第三关的 BOSS:
从地下徐徐升起的效果是如何实现的?请看下一章。
命名表(nametable),其实,第一章和第三章的内容就是关于命名表的操作,为了能够循序渐进,所以在这里正式提出这个概念。
大家还记得第一章的这个图吗?
这就是一张命名表。
还记得第一章说过的话吗?
“整个屏幕被分成 32x28 个方块,每个方块包含一个编号,根据编号找到拼图库里对应的拼图,然后显示出来。”
FC 游戏的背景包含 2 张命名表,水平排列或者是垂直排列
比如《超级魂斗罗》第一关,就是水平排列的 2 张命名表。
半透明的那块是屏幕,也就是我们看到的部分。
然后,屏幕就在这命名表中滚动,不断刷出新的命名表。
场景看起来是无限延伸的,但命名表只有 2 张,这是不断滚动刷新的结果。
再回到第三关的 BOSS
这是垂直排列的两张命名表。
第三章提到过:“FC 是用“行”为单位逐行输出画面,那么,在输出完一行时,重写下一行背景的横坐标,就能造成背景行的错位现象,就能实现行与行之间的相对运动。”
重写背景的横坐标,就能达到水平位移的效果,那么重写纵坐标不就能达到垂直位移的效果了吗?没错。
引申一下,FC 在输出一行画面时可以决定输出命名表的任意一行画面,而不是严格按照命名表的顺序来。
BOSS 可以分成若干行,在输出画面时,第一帧输出 BOSS 的第一行,下一帧再加几行,以此类推,若干帧后 BOSS 就显示全了,这样就呈现出从地下徐徐升起的效果。
看完了前四章内容,相信大家对 FC 打画面技术有一定的了解,下面我们就进行实战吧,对一些有特殊效果的画面进行分析,运用之前学的知识,看看这些特殊效果到底是如何实现的。
FC 游戏,堪称奇技淫巧的大合集,程序猿和美工狮们大显神通,运用这孱弱的机能实现了很多不可思议的效果。玩 FC 游戏的其中一个乐趣就是,看到一个不错的画面,思考它的实现原理。我将举一些例子,在我公布答案之前,大家可以思考一下,看看聪明的你能不能猜到答案。
1.震惊!一个方块居然出现了第五种颜色
第一章曾经说过,调色盘只能用 4 种颜色,所以一个方块最多只能有 4 种颜色。
但是,请大家看这张图。
请看箭头指出的那个位置,组成龙嘴的那个方块。
大家发现了什么没有?
把方块单独拿出来,放大看看。
数数有几种颜色。
黑 白 浅绿 深绿 红!
一共 5 种颜色!
我之前说过,一个方块绝对找不出第 5 种颜色,如果找出来,奖励什么来着?赶紧私信我要奖品吧。
但是这到底是怎么实现的,莫非是用了特殊芯片不成?
我就公布答案吧。
刚才说了,中国有句古话,“活动块不够,背景来凑!”
其实美国也有句俚语,“背景不够,活动块来凑!”
没错,这第 5 种颜色就是用活动块凑出来的。
这是去掉活动块之后的样子。只剩 4 种颜色:
一口洁白的牙就这么没了。
一个方块 + 一个活动块,里最多能显示 7 种颜色。为何不是 4+4=8 种?留给聪明的观众自己思考。
FC 游戏里,活动块和背景难舍难分,背景可以做 boss 弥补活动块的数量限制,活动块也能做一部分背景弥补背景不够灵活的缺点。一些 boss 就是背景和活动块共同组成。
比如《魂斗罗》中的这个 boss,身体是背景,灵巧的双手是活动块。
活动块:“我和背景君通力合作,不信阻止不了你!”
2.两根粗又硬打架,究竟是为何?
《鸟人战队》的关底 boss 战,机器人和 boss 对打。
两者的体型都比较大,那么,他们到底是活动块构成还是背景构成?
如果是活动块构成,同行的活动块数量肯定超过 8 个了,但是却没有出现活动块消失现象。
如果是背景构成,它们就无法相对运动。
给大家一分钟思考时间。
其实答案很简单,只要把对方打败就能看出来。
把对方打败之后,出现爆炸效果。
眼尖的朋友一下子看出来了,对方没有活动块消失,而我方却出现了活动块消失现象。游玩时候很明显感受到,此时我方在闪烁,对方没有闪烁。
这是因为爆炸效果是活动块构成的,同一行的活动块增加到超过 8 个,势必会产生闪烁现象。
我方闪烁,对方没闪烁。这意味着什么?我方是活动块,对方是背景。
活动块大战背景!大家猜对了吗?
本文来自微信公众号:编码珠玑 (ID:gh_f65e0111d17a),作者:编码珠玑