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

Memory ';银行转换';旧NES应用程序上的精灵,memory,swap,nintendo,Memory,Swap,Nintendo,我目前正在用C#写一篇文章,基本上可以称之为我自己对我正在开发的一款老式游戏的NES硬件的解释。我启动了FCE,一直在观察NES是如何显示和渲染图形的 简言之,NES可以保存两个相当于图形信息的位图,每个位图的尺寸为128x128。这些被称为PPU表。一个用于BG瓷砖,另一个用于精灵。数据必须在这个内存中才能在屏幕上绘制。现在,如果一个游戏比这两个银行有更多的图形数据,它可以在每一帧结束时将这些新信息的一部分写入银行,覆盖其中的内容,并从下一帧开始使用 那么,在旧游戏中,程序员是如何“切换”银行

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

简言之,NES可以保存两个相当于图形信息的位图,每个位图的尺寸为128x128。这些被称为PPU表。一个用于BG瓷砖,另一个用于精灵。数据必须在这个内存中才能在屏幕上绘制。现在,如果一个游戏比这两个银行有更多的图形数据,它可以在每一帧结束时将这些新信息的一部分写入银行,覆盖其中的内容,并从下一帧开始使用

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

另一个例子是以MM2为单位点击暂停。暂停时BG磁贴被覆盖,然后在玩家取消暂停时恢复。他们是如何记住更换了哪些瓷砖以及如何恢复这些瓷砖的

如果我很懒,我可以制作一个巨大的静态位图,然后通过这种方式获取值。但我强迫自己限制这些价值观,以创造更真实的体验。我已经阅读了关于M.C.儿童是如何制作的令人惊叹的指南,我正试图赤裸裸地讲述我是如何编写这个游戏的。这些程序员是如何用他们所拥有的来完成他们所做的事情的,这仍然让我感到不可思议


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

wSo经过一夜的思考和重新阅读文档,我想我找到了一个完美的解决方案。矩阵

鉴于以下数据:

 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)。它会说,我需要加载到PPU的X瓷砖,使用Y色托盘,Z瓷砖集,和一个音乐。它还会说屏幕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中没有的信息,我可以启动转换,在转换期间加载数据。我也能看到我是否能滚动到那个方向;e、 例如,如果目标屏幕为-1,则无法滚动该方向。我还可以在某个地方存储一个标志,以确定如果滚动到该屏幕上,我将无法向后滚动。例如,我可以直接进入第2屏,但不能向左滚动进入第1屏。

谢谢这非常有用。谢谢你的夸奖:)