我想知道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有很多共同之处。我敢打赌,您要么需要执行以下其中一项操作:

  • 不要滚动属性表。确保您的所有关卡在移动方向上都具有相似的色块。我猜想很多第一代游戏都是这样做的。
  • 继续并允许有限的属性滚动-只需确保正在发生更改的区域部分共享颜色或保留足够的稀疏性,以使更改不会被察觉。
  • 找出旧的skool atari 2600计时器,在HBlank更新结束时写入一次写入$ 2006的时间,以完成所需的颜色交换,等待几秒钟,然后在HBlank返回期间还原,以使HBlank的左边缘下一行不受影响。我觉得这是最常使用的解决方案,但是如果没有很好的仿真器和耐心,这将是一个麻烦。这也将占用您的总体CPU使用率,因为您必须在多条扫描线上的中断中等待才能完成效果。

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

    10-08 09:27