[Godot] 二维随机地图生成方法

528 阅读2分钟

二维随机地图生成方法

CheapMeow/Godot-MapGeneratorSampleProject (github.com)

不规则地图

规则地图

1.新建一个枚举类型的二维数组 map,每个元素代表着每一个格子,枚举内容代表格子的种类,例如空地、墙(六边形网格地图可以变形为四边形网格地图)

2.自定义随机填充算法初始化 map

3.自定义平滑算法处理 map

例如:遍历 map 每个元素,计算其周围 8 个元素为墙的个数,等于 4 个时保持不变,大于一半则自己也变成墙,反之为空地

4.清除小的墙体、空地

map 中一些位置连续的,同一枚举类型的元素可以视为一个整体,它不是墙就是空地,用 List 表示,通过广度优先找出

先删掉小墙体,这样有些房间就会变大,找小空洞时,所有房间的大小确定不变

再删掉小空地,并且把没删掉的作为房间存起来

最后把房间最大的作为主房间

5.房间连接

遍历所有房间,对其中每一个房间,寻找可能存在的,距离自己最近的,与自己尚未连接的房间

连接房间时,进行两项操作:

(1) 连接时遍历两个房间的边界上的节点,找到两个房间之间距离最近的一对边节点,由直线生成算法获得直线上各点。遍历各点,在以给定的通道宽度为半径,列表元素为圆心的,圆内的所有地图节点,都置为空地

(2) 房间 a 如果可以到达主房间,那么与之相连的所有房间都可以连接到主房间 重复遍历若干次,直至所有房间都可以到达主房间

# 生成随机地图
func generate_map():
    for x in range(width):
            map.append([])
            for y in range(height):
                    map[x].append(GEnum.TileType.Empty)
    random_fill_map()

    for i in range(smoothLevel):
            smooth_map()

    # 清除小洞,小墙
    eliminate_small_hole_and_wall()

    # 连接各个幸存房间
    connect_all_rooms_to_mainroom()