我想知道NES是如何展示它的图形能力的。我在网上研究了一些东西并通读了一遍,但我想知道最后一件事: Nametables。
基本上,根据我所读到的内容,NES名称表中的每个8x8块都指向模式表中的一个位置,其中包含图形内存。此外,nametable还具有一个属性表,该属性表为每个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,Nametable 0将再次折回。我明白了。但我不明白的是,如何滚动属性表绕回。根据我在网上读到的,它为其分配属性的16x16块会在屏幕的边缘瓷砖上造成颜色失真(就像在SMB3中从左向右滚动时看到的那样)。
我担心的是,我知道如何滚动名称表,但是如何滚动属性表呢?为了方便起见,如果我在屏幕的左侧有一个绿色块,理论上向右移动屏幕应该会导致右侧的磁贴也是绿色的,直到它们移动到帧中,它们将恢复到正常的颜色。
假设我在10的扫描线Y上,这意味着我水平地将10个值读入到我的命名表中。这意味着我的第一列不在屏幕上,因为它的像素宽度只有8。但是,颜色属性保留了下来,因为它的宽度是16。
假设整列的颜色属性为绿色,那么对于用户来说,屏幕左侧的前6个像素应该是绿色的,屏幕上最右侧的10个像素也应该是绿色的,这样的假设是否正确?那么,根据屏幕上的左侧,我的假设是否正确?
发布于 2010-06-11 22:46:17
我相信你对This site已经非常非常熟悉了。首先我要说的是,我从来没有机会为NES编程,但我对所有发布的Gameboy硬件都非常有经验,NES与GB/DMG有许多共同的怪癖。我敢打赌,你要么需要做几件事中的一件:
我希望我能给你一个更具体的答案,但希望这对你有所帮助。谢天谢地,GB/DMG有一个稍微先进的滚动系统。:)
发布于 2010-06-12 05:22:38
当你滚动屏幕时,超级马里奥兄弟3和柯比的冒险都会在屏幕边缘显示着色的工件。我相信这两个游戏都设置了消隐屏幕左8像素的位,所以0-8像素在任何一帧上都会受到影响。
如果我没记错的话,“柯比历险记”总是试图把有颜色问题的栏目放在屏幕滚动的一侧,以使其不那么引人注目。如果不切换到垂直镜像,我不认为这些工件是可以预防的,因为垂直镜像本身就会带来困难。
免责声明:我已经五年没有写过任何NES代码了。
发布于 2010-12-31 01:37:55
每个nametable都有自己的属性表,因此在从一个nametable滚动到另一个nametable时应该没有图形工件。如果您的游戏同时垂直和水平滚动,那么您所指的颜色毛刺类型确实是一个问题。您只有两个nametable,因此两种方式的滚动都需要您拆分可见屏幕。这个问题有多种解决方案,可以在这篇nesdev帖子中找到一个很好的总结:
http://nesdev.parodius.com/bbs/viewtopic.php?p=58509#58509
https://stackoverflow.com/questions/3010724
复制相似问题