我想知道NES如何显示其图形肌肉。我已经在网上研究了内容并仔细阅读了,但是我想知道最后一件事:命名表。
基本上,根据我的阅读,NES名称表中的每个8x8块都指向模式表中的一个位置,该位置保存了图形内存。此外,名称表还具有一个属性表,该属性表为每个16x16块设置特定的调色板。它们像这样链接在一起:
(假设16个8x8块)
命名表,带有A B C D =指向 Sprite 数据的指针:
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像素。现在,如何调整这些表以进行滚动?
因为名称表0可以滚动到名称表1中,并且如果您继续滚动,则名称表0会再次环绕。我明白了。但是我没有得到的是如何滚动属性表。从我在网上阅读的内容来看,它为其分配属性的16x16块将导致屏幕边缘图块上的颜色失真(如在SMB3中左右滚动时所看到的,反之亦然)。
我担心的是,我了解如何滚动名称表,但是如何滚动属性表?举例来说,如果我在屏幕的左侧有一个绿色块,那么从理论上讲,将屏幕向右移动也应使右侧的图块也变为绿色,直到它们进一步移入框架为止,然后将其还原为他们的正常颜色。
~~~~编辑:
我想指出的是,我对X和Y扫描线了如指掌。
假设我的扫描线Y为10。这意味着我正在水平读取10个值到我的名称表中。那意味着我的第一列不在屏幕上,因为它的像素宽度仅为8。但是,color属性仍然存在,因为它的宽度为16。
假设整个列的color属性为绿色,那么对用户来说,屏幕左侧的前6个像素为绿色,屏幕最右边的10个像素也应为绿色,这对我来说是正确的吗?
那么,根据屏幕的左侧,我的假设是正确的吗?
最佳答案
This site我确定您已经非常非常熟悉。首先,我不会为NES编程,但是我对所有发布的Gameboy硬件都非常有经验,并且NES与GB/DMG有很多共同之处。我敢打赌,您要么需要执行以下其中一项操作:
我希望我能为您提供一个更具体的答案,但是希望可以有所帮助。谢天谢地,GB/DMG具有稍微更高级的滚动系统。 :)