NES编程 - 名称表?

时间:2010-06-09 23:36:27

标签: sprite tile graphic nintendo

我想知道NES如何显示其图形肌肉。我在网上研究过这些东西并仔细阅读,但我想知道最后一件事:名字表。

基本上,根据我的阅读,NES名称表中的每个8x8块都指向模式表中的一个位置,该位置包含图形内存。此外,名称表还有一个属性表,用于为每个16x16块设置特定的调色板。他们像这样联系在一起:

(假设16个8x8块) Nametable,A B C D =指向精灵数据的指针:

ABBB
CDCC
DDDD
DDDD

属性表,其中1 2 3 =指向调色板数据的指针,<引用左边的值,^上面和'左边和上面:

1<2<
^'^'
3<3<
^'^'

因此,在上面的示例中,块将被着色为

1A 1B 2B 2B

1C 1D 2C 2C

3D 3D 3D 3D

3D 3D 3D 3D

现在,如果我在一个固定的屏幕上有这个 - 它很棒!因为NES分辨率是256x240像素。现在,如何调整这些表以进行滚动?

因为Nametable 0可以滚动到Nametable 1,如果你继续滚动Nametable 0会再次回滚。我得到了。但我没有得到的是如何滚动属性表包装。根据我在网上看到的,16x16块它分配的属性会导致屏幕边缘图块出现颜色失真(从左到右滚动时反之亦然,反之亦然)。

我担心的是我理解如何滚动名称表,但是如何滚动属性表?对于intsance,如果我在屏幕的左侧有一个绿色块,将屏幕向右移动理论上应该使右侧的瓷砖变为绿色,直到它们移动到框架中,然后它们将恢复到他们的正常颜色。

~~~~编辑: 我想指出我知道扫描线,X和Y.这个想法只是在我脑海中浮现。

假设我的扫描线Y为10.这意味着我正在水平地读取10个值到我的名字表中。这意味着我的第一列不在屏幕上,因为它只有8的像素宽度。但是,颜色属性保持不变,因为它的宽度为16。

假设整个列的颜色属性为绿色,我认为对用户来说是正确的,屏幕左边的前6个像素将显示为绿色,屏幕上最右边的10个像素应为绿色还有? 那么,根据屏幕左边的假设我是否正确?

5 个答案:

答案 0 :(得分:2)

This site我相信你已经非常非常熟悉了。我将在前言中说我从来没有为NES编程,但我对所有已经发布的Gameboy硬件非常有经验,并且NES与GB / DMG共享许多,啊怪癖。我打赌你要么做以下几件事之一:

  1. 不要滚动属性表。确保您的关卡沿着您移动的方向都有类似的颜色块。我猜这很多第一代游戏都是这样做的。

  2. 继续并允许有限的属性滚动 - 只需确保发生更改的区域要么部分颜色共享,要么足够明显,以使更改不会显着。

  3. 拿出你的旧skool atari 2600计时器并在HBlank更新结束时写入注册$ 2006以获得你需要完成的颜色交换,等待一些抽搐,然后在HBlank返回期间恢复,这样下一行的左边缘不受影响。我有一种感觉,这是最常用的解决方案,但没有一个非常好的模拟器和耐心,这将是一个痛苦的屁股。它还会占用你的整体CPU使用量,因为你必须在多条扫描线上等待中断才能完成效果。

  4. 我希望我能为你提供一个更具体的答案,但希望能有所帮助。谢天谢地,GB / DMG有一个稍微高级的滚动系统。 :)

答案 1 :(得分:1)

滚动时,超级马里奥兄弟3和柯比冒险都会在屏幕边缘显示着色文物。我相信两款游戏都设置了屏幕左边8个像素的位置,因此任何一帧都会影响0-8像素。

如果我没记错的话,Kirby的冒险总是试图将屏幕上的彩色毛毡柱放在滚动的一侧,使其不那么引人注目。我不认为这些工件在没有切换到垂直镜像的情况下是可以预防的,这会引入它自身的困难。

免责声明:自从我编写任何NES代码以来已经过去了五年。

答案 2 :(得分:1)

每个名称表都有自己的属性表,因此从一个名称表滚动到另一个名称表时不应存在图形工件。如果您的游戏垂直和水平滚动,那么您所指的颜色故障类型实际上只是一个问题。您只有两个名称表,因此滚动两种方式都需要您蚕食可见屏幕。这个问题有各种解决方案,可以在这个nesdev帖子中找到一个很好的总结:

http://nesdev.parodius.com/bbs/viewtopic.php?p=58509#58509

答案 3 :(得分:0)

此网站可能会有所帮助。 http://www.games4nintendo.com/nes/faq.php#4

(搜索“2005/2006年会有什么用?”并开始阅读该区域。)

它基本上看起来像是不可能使像素完美,但是那些将是你可能需要研究的部分。

希望我能得到更多帮助。

答案 4 :(得分:0)

每个名称表都有自己的属性表。如果将游戏世界限制为仅两个屏幕,则只需编写一次名称表和属性表。当你试图创造超过两个屏幕的世界时,困难的部分就出现了。超级马里奥兄弟1通过向右滚动来做到这一点,根据需要环绕,并在该列进入视野之前一次渲染一级块(16像素)。我不知道如何有效编码(记住你只有毫秒的vblank时间)。