NES编程 - 名称表?

Jef*_*ern 12 sprite tile nintendo graphic

我想知道NES如何显示其图形肌肉.我已经在线研究过这些东西,并通过它阅读,但我想知道最后一件事:Nametables.

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

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

ABBB
CDCC
DDDD
DDDD
Run Code Online (Sandbox Code Playgroud)

属性表,1 2 3 =指向调色板数据的指针,<左侧引用值,上方^,左侧和上方:

1<2<
^'^'
3<3<
^'^'
Run Code Online (Sandbox Code Playgroud)

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

1A 1B 2B 2B

1C 1D 2C 2C

3D 3D 3D 3D

3D 3D 3D 3D
Run Code Online (Sandbox Code Playgroud)

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

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

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

~~~~编辑:我想指出我知道扫描线,X和Y.这个想法刚刚贯穿我的脑海.

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

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

Mic*_*gan 2

我相信您已经非常非常熟悉这个网站了。我首先要说的是,我从来没有为 NES 编程过,但我对所有已发布的 Gameboy 硬件都非常有经验,而且 NES 与 GB/DMG 有许多共同的怪癖。我敢打赌,您要么需要做以下几件事之一:

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

  2. 继续并允许有限的属性滚动 - 只需确保发生更改的区域部分颜色共享或足够稀疏以使更改不会引人注目。

  3. 拿出你的旧 skool atari 2600 计时器,并在 HBlank 更新结束时写入寄存器 $2006,以完成所需的颜色交换,等待一些抽动,然后在 HBlank 返回期间恢复,以便下一个的左边缘线路不受影响。我有一种感觉,这是最常用的解决方案,但如果没有一个真正好的模拟器和耐心,这将是一个痛苦的事情。它还会消耗一点你的整体 CPU 使用率,因为你必须在多个扫描线上的中断中等待才能完成你的效果。

我希望我能为您提供更具体的答案,但这希望能有所帮助。谢天谢地,GB/DMG 拥有稍微更先进的滚动系统。:)