代码之家  ›  专栏  ›  技术社区  ›  Jeffrey Kern

旧NES应用程序上的“银行切换”精灵

  •  8
  • Jeffrey Kern  · 技术社区  · 15 年前

    我目前正在写一个C什么基本上可以称为我自己的解释NES硬件为一个老派的游戏,我正在开发。我已经启动了fce,并观察了NES如何显示和渲染图形。

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

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

    另一个例子是按mm2键暂停。在暂停期间,bg图块会被改写,然后在播放器关闭时恢复。他们是如何记住他们更换了哪些瓷砖以及如何恢复这些瓷砖的?

    如果我懒惰的话,我可以制作一个巨大的静态位图,然后以这种方式获取值。但我强迫自己限制这些价值观,以创造更真实的体验。我已经阅读了关于M.C.孩子是如何被制造出来的神奇指南,并且我正试图对我如何编写这个游戏一丝不苟。这些程序员是如何伴随着他们所做的事情来做的,这仍然让我感到困惑。

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

    1 回复  |  直到 15 年前
        1
  •  3
  •   Jeffrey Kern    15 年前

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

    给出以下数据:

     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中,我可以启动一个转换,在转换过程中加载数据。我还可以看到是否可以滚动到那个方向;例如,如果目标屏幕是-1,我就不能滚动那个方向。我还可以在某个地方存储一个标志,以确定如果滚动到该屏幕上,我就不能向后滚动。例如,我可以向右进入屏幕2,但不能向左滚动进入屏幕1。