【问题标题】:How does a non-tile based map works?非基于瓦片的地图如何工作?
【发布时间】:2013-07-31 01:38:36
【问题描述】:

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

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

【问题讨论】:

  • 三角形! gamedev.stackexchange.com/questions/8600/…> | reddit.com/r/gamedev/comments/1tpmmr/…> |简单的基于 2D 三角形的场景 youtube.com/watch?v=zK0IKeAoGDU> | stackoverflow.com/questions/11782211/…>

标签: dictionary sdl render tile


【解决方案1】:

此答案不会直接为您提供您正在寻找的答案,但希望能让您足够接近!

问题

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

图表

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

搜索

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

是的,但我想要多边形

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

凸多边形

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

复杂地图

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

我到处找这个答案,但希望它有所帮助!

【讨论】:

  • 谢谢!这真的有帮助......我在那里完全迷失了一分钟......这比我想象的要复杂得多,但没有什么是时间和努力无法完成的:)
  • 没错,用更简单的步骤分解问题,然后循序渐进,这样你就“总是”有一些东西在处理复杂系统的过程中
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多