2

好的,事情就是这样。最近我决定我想了解随机地图生成的工作原理。我找到了一些论文和一些论据。最有趣的是“钻石平方算法”和“中点位移”。我仍然必须尝试将它们应用于软件,但除此之外,我遇到了这个网站:http ://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/

如您所见,这个想法是使用多边形。但我不知道如何应用基于 Tile 的地图,甚至不知道如何使用我拥有的工具(c++ 和 sdl)创建这些多边形。我假设没有办法做到这一点(如果我错了,请纠正我。)但如果我不是,非平铺地图如何工作,以及这些多边形是如何生成的?

4

2 回答 2

5

这个答案不会直接给你你正在寻找的答案,但希望能让你足够接近!

问题

我认为阻碍你的是如何表示数据。您可能已经习惯了仅表示每个图块类型的 2D 网格。如您所知,这可以很好地处理基于图块的地图,但不能正确地让您对图块具有不同形状的世界进行建模。

图表

我向您建议的是,以不同的方式看待问题。网格只不过是一个图形(更多信息),其节点具有 4 个(如果允许对角线,则为 8 个)隐式邻居节点。所以首先,如果我是你,我会做的是从你严格的标准 2D 网格移动到一个更“松散”的图表,其中每个节点都有一个position, a position, 一个列表neighbors(在大多数情况下你会有角落有 2 个邻居,边界有 3,“中间”瓷砖有 4),最后是 a rendering component,它只是在给定的屏幕上绘制你的瓷砖position。完成此操作后,您应该能够在屏幕上获得与当前使用“2D Tile-Based”引擎完全相同的rendering component结果,只需调用每个node谁的边界框(在您应该添加到节点的内容中没有触及它,但我稍后会回到这个问题)与相机的平截头体相交(在 2D 世界中,如果位置 +/- size 与RECT当前绘制的相交)。

搜索

更通用的方法还将帮助您使用通用算法进行寻路之类的工作,这些算法会一直探索nodes直到找到有效路径(请参阅A*Dijkstra)。即使您决定坚持使用一款不错的老式 2D Tile Map 游戏,这些技术仍然很有用!

是的,但我想要多边形

我听你的!因此,如果您想要多边形,基本上您需要做的就是添加到您nodes的顶点列表和渲染多边形可能需要的适当数据(顶点颜色、纹理和 U/V 贴图等... )并更新您rendering component以执行适当的OpenGL(例如这应该有帮助)调用来绘制您的节点。再一次,将您的 2D 平铺引擎迭代升级到多边形地图引擎的第一步是,对于地图中的每个平铺,给您的每个nodes两个三角形、一个纹理资源(图块)和 U/V 映射(0,0 - 0,1 - 1,0 和 1,1)。再一次,当这一步完成时,你应该有一个“通用的”基于多边形的瓦片地图引擎。大多数此类数据的创建可以通过基于图块位置、图块大小等计算坐标来按程序创建...

凸多边形

如果您决定您可能需要 NPC 在您的地图上导航,或者想让您的玩家通过单击地图进行导航,我建议您始终使用多边形(三角形是凸多边形中最简单的)。这允许您的代码假设同一多边形上的两个不同位置可以直线导航到。

复杂地图

根据您提供的链接,您希望拥有相当复杂的地图。在这种情况下,作者使用Voronoi Diagrams来生成地图的多边形。已经有这样的三角测量解决方案,但如果您只是像这样切换到 3D,您可能还想使用其他更容易使用的技术。一旦你得到有趣的结果,你应该考虑实现serialization从游戏中保存/打开你的地图数据。如果您想创建一个编辑器,请注意这可能需要大量工作,但如果您希望人们帮助您创建地图或向地图添加元素(例如不属于地形的几何图形),那么它可能是值得的。

我带着这个答案走遍了整个地方,但希望它有所帮助!

于 2013-07-31T03:40:22.283 回答
0

只需遍历所有图块,然后从图块中心到多边形进行命中测试。把瓦片的类型变成多边形的类型。你还需要更多吗?

编辑:对不起,我意识到这可能没有帮助。使用程序算法既有趣又有利可图。从遍历所有图块的循环开始,并随机选择图块是否被占用。然后,再次遍历它们并选择它是被占用还是它的邻居被占用。

另外,查看源代码:http ://dustinfreeman.org/toys/wall7-dustin.html

于 2013-07-31T02:14:58.300 回答