程序化生成后2D地图瓦片模式修复方案咨询
元胞自动机地图生成适配有限瓦片集的优化方案
问题背景
我正在开发独立游戏,用**元胞自动机(Cellular Automata)**生成2D单图层地图,图层用存储0(无瓦片)和1(有瓦片)的二维数组建模,使用Godot 4.2引擎,其地形系统会根据瓦片连接关系自动匹配对应瓦片。
2D瓦片最多有8个方向的连接可能,总计64种连接模式,这意味着单图层需要64种瓦片资源(比如64种浅草、草皮变体)。为降低美术成本,我只采用17种模式(包含直边连接、内转角、外转角),可将单图层瓦片制作成本降低73%。
当前困境
我用字节掩码(8个方向对应一个字节)定义所有允许的模式,遍历值为1的瓦片时,移除不符合模式的瓦片,但移除操作会破坏相邻瓦片的连接模式,最终导致整个图层被清空。如果尝试通过添加瓦片把非允许模式转换成允许模式,同样会影响相邻瓦片的模式,陷入循环修改的问题。
举个例子,初始网格如下:
0 1 0 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1 1 0 1
以坐标(1,1)为中心的3x3模式是:
0 1 0 1 1 1 0 1 1
该模式不在允许的17种之内。如果移除中心瓦片,会引发连锁删除;如果修改为以下模式(填充部分空白):
0 0 0 0 1 1 0 1 1
中心瓦片就能匹配外转角模式,但这种修改会影响周围相邻瓦片的连接状态。
可行解决方案思路
1. 批量修改而非逐一遍历
不要在遍历过程中实时修改瓦片状态,而是先收集所有需要修改的瓦片(无论是移除还是添加),一次性完成所有修改:
- 遍历整个网格,为每个瓦片计算当前模式,标记需要执行的操作(如“移除”或“添加”)
- 遍历完成后,统一应用所有标记的修改
- 重复上述过程,直到网格状态稳定(连续两轮无需要修改的瓦片)
这种方式避免了修改操作实时干扰相邻瓦片的判断,减少连锁反应的影响。
2. 定义优先级规则处理冲突
当瓦片修改会影响相邻区域时,预先设置规则优先级:
- 优先保留连通区域更大的瓦片,避免小区域被误删
- 先处理核心区域的瓦片,再处理边缘区域,减少边缘修改对核心布局的干扰
- 给17种允许模式设置权重,优先保留权重高的模式对应的瓦片布局
3. 调整元胞自动机生成规则
从源头减少非允许模式的生成:
- 在元胞自动机迭代过程中,直接将“符合17种模式”作为存活/死亡规则的一部分,而非生成后再修正
- 比如在类Conway生命游戏的规则基础上,额外添加条件:只有当存活瓦片(值为1)的8邻域组合属于允许模式时,才保留它;生成新瓦片时,确保其邻域组合符合允许模式
4. 瓦片集容错映射
如果无法完全避免非允许模式,可为每个非允许模式映射到最接近的允许模式,无需修改网格数据:
- 计算非允许模式与17种允许模式的汉明距离(即不同方向的数量),选择相似度最高的允许模式对应的瓦片
- 利用Godot的自定义连接规则功能,修改瓦片的连接掩码,让非标准模式自动匹配到现有17种瓦片上
5. 分阶段处理修正过程
将修正分为多个阶段逐步稳定网格:
- 第一阶段:处理严重不符合的模式(如孤立瓦片、引发大面积冲突的布局),优先移除或调整这些瓦片
- 第二阶段:处理边缘区域的小冲突,通过添加少量瓦片适配允许模式
- 第三阶段:微调细节,确保所有瓦片匹配允许模式
内容的提问来源于stack exchange,提问作者Supamiu
相关产品推荐
相关产品推荐

