题
我目前正在写在C#什么基本上可以要求一个老派我的NES硬件的自己的解释看的比赛,我正在开发。我已经解雇了FCE,并已观察NES如何显示和渲染的图形。
在简而言之,NES可容纳两个位图值得的图形信息,每个具有128×128的尺寸。这些被称为PPU表。一个是对BG砖,另一个是为精灵。该数据必须是在此内存为它在屏幕上绘制。现在,如果一个游戏有更多的图形数据则这两个银行,它可以写的这个新的信息到这些银行-overwriting那儿有什么部分 - 在每个帧的结束,并从下一帧以后使用它
所以,在老游戏是怎么做程序员的银行开关“?我的意思是,设计水平之内,他们怎么知道哪个图形集加载?我注意到,洛克人2个bankswitches当屏幕滚动编程从舞台的一个部分到下一个。但是他们怎么存储在级别信息 - 什么精灵复制过入PPU表,并在那里对他们在写
另一个例子是击中MM2暂停。暂停期间BG瓷砖克服写,然后当得到恢复玩家取消暂停。他们是如何记住哪些瓷砖取代它们,以及如何恢复呢?
如果我是个懒人,我可以只让一个巨大的静态位图,只是抢值的方式。但我强迫自己要限制这些值来创建一个更真实的体验。我读过关于如何M.C.惊人指南孩子们已经作出,我想是我如何编程这个游戏准系统。它仍然只是博格尔斯我的脑海里,这些程序员如何accomplisehd他们做了什么与他们有什么。
编辑:我能想到的唯一的解决办法是保持独立的表是什么状态瓷砖应在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)。它会说我需要加载X瓦到PPU,使用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
现在可以说,我需要转换画面。我可以看看当前屏幕VS目标屏幕。如果新的屏幕需要的信息不在PPU,我可以启动它会在加载数据的转换。我也可以看到,如果我可以滚动到该方向;例如,如果目标屏幕是-1,我不能滚动该方向。我还可以存储一个标志的地方来确定,如果滚动到该屏幕上,我不能回卷。 E.g,我可以去右为屏幕#2,但不能向左滚动到屏幕1。