首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NES编程- Nametables?

NES编程- Nametables?
EN

Stack Overflow用户
提问于 2010-06-10 07:36:27
回答 5查看 3.2K关注 0票数 12

我想知道NES是如何展示它的图形能力的。我在网上研究了一些东西并通读了一遍,但我想知道最后一件事: Nametables。

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

(假设16个8x8块) Nametable,其中A B C D=指向精灵数据的指针:

代码语言:javascript
复制
ABBB
CDCC
DDDD
DDDD

属性表,1 2 3=指向调色板数据的指针,<参考值在左边,^在上面,‘在左边和上面:

代码语言:javascript
复制
1<2<
^'^'
3<3<
^'^'

因此,在上面的示例中,块的颜色应该是这样的

代码语言:javascript
复制
1A 1B 2B 2B

1C 1D 2C 2C

3D 3D 3D 3D

3D 3D 3D 3D

现在,如果我把它放在一个固定的屏幕上-它工作得很好!因为NES分辨率是256x240像素。现在,如何调整这些表格以进行滚动?

因为Nametable 0可以滚动到Nametable 1,如果您继续滚动Nametable,Nametable 0将再次折回。我明白了。但我不明白的是,如何滚动属性表绕回。根据我在网上读到的,它为其分配属性的16x16块会在屏幕的边缘瓷砖上造成颜色失真(就像在SMB3中从左向右滚动时看到的那样)。

我担心的是,我知道如何滚动名称表,但是如何滚动属性表呢?为了方便起见,如果我在屏幕的左侧有一个绿色块,理论上向右移动屏幕应该会导致右侧的磁贴也是绿色的,直到它们移动到帧中,它们将恢复到正常的颜色。

代码语言:javascript
复制

假设我在10的扫描线Y上,这意味着我水平地将10个值读入到我的命名表中。这意味着我的第一列不在屏幕上,因为它的像素宽度只有8。但是,颜色属性保留了下来,因为它的宽度是16。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-11 22:46:17

我相信你对This site已经非常非常熟悉了。首先我要说的是,我从来没有机会为NES编程,但我对所有发布的Gameboy硬件都非常有经验,NES与GB/DMG有许多共同的怪癖。我敢打赌,你要么需要做几件事中的一件:

  1. 不滚动属性表。确保你的关卡在你移动的方向上都有相似的色块。我猜很多第一代游戏都是这么做的。
  2. 继续允许有限的属性滚动-只要确保发生变化的区域要么部分共享颜色,要么足够稀疏,这样变化就不会被注意到。
  3. 拿出你的旧skool Atari2600计时器,在HBlank更新结束时计时写入寄存器$2006,以完成你需要的颜色交换,等待几次,然后在HBlank返回期间恢复,这样下一行的左边缘就不会受到影响。我有一种感觉,这是最常用的解决方案,但没有一个真正好的模拟器和耐心,这将是一个痛苦的臀部。它还会占用你的整体CPU使用率,因为你必须在多个扫描线上等待中断才能完成你的效果。

我希望我能给你一个更具体的答案,但希望这对你有所帮助。谢天谢地,GB/DMG有一个稍微先进的滚动系统。:)

票数 2
EN

Stack Overflow用户

发布于 2010-06-12 05:22:38

当你滚动屏幕时,超级马里奥兄弟3和柯比的冒险都会在屏幕边缘显示着色的工件。我相信这两个游戏都设置了消隐屏幕左8像素的位,所以0-8像素在任何一帧上都会受到影响。

如果我没记错的话,“柯比历险记”总是试图把有颜色问题的栏目放在屏幕滚动的一侧,以使其不那么引人注目。如果不切换到垂直镜像,我不认为这些工件是可以预防的,因为垂直镜像本身就会带来困难。

免责声明:我已经五年没有写过任何NES代码了。

票数 1
EN

Stack Overflow用户

发布于 2010-12-31 01:37:55

每个nametable都有自己的属性表,因此在从一个nametable滚动到另一个nametable时应该没有图形工件。如果您的游戏同时垂直和水平滚动,那么您所指的颜色毛刺类型确实是一个问题。您只有两个nametable,因此两种方式的滚动都需要您拆分可见屏幕。这个问题有多种解决方案,可以在这篇nesdev帖子中找到一个很好的总结:

http://nesdev.parodius.com/bbs/viewtopic.php?p=58509#58509

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3010724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档