【原创】NES第六波:如何做一张NES贺卡(之二,屏幕篇)
上一篇,介绍了制作图块,包括制作字模。那么如何显示到屏幕上呢?
说到NES显示方式有两个,一是背景方式,二是精灵方式。
所谓背景方式是将图块像马赛克一样布满屏幕。你可以想像屏幕被划分成(像素大小为8*8的)网格,每个格对应一个图块序号。即该网格所显示的图块由这些序号指定。这张网格,一横行是32个格子,一共有30横行。我们用一个叫命名表的储存空间,保存这32*30个序号。序号的储存大小是字节,即图块只能是256个。
所谓精灵方式是将屏幕看成一个坐标系,原点在左上角。精灵有8*8和8*16两种,8*16的代价是占用背景图块空间。所以我下面只谈8*8的精灵(只有一个图块的)。精灵的坐标标示点在图块的左上角。例如,说某精灵的坐标是(x,y),那么说的是这精灵图块的左上角的点在屏幕的(x,y)点上。有一个空间叫SPRAM在PPU内部,从电路图上找不到,它是保存精灵数据的,它的容量256字节。而一个精灵占4字节,依次序是Y坐标,图块序号,属性,X坐标。所以精灵只能有64个。
背景有自己的图块空间,精灵也有自己的图块空间。两者合起来,我们叫VROM。各自有4K字节空间,而一个(NES方式的)图块(CHR)占16字节。每个图块只有像素8*8。所以背景VROM只有256个图块,精灵VROM也是只有256个图块。
不管是背景还是精灵,都需要配色。有一个观念需要先说明,就是NES图块不保存具体的颜色。它保存4个序号,可以对应4种颜色,具体这4种颜色是什么,要从配色指定。修改配色就能改变图块的颜色了。这样说应该能明白了。配色的部分不在图块,而是通过程序设置的。背景有自己的配色,它们是GB色盘和属性表。精灵也有自己的配色,它们是SP色盘与精灵属性的2个位。
科普得差不多了。本篇先说说背景,以后再说精灵。
本篇主要介绍制作背景的办法。
一、颜色
这里要先说说颜色。NES的颜色不是固定在图形上的,换而言之,就是图形是可以换颜色的。
我们用YYCHR打开某个chr
这图中的颜色是通过配色的。配色的色盘是在PAL SET(见右侧,图中 0F,1A,37,90)这个是可以换的。请随意在
点一下,看看效果。配色只是为了显示。CHR里面是不变的。
我们看看例子的设置。.DB $0C, $30, $16, $05,
先选定红线框里面的配色块,再到下面去选色就可以。这是让我们看看配色后的效果。你可以想让蛋糕的配色与大字母不同。那么可以用2种配色的色盘。
4个色是一个色盘。YYCHR只提供一个色盘。我们就局部的确认就行了。或者在下一步(拼接背景时)再去改 。
二、屏幕(这里主要谈“背景”)
这里有两个专用的名词:命名表,属性表。这两个是某外文资料上直译过来的。老外的论坛上也习惯这种叫法。
命名表是一个两维表,属性表是一个压缩的两维表。
图形数据是存放在VROM(或VRAM)中,图形不是以像素为单位,而是以小块单位。我们叫图块或者chr。如果图块的内容是汉字(或字母、符号),我们叫字模。
屏幕的显示是图块拼出来的。也有一些精灵显示在屏幕上。
我的知识是从《任天堂产品系统文件》上面得来的。所以推荐看这本书,在我的网盘可以下载。
背景是由命名表和属性表组成,一个命名表对应一个属性表。它们也是地址相连的。
命名表是一个索引表,即里面每个格填写的是当前VROM页中图块的(顺)序号。(这里涉及切页,不过说多了,担心吸收不了。那暂不谈切页。)
属性表的作用是为命名表配色。指定命名表的每4个格(即像素16*16)对应的色盘序号。
我以上述规则编了一个软件:“NES背景编辑器”
它可以绘画1页背景。
本软件对每个背景立一个工程,便于反复修改,工程关联一个chr( 或者叫字模)(chr也可以有多页Bank)。
前面的内容,我们知道图块是独立的,chr文件是我们自己设计也是可以自己定的。图块文件是xx.chr。从菜单中点“字模”-“导入字模”,再点选本例的chr。chr文件要与保存的工程放同一文件夹,输出也在同一文件夹。方便修改、打包或发送。
那么我们只管用2页(BANK)的chr。本软件对于chr:1BANK=4Kb,(而BANK单位在mapper上是又有不同的。)方便起见,背景选0 BANK。精灵选1 BANK。虽然未学到精灵,但是要先给它留个位置。见下图:
本例,选0,确定。那么见下图:
本软件会初始化全0。即全画面都是0号图块。所以我设计chr时,会将0号(即最左上角)设计成空白。
你想知道每个图块对应的序号?本软件当选择“单个读取”,就会显示对应序号。例如,我点选“A”,则如下图:
这5个选项各有不同,但可分成两类,前4个都是选取图块,在左边的背景面上绘画。最后一个“字模全不选,描色”,就是取消图块。
1 “单个读取”:只取当前图块(字模),显示红框,然后可以在左边背景框中,点或涂都可以。
2 “连续方块”:在图块中选2*2图块的区域,显示红框,然后在左边背景框中,某个网格是点落,绘画的结果与选框一致。这网格的方式是有用意的,这个正好与属性表的限制对应。我设计的用意也是与属性表对应。
3 “连续4竖向绘画方块”:这个你看见红框是选中ABCD,绘画的结果是。
4 “连续4横向绘画方块”:这个你看见红框是选中ABCD,绘画的结果是。
5 “字模全不选,描色”:就是取消图块,这时应勾选“显示配色”,再在下面选一个色盘,然后在背景上涂色。必定是同一个网格只能涂一个色盘,与属性表对应。
如果想擦除局部,应该选“单个读取”项,再点选一个空白的图块,就可以动手擦除。
如果想全部清空,菜单“背景”-“全置背景字模”(即用0号图块全置。)
三、配色(色盘)
上面说过在YYCHR可以设计图块的颜色,不过那只是参考。
真正的配色在本软件。背景,不管多少页,只能4个色盘。每个色盘的4个色,分别是(本软件上显示从左到右)0号、1号、2号和3号。
0号色是遮码色。背景的所有色盘的0号色都要求统一。任意一个0号色更改,所有都会变。
编辑色盘,只要双击色盘。打开编辑窗口,只要点选色块就可以更改。
用“字模全不选,描色”,再单击色盘。就可以在背景上描色(或叫涂色或配色)。
用上述方法,反复绘画;其间一个背景只能对应一个chr;其间可以保存,则保存同名的工程文件xx.nmr、背景文件xx.nam和配色文件xx.pal;最终得到一个满意的背景。
nam、pal、chr都会在后面的编程上用到。
nam是bin文件,数据包括命名表和属性表,编程时将它包含到汇编文件中,运行时将这些数据转移到ppu的命名表和属性表。两个表是地址连续的。一口气写入就行。
pal是bin文件,数据就是色盘,颜色本身就是ppu内部定义。运行时将这些数据转移到ppu的色盘地址。
对于6502sim,没有包括bin文件的伪指令,我们可以先将bin文件转成汇编数据文件。我也编了这样一个软件。讲代码再介绍。
源代码和工程下载:地址 http://fogota.ysepan.com/
找到 NES Tool Kit文件夹,各章节的相关下载都是在一起。