【发布时间】:2011-03-01 22:38:20
【问题描述】:
我想知道 NES 如何显示其图形肌肉。我在网上研究了一些东西并通读了一遍,但我想知道最后一件事:Nametables。
基本上,根据我的阅读,NES 命名表中的每个 8x8 块都指向模式表中的一个位置,该位置保存图形内存。此外,nametable 也有一个属性表,它为每个 16x16 块设置一个特定的调色板。它们像这样连接在一起:
(假设 16 个 8x8 块) 命名表,带有 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 块会导致屏幕边缘图块的颜色失真(如在 SMB3 中从左到右滚动时看到的那样,反之亦然)。
我担心的是我了解如何滚动名称表,但是如何滚动属性表?例如,如果我在屏幕左侧有一个绿色块,理论上向右移动屏幕应该会导致右侧的图块也是绿色的,直到它们更多地移动到框架中,它们将恢复到他们的正常颜色。
~~~~编辑: 我确实想指出,我知道扫描线 X 和 Y。这个想法刚刚在我脑海中闪过。
假设我在 10 的扫描线 Y。这意味着我正在将 10 个值水平读取到我的命名表中。这意味着我的第一列不在屏幕上,因为它的像素宽度仅为 8。但是,颜色属性保持不变,因为它的宽度为 16。
假设整个列的颜色属性是绿色,我是否正确假设对用户来说,屏幕左侧的前 6 个像素将被着色为绿色,屏幕上最右边的 10 个像素应该是绿色也? 那么,我的假设是否正确,根据屏幕,左边?
【问题讨论】:
-
+1 表示很棒。我不知道,但你只是问这个就摇滚。
标签: sprite tile graphic nintendo