我目前正在用C#编写,对于我正在开发的老式游戏,基本上可以称为我自己对NES硬件的解释。我已经启动了FCE,并且一直在观察NES如何显示和渲染图形。

简而言之,NES可以容纳两个位图值的图形信息,每个位图的尺寸为128x128。这些称为PPU表。一个用于BG瓷砖,另一个用于 Sprite 。数据必须在此存储器中才能在屏幕上绘制。现在,如果一个游戏具有比这两个库更多的图形数据,它可以在每一帧的末尾将这些新信息的一部分写到这些库中(覆盖那里的内容),并从下一帧开始使用。

那么,在旧游戏中,程序员是如何“银行转换”的?我的意思是,在关卡设计中,他们怎么知道要加载哪个图形集?我注意到,当屏幕从舞台的一部分滚动到另一部分时,《洛克人2》将切换。但是他们如何将这些信息存储在关卡中-将哪些 Sprite 复制到PPU表中以及在何处写入它们?

另一个示例是MM2中的暂停。 BG磁贴在暂停期间会被覆盖,然后在播放器取消暂停时恢复。他们如何记得自己更换了哪些瓷砖以及如何恢复它们?

如果我很懒,我可以制作一个巨大的静态位图,然后以这种方式获取值。但是,我强制自己限制这些值,以创建更真实的体验。我已阅读了有关MC的惊人指南 children 是制作出来的,而我正试图成为我如何编写此游戏的准系统。仍然让我感到困惑,这些程序员如何将自己的所作所为与所拥有的东西相提并论。

编辑:我能想到的唯一解决方案是持有单独的表,该表说明什么时候在PPU中应该有哪些图块,但是我认为这将是NES无法处理的巨大内存资源。

最佳答案

因此,经过一夜的思考和重新阅读文档后,我想出了一个完美的解决方案。矩阵!

给定以下数据:

 3, -1, -1, -1, -1
-1,  0,  1,  2, -1
-1, -1, -1,  3, -1
-1, -1,  5,  4, -1
-1, -1, -1, -1, -1

我可以使用此信息来访问查找表中的信息,以确定我需要哪些信息。第一个条目(0,0)定义了整个 map ,而其他值则定义了该特定屏幕中所需的内容。
MAP ARRAY    PALETTE   MUSIC   TILESET  STARTINGSCR
   0            0        0        1           4
   1            4        3        2           2
   2                         etc.
   3

因此,在加载 map 时,我将查看项目(0,0)。它将说我需要将X个图块加载到PPU中,使用Y色调色板,Z个图块和A音乐。它还将说屏幕0是开始屏幕,并且级别从那里开始-相应地定位字符。
   SCREEN     PALETTE    TILESET   MUSIC   TILEDATA  SCROLLL SCROLLR SCROLLU SCROLLD
      0           0          1       2         4       true     true    true    true
      1                   etc
      2           2          1       2         3       false   false     false  true

现在说我需要转换屏幕。我可以看一下当前屏幕与目标屏幕。如果新屏幕需要的信息不在PPU中,我可以发起一个过渡,该过渡将在过程中加载数据。我还可以查看是否可以朝那个方向滚动;例如,如果目标屏幕为-1,则无法滚动该方向。我还可以在某处存储一个标志,以确定如果滚动到该屏幕上就无法后退。例如,我可以右转到屏幕#2,但不能向左滚动到屏幕1。

10-05 18:13