为2D游戏创建地图的最佳方法?


16

对于主观的“最佳”关键字,我深表歉意。

我和我的朋友已经开始创建2D冒险游戏。它是自上而下的口袋妖怪或塞尔达风格(只是透视图)。我们一直在讨论创建一个大型世界地图的方法,玩家可以在不拖累我们机器的存储能力的情况下进行遍历。

我们的第一个冲动是在要加载内容的播放器周围创建一个大地图和一个圆圈。我们认为这不会持续很长时间,因此决定将地图划分为多个部分。首先,我们有四个大的部分,但是意识到我们可以将其分解为许多小部分。

我从SNES播放了一些《塞尔达传说》,发现在移动地图期间,此时可以加载内容。我的意思是,我们不只是检查矩形区域中要加载的数据,而是将地图分割成许多微小的块,以便在从地图部分移动到地图部分时加载和卸载数据。

今天,他告诉我他想创建一个简单的2D数组贴图[WIDTH] [HEIGHT],其中包含游戏中每个网格的数据,并且是我们不需要的数据的恒定保存到磁盘的操作。

我不确定这些想法,并认为我可能会在这里。与该主题有关的任何链接,资源或教程都将不胜感激,并且可以直接回答我们有关如何有效实现的问题。


您正在使用什么机器?
David Titarenco,2010年

到目前为止,带有C ++的Windows已使用SFML(SFML可能会更改; C ++不会更改)。我们的目标不是可移植的atm。
IAE 2010年

2
如果您要在NES上使用老式的Zelda,请使用仅1屏幕地图。小地图可以帮助玩家专注于意图的范围(即在地牢中,您只在处理您的房间。在《暗黑破坏神》中,怪物没有上下移动),如果他们搜索了整个区域,便可以感觉到完成像FAllout3和Oblivion这样的开放空间游戏不会给你。
Stephen Furlani 2010年

Answers:


27

首先,估计您的地图大小。不要仅仅假设“大世界”将无法容纳在内存中。如今,绝对可以接受占用内存超过10 mb的地图,并且您可以在基于图块的简单2D世界中以10 mb填充很多LOT。

如果你有一个真正的大的世界里,最可靠的解决方案确实是使用地图块。将您的世界分成固定大小的块(例如64x64)。在玩家四处移动时即时加载大块,保持至少一个大块在各个方向上加载(即加载玩家所在的大块及其所有邻居)。

至于卸载块,您可以选择几种策略。急切地卸载意味着您​​将在播放器足够远的那一刻卸载所有块并将其保存到磁盘上。但是您也可以延迟卸载以提高性能(保存块,因为进行任何磁盘访问都是一项昂贵的操作)。


6
一些说明性的数学运算:10MB的Tile * s可以为您提供一个正方形,每边1616个瓦片。原始的《塞尔达传说》地图的长边是256个图块,而短边则不到一半-因此,在具有这种内存使用情况的情况下,您的地图可能比第一个《塞尔达传说》大36倍以上。您是否真的准备制作这么多内容?(编号)

@ user744该评论令人难以置信。要创建地图,您不仅需要指向图块的指针。您还需要存储图块包含的数据。并非每个2D游戏都有一定数量的预定义固定图块。
Jeroen

5

就个人而言,我将使用诸如TileEd之类的指定平铺编辑器来构建地图。这种方法产生了一些好处:

  • 使用更少的资源。您只需加载带有索引的磁贴纸和数据文件即可构建可能无休止的地图。
  • 由于您会将地图分成非常小的块(取决于您的图块大小),因此您可以在角色穿越世界时轻松添加/删除行/列。
  • 具有描述您的地图的数据文件还可以使您轻松添加地形信息。这允许使用不同的瓷砖类型,例如墙壁或湖泊(即障碍物)或沼泽,其中角色的移动可能会减慢...
  • 最后但并非最不重要的一点是,基于图块的地图在以后编辑和调整时也更加容易,因为您始终可以启动编辑器,更改某些内容并保存新的数据文件。

我建议您避免在游戏过程中加载地图的某些位,以防止出现延迟。如前所述,这不是必需的,因为您可能可以将磁贴纸保留在内存中。当角色进入“世界”的另一部分时,您可以将图块替换为另一张图块(例如,雪砖替换为沙漠砖)。

将图块拖到屏幕上可能是渲染地图的最快方法。我不知道SFML,但是从他们网站上的文档中,您应该研究Sprite该类或使用该类的Copy功能Image

更新:我只是阅读了一些SFML文档,为确保性能,您绝对应该使用DrawableSprite代替处理图像。显然那里有一个Tiled SFML加载器。这可能是使某件事快速启动并运行的好方法。


1

首先,将地图尺寸设定为能够讲述您希望游戏讲述的故事所需的大小。在人们玩游戏所需的最低规格的计算机上进行测试。如果速度太慢,请分析并优化。



-3

除非您打算重新构建ultima-online(《辐射3》或《 Ob灭》),否则没有任何理由需要世界无缝。鲍德之门(Baldur's Gate)和冰风谷(Icewind Dale)是两个想到的游戏,它们实现了有效的地图,且不会影响游戏性。

诚然,您的计算能力比他们高得多,因此加载屏幕应该是最小的,但是即使Fallout和Oblivion也可以加载某些屏幕。

我只能告诉你的是,对我来说,我正在为iPhone编写一个小的Obj-C库,它需要一个32x32的图块集并将其绘制到NSImage中。我以这种方式获得大约10fps,并且我可能应该使用OpenGL,但是如果角色移出矩形,则只需要重新绘制即可。

您应该将地图分成9个屏幕尺寸(对我来说是960x640块),因此,如果角色移出中心块,我会将9个屏幕重新绘制成大图像(约1.2MB-会提供很多低于iPhone 3G的20MB限制)。发生的速度相当慢(比10fps慢得多),因此重画在播放过程中并不明显。

我可能会在某个时候使用OpenGL ES,但现在它可以正常工作。


[编辑]

请允许我澄清。

9屏幕背景的绘制算法需要0.1秒(平展10fps)。除非您的播放器能在不到十分之一秒的时间内遍历整个屏幕,否则重画在播放过程中是不可察觉的。


仅仅因为10fps可以被您的游戏接受并不意味着它是一个好主意,尤其是在像iPhone这样的功率受限的设备上。您可能要进行零次重绘,让GPU端处理光栅化,并实际上让程序花费一些时间进行睡眠,因此手机不会变热或耗尽电池寿命。

@Joe Wreschnig ... ??? 我说过,当播放器移动屏幕时,它会按需绘制,否则UIImageView的背景图像不会被重绘,从而节省了处理能力。您的评论没有道理。
Stephen Furlani 2010年

我并没有对游戏所需的fps提出任何要求。我是说,OpenGL可以为这种情况提供60fps(确实,您甚至不谈论静态场景和OpenGL的“重绘”)-如果您只需要10fps,那么使用OpenGL就不会浪费电池电量。其他“ 50帧”。在GPU加速的世界中,您的绘制方法非常浪费。这在PC上可能没问题,但在耗尽电池电量时不行。

@乔,我仍然不确定你在说什么。它绘制图像。然后将图像放置到游戏者到达边界为止,然后重新绘制新图像。这如何浪费电池寿命?它仅按需“绘制”,其余时间使用UIImageView的本机绘制算法绘制视图。
Stephen Furlani 2010年
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.