好的,这就是事情。最近我决定我想了解随机地图生成的工作原理。我发现了一些论文和一些论点。最有趣的是“Diamond Square算法”和“Midpoint Displacement”。我仍然必须尝试将这些应用到软件中,但除此之外,我遇到了这个网站:http://www-cs-students.stanford.edu/~amitp/game-programming/polygon-map-generation/
如您所见,我们的想法是使用多边形。但我不知道如何应用基于Tile的地图,甚至不知道如何使用我拥有的工具(c ++和sdl)创建这些多边形。我假设没有办法做到这一点(如果我错了,请纠正我。)但如果我不是,非瓦片地图是如何工作的,这些多边形是如何生成的?
答案 0 :(得分:5)
这个答案不会直接为您提供您正在寻找的答案,但希望能让您足够接近!
问题
我认为阻止你的是如何表示数据。您可能习惯于只表示每个图块类型的2D网格。如您所知,这可以很好地处理基于图块的地图,但是不能正确地模拟图块具有不同形状的世界。
<强>图表强>
我建议你,看到问题有点不同。网格只不过是一个图形(more info),其节点有4个(如果允许对角线则为8个)隐式邻居节点。首先,如果我是你,我会做的是从严格的标准2D网格转移到更“松散”的图形,其中每个节点都有position
,position
,列表neighbors
(在大多数情况下,您将拥有2个邻居的角落,3个边框和4个“中间”图块),最后是rendering component
,只需在给定的{{{}}屏幕上绘制您的图块1}}。完成此操作后,您应该能够在屏幕上显示完全相同的结果,只需在每个{position
调用rendering component
1}}谁是边界框(没有触及它应该添加到你的节点,但我稍后会回到这里)与相机的截头体相交(在2D世界中,最有可能的是位置+ / - 大小与当前正在绘制的node
相交。
搜索强>
更通用的方法还可以帮助您使用搜索RECT
的通用算法进行路径寻找等操作,直到找到有效路径(请参阅A*或Dijkstra)。即使您决定坚持使用旧的2D Tile Map游戏,这些技术仍然有用!
是的,但我想要多边形
我听到你了!所以,如果你想要多边形,基本上你需要做的就是添加你的nodes
顶点列表以及渲染多边形所需的相应数据(顶点颜色,纹理和U / V贴图)等等...)并更新您的nodes
以执行相应的rendering component
(this例如应该帮助)调用以绘制节点。再次,迭代地将2D平铺引擎升级到多边形地图引擎的第一步是,对于地图中的每个平铺,给出每个OpenGL
两个三角形,一个纹理资源(平铺),以及U / V映射(0,0 - 0,1 - 1,0和1,1)。再一次,当完成此步骤时,您应该有一个“通用”基于多边形的平铺贴图引擎。大多数数据的创建可以通过基于平铺位置,平铺大小等计算坐标来程序化地创建......
凸多边形
如果您认为自己可能需要NPC在地图上导航或想让您的播放器通过点击地图进行导航,我建议您始终使用convex polygons(三角形是最简单的凸多边形)。这允许您的代码假设同一多边形上的两个不同位置可以直线导航。
复杂地图
根据您提供的链接,您希望拥有相当复杂的地图。在这种情况下,作者使用Voronoi Diagrams生成地图的多边形。已经有类似三角测量的解决方案,但是如果你只是像this one for example那样切换到3D,你可能还想使用更容易使用的其他技术。一旦获得有趣的结果,您应该考虑实施nodes
来保存/打开游戏中的地图数据。如果您想创建一个编辑器,请注意它可能需要做很多工作,但如果您希望人们帮助您创建地图或向地图添加元素(例如不属于地形的几何体),则可能值得。
我带着这个答案走遍了整个地方,但希望它有所帮助!
答案 1 :(得分:0)
迭代所有瓷砖,然后从瓷砖中心到多边形进行点击测试。将tile的类型转换为多边形的类型。你还需要更多吗?
编辑:对不起,我意识到这可能没有帮助。使用程序算法可以很有趣并且有利可图。从遍历所有切片的循环开始,随机选择是否占用了切片。然后,再次迭代它们并选择它是否被占用或它的邻居是。另外,请查看以下内容的源代码:http://dustinfreeman.org/toys/wall7-dustin.html