'银行转换'精灵在旧的NES应用程序上

时间:2010-06-13 00:06:50

标签: memory swap nintendo

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

简而言之,NES可以保存两个位图值的图形信息,每个图形信息的尺寸为128x128。这些被称为PPU表。一个用于BG瓷砖,另一个用于精灵。数据必须在此内存中才能在屏幕上绘制。现在,如果一个游戏有更多的图形数据然后这两个银行,它可以将这些新信息的一部分写入这些银行 - 在每一帧的末尾覆盖那里的东西 - 并从下一帧开始使用它。

那么,在旧游戏中,程序员的银行如何切换?我的意思是,在关卡设计中,他们是如何知道要加载哪个图形集的?当屏幕以编程方式从舞台的一部分滚动到下一部分时,我注意到Mega Man 2银行开关。但他们是如何将这些信息存储在关卡中的 - 将哪些精灵复制到PPU表中,以及在哪里写入?

另一个例子是在MM2中暂停。在暂停期间BG块会被覆盖,然后在玩家取消暂停时恢复。他们是如何记住他们更换的瓷砖以及如何恢复它们的?

如果我很懒,我可以制作一个巨大的静态位图,然后就这样获取值。但我强迫自己限制这些价值观,以创造更真实的体验。我已经阅读了有关M.C.的精彩指南。孩子们被制造出来了,我正试图成为关于我如何编程这个游戏的准系统。我仍然只是想到这些程序员如何完成他们所做的事情。

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

1 个答案:

答案 0 :(得分:3)

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

鉴于以下数据:

 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 ARRAY    PALETTE   MUSIC   TILESET  STARTINGSCR
   0            0        0        1           4
   1            4        3        2           2
   2                         etc.
   3

因此,在加载地图时,我会查看项目(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。