• 【原创】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文件转成汇编数据文件。我也编了这样一个软件。讲代码再介绍。

  • 相关阅读:
    C++ 学习笔记 (七)继承与多态 virtual关键字的使用场景
    C++ 学习笔记 (六) 继承- 子类与父类有同名函数,变量
    C++ 学习笔记(五)类的知识小结一(重载,友元函数,静态成员,new)
    C++ 学习笔记(四)类的内存分配及this指针
    C++ 学习笔记(三)string 类
    C++ 学习笔记(二) const的加强
    C++ 学习笔记(一) cout 与printf 的不同之处
    C++ 学习笔记 开篇
    Kali root用户无法登录GUI界面
    解决方案——Manjaro安装卡在Misc postinstall configurations
  • 原文地址:https://www.cnblogs.com/fogota/p/12253115.html
Copyright © 2020-2023  润新知