我目前正在用C#编写一本基本上可以称为我自己对NES硬件的解释,用于我正在开发的老式游戏。我已经解雇了FCE并且一直在观察NES如何显示和渲染图形。
简而言之,NES可以保存两个位图值的图形信息,每个图形信息的尺寸为128x128。这些被称为PPU表。一个用于BG瓷砖,另一个用于精灵。数据必须在此内存中才能在屏幕上绘制。现在,如果一个游戏有更多的图形数据然后这两个银行,它可以将这些新信息的一部分写入这些银行 - 在每一帧的末尾覆盖那里的东西 - 并从下一帧开始使用它。
那么,在旧游戏中,程序员的银行如何切换?我的意思是,在关卡设计中,他们是如何知道要加载哪个图形集的?当屏幕以编程方式从舞台的一部分滚动到下一部分时,我注意到Mega Man 2银行开关。但他们是如何将这些信息存储在关卡中的 - 将哪些精灵复制到PPU表中,以及在哪里写入?
另一个例子是在MM2中暂停。在暂停期间BG块会被覆盖,然后在玩家取消暂停时恢复。他们是如何记住他们更换的瓷砖以及如何恢复它们的?
如果我很懒,我可以制作一个巨大的静态位图,然后就这样获取值。但我强迫自己限制这些价值观,以创造更真实的体验。我已经阅读了有关M.C.的精彩指南。孩子们被制造出来了,我正试图成为关于我如何编程这个游戏的准系统。我仍然只是想到这些程序员如何完成他们所做的事情。
编辑:我能想到的唯一解决方案是保存单独的表,说明PPU在什么时候应该在哪些区域,但我认为这将是一个巨大的内存资源,NES将无法处理答案 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。