在基于2D的游戏中,什么是滚动的好方法?

我正在使用Direct3D和D3DXSPRITE包装来将图块绘制到屏幕上。 我有一个瓷砖类,其中包含成员,如碰撞和瓷砖types,然后我有一个瓷砖数组,例如

瓷砖网格[256] [256];

这将是一个更好的方法?

– 将玩家拉到屏幕中央,并抵消地图绘制的位置。

– 随后用相机移动播放器。

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

如果我让相机跟随播放器,即使只有less数几个可以放在屏幕上,我是否还需要为每个网格拼贴调用spriteBatch-> Draw(…)?

在“真实”的世界单位中进行所有更新和计算,并移动相机可能是最好的。 你的spriteBatch可以自己执行剔除,但如果速度太慢,你可以尝试确定哪些拼贴需要在屏幕上显示,只绘制它们。

将相机移动到世界坐标中并让角色在世界各地移动是解决这个问题的最简单的方法,在世界坐标系下工作意味着当它归结到所有必须在其上工作的其他系统时,不需要做任何额外的计算相对坐标系统,并了解它们在世界坐标中的位置。

既然你在2D中工作,另一个好的提示是做一些空间分割,最简单的方法就是创建一个虚拟的世界网格系统,这将允许你通过在每个tile基础上关联精灵和其他资源来单独管理每个tile。本质上这个过程将是:

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

  • 决定你的世界的大小,并创建一个二维数组(可以使用一个维度,并将其作为二维数据库),每个维度表示您的世界中的所有相关资源。

  • 只从玩家所在的地区和邻居那里获取资源。

使用网格,您可以根据相对于网格起点的位置轻松找出玩家所在的平铺图。

要解决你提到的有关相机的问题,你需要让玩家和相机两个独立的系统,在相机不会比边缘瓷砖的中心更远的地方行走,所以当玩家移动到该瓷砖时,他仍然可以穿过整个瓷砖,因为他受世界坐标(即不再居中在屏幕上),但相机被locking。

我使用一个表面。 我在屏幕外创建整个世界并保持x和y坐标。 我改变这些随着玩家移动,每个框架使用x和y绘制一个1028 x 768矩形从表面到后台缓冲区。

至于其他人,我给他们一个x和y,让他们随心所欲地在世界各地移动,当绘图时,我检查是否有x和y在1028 x 768的矩形,如果是这样绘制它们(我使用纹理的人) 。

我把玩家放在屏幕的中央,检查世界的边缘是否已经到达屏幕的边缘。 在这种情况下,玩家绕屏幕移动到世界的边缘,回到中心,然后世界再次开始移动。 这似乎很难,花了我一段时间,但不是不好做。

我使用64 x 64的瓷砖,迄今为止我使用的最大的世界是50 x 60的瓷砖。

这一切都是用c ++直接完成的

代码在平铺的世界的角落里有一点痛苦是很正常的,在绘制图钉时,同时确保相机不会“离开”。 那些边缘案例基本上是实现比屏幕资源更大的基于2D瓦片世界的最迫切的事情。 如果您支持放大,并且放大到光标:D,则它变得更加复杂