在游戏中渲染2D地图 - 裁剪和滚动

问题描述:

好的。 我在本质上试图对NES硬件做出我自己的解释,所以我可以制作一个理想的游戏,类似于NES游戏的样子。我目前坚持如何调整如何将视频内存拖放到显存(后台缓冲区)。在游戏中渲染2D地图 - 裁剪和滚动

后备缓冲

的NES对的nametable,或后备缓冲限制。对于我的例子,后缓冲器是256x240像素大,或一个屏幕的大小。如果我把它画到电视上,它会完美地填满屏幕。现在,如果我将它绘制到屏幕上,偏移量为X = 5,则整个图像将被移动并将围绕屏幕。

例如.....

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

DRAWN WITH OFFSET OF X=-5: 
FGHIJKABCDE 

屏幕被分成的每个正方形8×8像素,共32x30行和列。 (256x240像素)。偏移量以像素表示 - 不是列;所以在理论上,我可以将屏幕偏移5个像素,每列将向右移动5个像素。

级设计

我的阶段是由屏幕,包含在16x15的行和列,每个由16×16像素所表示的数据。这是为了模拟有多少NES游戏存储了关卡数据 - 每个瓦片拥有关于每个8x8块应该在哪里的信息。

例如为:

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

关卡设计是由这是很好的体现,每个数字是不同的屏幕和 - 没啥意思,空。

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

字符的位置 这很容易。我已经知道如何根据它们的绝对位置来确定我的角色所在的表,行和列。我也可以确定屏幕内的相对位置。

有了这个信息,我很容易找出哪些列于字符的左侧和右侧,如果有的话(如果字符是在屏幕1的左侧,thered是左没有更多的级)

这就是问题邓骏钧 我该如何在屏幕上绘制自己的关卡,让他们从一个滚动到另一个。 一次画一个全屏幕会比较容易,而当角色到达边缘时只会翻到另一个屏幕。

但是,我在概念上存在的问题是我需要将电平数据“流”到屏幕上。那可以说,角色向右移动了24个像素。 BG也需要移动。

所以,我需要调整后缓冲滚动24个像素。但是,仅滚动屏幕就会导致屏幕旋转,从而影响关卡的旧部分。所以,在滚动时,我需要确保将新的关卡绘制到后台缓冲区。但在我能做到这一点之前,我需要弄清楚哪些瓷砖需要首先绘制。如果这个人向左走24像素,我需要重新绘制瓦片到后缓冲区,并相应地改变偏移量。

另外我们不要忘记,如果角色向右移动并且没有更多等级数据要绘制,则不应该有偏移,而是角色靠近屏幕一侧(而不是居中在屏幕通过X轴)。

基本上,我只是有很多不同数量和停留在我的脑海里,现在值的 - 试图总结我的头周围的许多概念和他们造成我的大脑变成咕。任何人对我如何处理这个问题都有任何看法?

编辑:使用VB.Net。 C#是适用以及(在两个予程序)

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

通常,盒将具有巨大的表中的所有级别的数据的ROM,以及将跟踪用1或2的RAM变量的总体位置。然后,当游戏滚动时,它将更新RAM变量,使用它们查找级别数据表,并将新级别数据复制到名称表中不在屏幕上的部分。

所以实际上你的背部缓冲区应该是512x480,而你只显示它的256x240部分。

你看着拆卸任何NES游戏拥有大量滚动的世界?我认为银河战士的部分拆卸就在某处...

...是啊,发现了一些文档在romhacking.net

Metroid disassembly;不是很好的评论,但有一点点努力,找出它应该不会太难。

Another disassembly被评价更好。

编辑:在上面贴了第二拆解,看看在MetroidGameEnginePage.txt在“SetupRoom”程序和“DrawRoom”家常便饭;标签LEB4D上的例程也显示了在一种情况下如何更新名称表。还请看“GetNameTable”例程上面的大量注释。通常,在整个文档中对“名称表”进行文本搜索将为您带来更多。

EDIT编辑:另外在romhacking.net; memory map for SMB可能会有用。

+1

作为一个romhacker,我赞同这个答案。 – Kawa 2010-06-23 18:53:59

我会从一个数据库,其存储什么列和行每个图象是相对于水平设置的图像控制的网格,并加载水平。一旦表示游戏角色的图像变得足够远(您将不得不将其位置存储在某些模块级别变量中),您将加载下一列图像(同时将所有其他图像移动到离开并移除第一列)。