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

Vb.net 在游戏中渲染2D地图-裁剪和滚动,vb.net,camera,nintendo,Vb.net,Camera,Nintendo,嗯。 我在essense尝试对NES硬件做出我自己的解释,这样我就可以制作一个理想的类似于NES游戏的游戏。我目前正忙于调整如何将游戏场绘制到视频内存(后缓冲区) BACKBUFFER NES对nametable或backbuffer有限制。例如,backbuffer的大小为256x240像素,相当于一个屏幕的大小。如果我把这个画到电视上,它会完全填满屏幕。现在,如果我以X=5的偏移量将其绘制到屏幕上,整个图像将移动并环绕屏幕 例如 ORIGINAL, NO OFFSET:

嗯。 我在essense尝试对NES硬件做出我自己的解释,这样我就可以制作一个理想的类似于NES游戏的游戏。我目前正忙于调整如何将游戏场绘制到视频内存(后缓冲区)

BACKBUFFER

NES对nametable或backbuffer有限制。例如,backbuffer的大小为256x240像素,相当于一个屏幕的大小。如果我把这个画到电视上,它会完全填满屏幕。现在,如果我以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块中应该包含哪些内容的信息

例如:

级别设计也由此表示,每个数字都是不同的屏幕,表示为空

-----
-123-
---4-
--54-
-----
字符位置 这很容易。我已经知道如何根据字符的绝对位置确定字符所基于的表、行和列。我还可以确定屏幕内的相对位置

有了这些信息,我可以很容易地判断出哪些列位于角色的左侧和右侧(如果角色位于屏幕1的左侧,那么就没有更多的左侧级别了)

所以这里有个问题,邓邓邓邓 如何将我的关卡绘制到屏幕上,以便从一个关卡滚动到下一个关卡。 一次画一个全屏是相对容易的,当角色到达边缘时,只需切换到另一个屏幕

然而,我在概念上遇到的问题是,我需要将液位数据“流”到屏幕上。也就是说,角色向右移动了24个像素。BG也需要移动

因此,我需要将backbuffer的滚动调整24像素。然而,仅仅滚动一次就会导致屏幕被覆盖,使原来的部分变浅。所以,在滚动时,我需要确保在后缓冲区中绘制新的级别片段。但在我能做到这一点之前,我需要弄清楚哪些瓷砖需要先画出来。如果此人向左移动24像素,我需要在backbuffer上重新绘制平铺,并相应地更改偏移量

并且不要忘记,如果字符向右移动并且没有更多的水平数据,就不应该有偏移,而是字符接近屏幕的边(而不是以X轴为中心在屏幕中间)。 基本上,我现在脑子里有很多不同的数字和价值观——试图把我的脑袋包围在许多概念上,它们使我的大脑变得呆滞。有人对我如何处理这个问题有什么看法吗


编辑:使用VB.Net。C#也适用(我在两者中都编程)

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

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

通常,盒式磁带在ROM中有一个巨大的表,其中包含所有的电平数据,并使用1或2个RAM变量跟踪整个位置。然后,当游戏滚动时,它会更新RAM变量,使用这些变量查找关卡数据表,并将新关卡数据复制到屏幕外的名称表部分

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

你有没有看过有大型滚动世界的NES游戏的反汇编?我认为Metroid的部分分解在某个地方

…是的,在

);评论不是很好,但只要稍加努力,就不难理解了

这样更好

编辑:在上面发布的第二次拆卸中,查看MetroidGameEnginePage.txt中的“SetupRoom”例程和“DrawRoom”例程;标签LEB4D处的例程还显示了在一种情况下如何更新名称表。还可以查看“GetNameTable”例程上面的大量注释。一般来说,在整个文档中对“名称表”进行文本搜索将获得更多信息


编辑:也在romhacking.net上;这个答案可能有用。

作为一个romhacker,我同意这个答案。
-----
-123-
---4-
--54-
-----