我想知道 NES 如何展示其图形功能。我在网上研究了一些东西并通读了它,但我想知道最后一件事:名称表。

基本上,根据我所读到的内容,NES 命名表中的每个 8x8 块都指向模式表中的一个位置,该位置保存图形内存。此外,名称表还有一个属性表,为每个 16x16 块设置一定的调色板。它们像这样连接在一起:

(假设有16个8x8个块)nmetable,带有ABCD =指针以申请数据:

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。这个念头刚刚闪过我的脑海。

假设我的扫描线 Y 为 10。这意味着我正在水平读取 10 个值到我的名称表中。这意味着我的第一列超出了屏幕,因为它的像素宽度仅为 8。但是,颜色属性保留,因为它的宽度为 16。

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

有帮助吗?

解决方案

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

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

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

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

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

其他提示

两个超级马里奥兄弟3和Kirby的冒险显示器上的屏幕的边缘着色工件时滚动。相信无论游戏设定的位,用于坯料的左8个像素的屏幕上,所以0-8像素将任何一帧上受到影响。

如果我没有记错,柯比的冒险总是试图把颜色glitched列上正在滚动关闭屏幕的一侧,使其不太明显。我不认为这些工件是可以预防无需切换到垂直镜像,其自身的其引入困难。

免责声明:它已经像五年了,我写任何代码NES

每个nametable有它自己的属性表中,所以从一个nametable滚动到另一个时应该没有图形的伪影。如果你的游戏滚动垂直和水平颜色的毛刺你指的类型是真的只有一个问题。你只有两个nametables,所以滚动两种方式需要你拆的可视屏幕。对于这个问题,一个伟大的总结,其中可以在该nesdev交找到各种解决方案:

http://nesdev.parodius.com/bbs/viewtopic。 PHP?p值= 58509#58509

该网站可能有一定的帮助。 http://www.games4nintendo.com/nes/faq.php#4

(搜索 “什么与2005年/ $ 2006了?” 并开始阅读周围的区域。)

基本上,它看起来像它不可能得到它的像素完美的,但是这些都将是你可能会需要寻找到了位。

希望我能更多的帮助。

每个nametable有它自己的属性表。如果你限制你的游戏世界,只留下两个屏幕,你只需要编写nametables和属性表一次。困难的部分来当你试图使世界两个以上屏幕大。超级马里奥兄弟1通过向右滚动,缠绕在必要时,在一个时间(16个像素),之前该列映入眼帘渲染块的级别一列这样做。我不知道一个人如何有效地将这个代码(记住你只有VBLANK时间毫秒)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top