如何在java中程序生成类似make的Zelda
我如何在java中制作程序生成的地图? 游戏本身就像是Zelda是程序生成的……帮助?
塞尔达地图的传说从前不久使用等距瓷砖视图。 您需要做的第一件事是将等距瓷砖集加载到您的程序中,我相信您可以找到Zelda瓷砖集。 然后,您需要决定如何在程序上生成地图。 是否会有海洋,不同的生物群落,建设? 在制作用于生成地图的等式时,需要考虑所有这些因素。 每个磁贴需要存储在某个地方,所以我会创建一个二维数组来打包所有的tile值。然后使用嵌套for循环来渲染切片。 代码看起来像这样
int[][] world = new int[50][50]; for( int i = 0; i < 50; i++ ){ for( int b = 0; b < 50; b++ ){ int tile = world[i][b]; render(tile, i, b); //use i and b to position the tile on your world
生成哪些瓷砖去哪里比在创建瓷砖时渲染瓷砖更棘手。 上面只有一个空矩阵。 我会再次使用for循环来填充您喜欢的世界,使用不同的int id值表示tile。 然而,这将是完全随机的,所以你需要一些方法来解决你的疯狂问题。 我会在生成时测试周围的瓷砖,并为周围的瓷砖生成更高的概率,以便更加平滑地形。 如果你想为你玩的每个游戏都想要相同的世界,你可以为你的矩阵提供恒定的值而不是生成它们。 我不打算编写整个等轴测视图引擎,但我希望其中一些概念可以帮助你。
-
等距引擎
首先,您需要具有function等距引擎。 六角网格有点棘手(特别是如果你是菜鸟)我建议你从方格开始。 这意味着您需要能够加载/保存您的世界地图。 并且粗略地在某处可视化。 稍后您可以添加平移编辑等,但这对于现在来说并不重要。 例如看看这个:
- 提高交错列等距网格上的点击检测性能
你可以在C ++中找到我的早期版本非常简单的等距引擎。
-
地形发电机
您需要将地图生成划分为几个单独的步骤。
-
高度图生成器
创建伪随机2D高度图(具有与等轴测图相同的x,y分辨率),稍后您将转换为等轴测图。 我建议你使用Diamond-square算法 。 另外看看:
- 菱形算法不起作用
在哪里可以找到我的C ++实现。
-
将高度贴图转换为等距地形图
只需将高度贴图的
Z
范围重新缩放到等轴测图的最大支撑高度即可。 然后清除等轴测图。 最后,所有单元cell(x,y,0)...cell(x,y,height(x,y))
填充了地形立方体。 这将产生伪随机图,但仅使用立方体(尖锐的体素边缘)。 所以这需要进一步过滤。 -
过滤掉小孔
这取决于瓷砖支持的形状。 如果你不能用它们平滑小孔的边缘,那么在应用平滑之前用立方体填充它们。
-
光滑的边缘
找到特定的地形坡度并用边缘瓷砖填充它。
这里以这种方式生成的部分平滑伪随机地形的示例:
我没有平滑地图边框细胞,所以你可以通过平滑和体素输出看到我的意思。
-
-
地图生成器
现在,当您拥有地形时,您可以添加其他function。 比如将表面瓷砖更换为不同的材料,添加watter,建筑物,道路,树木,草地……只需做一个循环,你随机获取
x,y
位置和要素类型,然后将其设置在地形之上……更现实的是你需要使用一些规则,如watter,sand,grass,rocks,snow依赖于高度,建筑物只能放置在平坦区域等。