我想知道NES如何显示其图形肌肉。我在网上研究过这些东西并仔细阅读,但我想知道最后一件事:名字表。
基本上,根据我的阅读,NES名称表中的每个8x8块都指向模式表中的一个位置,该位置包含图形内存。此外,名称表还有一个属性表,用于为每个16x16块设置特定的调色板。他们像这样联系在一起:
(假设16个8x8块) Nametable,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块它分配的属性会导致屏幕边缘图块出现颜色失真(从左到右滚动时反之亦然,反之亦然)。
我担心的是我理解如何滚动名称表,但是如何滚动属性表?对于intsance,如果我在屏幕的左侧有一个绿色块,将屏幕向右移动理论上应该使右侧的瓷砖变为绿色,直到它们移动到框架中,然后它们将恢复到他们的正常颜色。
~~~~编辑: 我想指出我知道扫描线,X和Y.这个想法只是在我脑海中浮现。
假设我的扫描线Y为10.这意味着我正在水平地读取10个值到我的名字表中。这意味着我的第一列不在屏幕上,因为它只有8的像素宽度。但是,颜色属性保持不变,因为它的宽度为16。
假设整个列的颜色属性为绿色,我认为对用户来说是正确的,屏幕左边的前6个像素将显示为绿色,屏幕上最右边的10个像素应为绿色还有? 那么,根据屏幕左边的假设我是否正确?
答案 0 :(得分:2)
This site我相信你已经非常非常熟悉了。我将在前言中说我从来没有为NES编程,但我对所有已经发布的Gameboy硬件非常有经验,并且NES与GB / DMG共享许多,啊怪癖。我打赌你要么做以下几件事之一:
不要滚动属性表。确保您的关卡沿着您移动的方向都有类似的颜色块。我猜这很多第一代游戏都是这样做的。
继续并允许有限的属性滚动 - 只需确保发生更改的区域要么部分颜色共享,要么足够明显,以使更改不会显着。
拿出你的旧skool atari 2600计时器并在HBlank更新结束时写入注册$ 2006以获得你需要完成的颜色交换,等待一些抽搐,然后在HBlank返回期间恢复,这样下一行的左边缘不受影响。我有一种感觉,这是最常用的解决方案,但没有一个非常好的模拟器和耐心,这将是一个痛苦的屁股。它还会占用你的整体CPU使用量,因为你必须在多条扫描线上等待中断才能完成效果。
我希望我能为你提供一个更具体的答案,但希望能有所帮助。谢天谢地,GB / DMG有一个稍微高级的滚动系统。 :)
答案 1 :(得分:1)
滚动时,超级马里奥兄弟3和柯比冒险都会在屏幕边缘显示着色文物。我相信两款游戏都设置了屏幕左边8个像素的位置,因此任何一帧都会影响0-8像素。
如果我没记错的话,Kirby的冒险总是试图将屏幕上的彩色毛毡柱放在滚动的一侧,使其不那么引人注目。我不认为这些工件在没有切换到垂直镜像的情况下是可以预防的,这会引入它自身的困难。
免责声明:自从我编写任何NES代码以来已经过去了五年。
答案 2 :(得分:1)
每个名称表都有自己的属性表,因此从一个名称表滚动到另一个名称表时不应存在图形工件。如果您的游戏垂直和水平滚动,那么您所指的颜色故障类型实际上只是一个问题。您只有两个名称表,因此滚动两种方式都需要您蚕食可见屏幕。这个问题有各种解决方案,可以在这个nesdev帖子中找到一个很好的总结:
答案 3 :(得分:0)
此网站可能会有所帮助。 http://www.games4nintendo.com/nes/faq.php#4
(搜索“2005/2006年会有什么用?”并开始阅读该区域。)
它基本上看起来像是不可能使像素完美,但是那些将是你可能需要研究的部分。
希望我能得到更多帮助。
答案 4 :(得分:0)
每个名称表都有自己的属性表。如果将游戏世界限制为仅两个屏幕,则只需编写一次名称表和属性表。当你试图创造超过两个屏幕的世界时,困难的部分就出现了。超级马里奥兄弟1通过向右滚动来做到这一点,根据需要环绕,并在该列进入视野之前一次渲染一级块(16像素)。我不知道如何有效编码(记住你只有毫秒的vblank时间)。