我目前正在用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。