好的。我本质上试图对NES硬件做出自己的解释,因此我可以制作一款理想的游戏,它类似于NES游戏的外观。目前,我坚持如何调整如何将播放场绘制到视频内存(后缓冲区)。

backuffer

NES对命名或骨架有限制。就我的示例而言,骨架为256x240pixel,或一个屏幕的大小。如果我将其吸入电视,它将完美地填充屏幕。现在,如果我以x = 5的偏移将其吸引到屏幕上,则整个图像将被移动并在屏幕上缠绕。

例如.....

ORIGINAL, NO OFFSET:                      DRAWN WITH OFFSET OF X=5:
ABCDEFGHIJK                               GHIJKABCDEF

DRAWN WITH OFFSET OF X=-5:
FGHIJKABCDE

屏幕分为正方形8x8像素,总计32x30行和列。 (256x240像素)。偏移以像素为代表 - 而不是列;因此,从理论上讲,我可以将屏幕用5个像素将屏幕抵消,并且每个列将用5个像素向右移动。

关卡设计

我的阶段由屏幕组成,其中包含在16x15行和列中表示的数据,每个数据以16x16像素为单位。这是为了模拟多少NES游戏存储级别的数据 - 每个瓷砖都有有关每个8x8块中应有的信息。

例如:

AA
BC     with A,B,C,D representing what 8x8 graphic should go where

级别的设计也代表了这一点,每个数字都是一个不同的屏幕,并且 - 没有任何意思,无效。

-----
-123-
---4-
--54-
-----

角色放置这很简单。我已经知道如何根据它们的绝对定位来确定角色所在的表格,行和列。我还可以确定屏幕中的相对定位。

有了此信息,我可以轻松地找出字符的左侧和右侧的列(如果有的话)

所以这是Dun Dun Dun的问题我如何将我的关卡绘制到屏幕上,以便它们从一个滚动到另一个滚动。一次绘制一个全屏幕相对容易,当角色到达边缘时,只需翻转另一个屏幕。

但是,我从概念上遇到的问题是,我需要将级别数据“流”到屏幕上。那就可以说角色向右移动24像素。 BG也需要移动。

因此,我需要通过24像素来调整Backbuffer的滚动。但是,仅仅滚动就会导致屏幕包裹,并在该级别的旧部分外交。因此,在滚动时,我需要确保将新的水平绘制到后缓冲区。但是在我这样做之前,我需要弄清楚首先需要绘制哪些瓷砖。而且,如果该人的左侧24像素,我需要将瓷砖重新贴在后背上,并也相应地更改偏移量。

而且,不要忘记,如果角色移动正确并且没有更多的级别数据要绘制,则不应有偏移,而是角色更靠近屏幕的侧面(而不是通过通过该字符的中心在屏幕中间x轴)。

基本上,我现在只有很多不同的数字和价值观 - 试图围绕许多概念缠住我的头,它们使我的大脑变成了粘糊糊。有人对我如何处理这个看法有什么看法吗?

编辑:使用vb.net。 C#也适用(我在两者中都有程序)

有帮助吗?

解决方案

NES的方式是4个名称表,每张256x240。当您从屏幕上滚出一个时,相邻的一个会滚动。要获得大于512x480的“世界”,您可以在屏幕外的位置上更新名称表。

通常,墨盒将在ROM中具有巨大的桌子,并具有所有级别的数据,并将使用1或2个RAM变量跟踪整体位置。然后,当游戏滚动时,它将更新RAM变量,使用这些变量来查找级别数据表,并在新级别的数据中复制到屏幕外的名称表的一部分中。

因此,实际上您的后缓冲区应为512x480,并且仅显示其中的256x240部分。

您是否查看了任何具有庞大滚动世界的NES游戏的拆卸?我认为部分银河部的部分拆卸在某个地方...

...是的,在 romhacking.net

银河战士拆卸;并不是真正的评论,但是稍作努力,不难弄清楚。

另一个拆卸 评论更好。

编辑:在上面发布的第二次拆卸中,在“设置室”例程和“抽屉”例程中查看MetroidGameEnginePage.txt;同样,Label Leb4d的例程显示了如何在一种情况下更新名称表。还要查看上面的“可获取”例程的广泛评论。通常,整个文档中查找“名称表”的文本搜索将为您带来更多信息。

编辑编辑:也在romhacking.net上;这 SMB的内存图 可能有用。

其他提示

我将设置图像控件的网格,并从数据库中加载级别,该数据库存储每个图片相对于级别的列和行。一旦代表游戏角色的图像就足够远到右侧(您必须将其位置存储在某些模块级变量中),您将加载下一个图像列(同时将所有其他图像移动到向左删除第一列)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top