在基于二维图块的游戏中,滚动的好方法是什么?


9

我将D3DXSPRITE包装器与Direct3D配合使用,将图块绘制到屏幕上。我有一个图块类,其中包含诸如碰撞和图块类型的成员,然后我有一个图块数组,例如

平铺网格[256] [256];

哪种方法更好?

-将播放器绘制在屏幕中央,并在地图绘制位置偏移。

-使用以下摄像机移动播放器。

我使用的是第一种方法,但是当您到达地图的左上边缘以及其他玩家/敌人同时在地图上移动时,它变得非常复杂

如果我让摄像机跟随播放器,即使屏幕上只能容纳几个网格块,我是否也必须为每个单个网格块调用spriteBatch-> Draw(...)?

Answers:


4

最好以“真实”世界单位进行所有更新和计算并移动相机。您的spriteBatch本身可能会执行剔除,但是如果速度太慢,您可以尝试确定需要在屏幕上显示哪些图块,并仅绘制这些图块。


您可能想要编写代码以仅绘制那些可见的精灵,尤其是当您发现需要增加网格的大小时。

2

在世界坐标系中移动摄像机并使角色在世界范围内移动是解决此问题的最简单方法,在世界坐标系中工作意味着您可以将其归结为必须在一个坐标系下工作的所有其他系统,而无需进行任何额外的计算。相对坐标系统,还可以了解它们在世界坐标中的位置。

由于您是在2D模式下工作的,另一个不错的技巧是进行空间分区,最简单的方法是创建虚拟世界网格系统,这将允许您通过在每个图块的基础上关联精灵和其他资源来分别管理每个图块,因此本质上,该过程将是:

  • 创建一些图块类,该类可以保存图块的边界坐标以及特定图块可能需要的任何资源(精灵,敌人等)。

  • 确定世界的大小并创建2D瓷砖阵列(您可以使用一个尺寸并将其作为2D进行访问),每个瓷砖代表所有与您相关的资源,代表您的世界。

  • 仅从玩家所在的区域及其邻居中抽取资源。

使用网格,您可以根据相对于网格起始位置的位置,轻松找出玩家所在的瓷砖。

要解决您提到的有关摄像头的问题,您需要使播放器和摄像头成为两个独立的系统,使摄像头的行进不会超出边缘图块的中心,因此当播放器行进到该图块时,他仍然可以在整个整个图块受世界坐标约束(即不再居中于屏幕),但相机已锁定。


0

我用表面。我在屏幕外的表面上创建整个世界,并保持x和y坐标。我随着播放器的移动更改它们,每个帧使用x和y从表面到后缓冲区绘制1028 x 768矩形。

至于其他人,我给他们一个x和y并让他们随心所欲地在世界范围内移动。在绘制时,我检查x和y是否在1028 x 768矩形中,是否绘制出来(我对人使用纹理) 。

我将播放器放在屏幕中央,并检查世界边缘是否已到达屏幕边缘。在这种情况下,玩家会在屏幕周围移动到世界的边缘并回到中心,然后世界再次开始移动。这似乎很艰难,花了我一段时间,但做起来还不错。

我使用的是64 x 64的图块,到目前为止,我使用的最大的世界是50 x 60的图块。

这一切都是使用C ++在Direct X中完成的


1
这似乎是一个巨大的记忆猪。一旦开始想要做一些事情,例如为您的世界设置多个(动画)层,然后将其扩展到比现在更大的范围,将整个世界置于屏幕外的屏幕上将使您陷入内存问题。保留有关世界的信息并仅在需要绘制时才绘制需要绘制的零件/对象会更好。只是我的2美分。:)
理查德·马斯克

@Drackir我想你误会了。只有世界不在屏幕上,需要时,像其他人一样被跟踪并绘制在后台缓冲区中。我也看不到自己做的世界超过70 x 70。当我说世界时,我指的是区域,它可能是城镇,地牢或房屋内部,当玩家在它们之间移动时,屏幕外表面将被重建。是的,它需要内存,但是现代Terrabite驱动器上的2D磁贴使其可以忽略不计,几秒钟的加载对于平滑滚动和动画来说是很小的代价。但是是的,有更好更好的方法:)
Skeith 2011年

表面应存储在GFX卡内存中,而不是硬盘驱动器上。但是,我相信如果GFX卡的内存太大,它将把表面移到HD上,这会大大减慢速度。诚然,自从我处理这些东西已经有一段时间了,所以我不记得它是如何工作的,但是我想,只要您画的不是一个太大的世界,就可以了。:)
理查德·马斯克

@Drackir有趣的是,我从来没有想过那样。我发现,这种方式给我带来了更流畅的滚动效果,如果我动态绘制新的贴图,那么我认为它还可以,但是我必须研究一下。
Skeith,2011年

我当时在开发一款具有31x31的地图的游戏,但它们并排连接在一起。我正在尝试使用其他人的引擎,他们会绘制围绕玩家所在地图的所有地图。总共有九张地图 每张地图都有几层(我认为是6层)。因此,每次用户切换地图时,就像绘制31x31x9x6 = 51894瓦片(当然是最大值;并非所有瓦片都已满)。这对我来说是一个极大的减慢,因此我重写了绘制例程,仅将播放器周围的图块绘制到距屏幕边缘至少1个图块的位置(以在移动时处理部分图块)。
理查德·马斯克

0

在确定要绘制的领带时,同时确保摄像头不会“脱离世界”时,代码在平铺世界的角落中有些痛苦是很正常的。这些边缘情况基本上是实现比屏幕分辨率更大的基于2D切片的世界的最麻烦的事情。如果支持放大和缩放到光标:D,它将变得更加复杂。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.