9

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

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

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

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

如果我很懒惰,我可以制作一个巨大的静态位图并以这种方式获取值。但我强迫自己限制这些价值观,以创造更真实的体验。我已经阅读了关于如何制作 MC Kids 的精彩指南,并且我正在尝试对我如何编程这个游戏进行准系统。这些程序员是如何利用他们所拥有的东西完成他们所做的事情,这仍然让我感到难以置信。

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

4

1 回答 1

3

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)。它会说我需要将 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。

于 2010-06-13T20:46:10.050 回答