Memory ';银行转换';旧NES应用程序上的精灵
我目前正在用C#写一篇文章,基本上可以称之为我自己对我正在开发的一款老式游戏的NES硬件的解释。我启动了FCE,一直在观察NES是如何显示和渲染图形的 简言之,NES可以保存两个相当于图形信息的位图,每个位图的尺寸为128x128。这些被称为PPU表。一个用于BG瓷砖,另一个用于精灵。数据必须在这个内存中才能在屏幕上绘制。现在,如果一个游戏比这两个银行有更多的图形数据,它可以在每一帧结束时将这些新信息的一部分写入银行,覆盖其中的内容,并从下一帧开始使用 那么,在旧游戏中,程序员是如何“切换”银行的呢?我的意思是,在水平设计中,他们如何知道要加载哪个图形集?我注意到,当屏幕按程序从舞台的一部分滚动到下一部分时,Mega Man 2会切换。但是他们是如何在级别中存储这些信息的呢?要将哪些精灵复制到PPU表中,以及在何处写入这些精灵 另一个例子是以MM2为单位点击暂停。暂停时BG磁贴被覆盖,然后在玩家取消暂停时恢复。他们是如何记住更换了哪些瓷砖以及如何恢复这些瓷砖的 如果我很懒,我可以制作一个巨大的静态位图,然后通过这种方式获取值。但我强迫自己限制这些价值观,以创造更真实的体验。我已经阅读了关于M.C.儿童是如何制作的令人惊叹的指南,我正试图赤裸裸地讲述我是如何编写这个游戏的。这些程序员是如何用他们所拥有的来完成他们所做的事情的,这仍然让我感到不可思议Memory ';银行转换';旧NES应用程序上的精灵,memory,swap,nintendo,Memory,Swap,Nintendo,我目前正在用C#写一篇文章,基本上可以称之为我自己对我正在开发的一款老式游戏的NES硬件的解释。我启动了FCE,一直在观察NES是如何显示和渲染图形的 简言之,NES可以保存两个相当于图形信息的位图,每个位图的尺寸为128x128。这些被称为PPU表。一个用于BG瓷砖,另一个用于精灵。数据必须在这个内存中才能在屏幕上绘制。现在,如果一个游戏比这两个银行有更多的图形数据,它可以在每一帧结束时将这些新信息的一部分写入银行,覆盖其中的内容,并从下一帧开始使用 那么,在旧游戏中,程序员是如何“切换”银行
编辑:我能想到的唯一解决方案是单独保存表格,说明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)。它会说,我需要加载到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中没有的信息,我可以启动转换,在转换期间加载数据。我也能看到我是否能滚动到那个方向;e、 例如,如果目标屏幕为-1,则无法滚动该方向。我还可以在某个地方存储一个标志,以确定如果滚动到该屏幕上,我将无法向后滚动。例如,我可以直接进入第2屏,但不能向左滚动进入第1屏。谢谢这非常有用。谢谢你的夸奖:)