这个答案不会直接给你你正在寻找的答案,但希望能让你足够接近!
问题
我认为阻碍你的是如何表示数据。您可能已经习惯了仅表示每个图块类型的 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
从游戏中保存/打开你的地图数据。如果您想创建一个编辑器,请注意这可能需要大量工作,但如果您希望人们帮助您创建地图或向地图添加元素(例如不属于地形的几何图形),那么它可能是值得的。
我带着这个答案走遍了整个地方,但希望它有所帮助!