You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Godot4中通过程序化生成制作类似Hypoxia的地图?

解决方案:实现类似Hypoxia的连贯地形拼接

一、游戏美术制作要点

  • 制作带边缘变体的瓦片集
    针对泥土、黄金等每种元素,绘制覆盖所有相邻情况的瓦片变体,包括对角相邻场景。比如泥土瓦片需要包含“左上邻接黄金”“右下邻接黄金”“四角均邻接黄金”等不同状态,确保视觉连贯。
  • 配置TileSet地形规则
    在Godot的TileSet编辑器中,给每个元素的瓦片分配唯一地形ID(如泥土=0、黄金=1),开启对角相邻匹配选项,让引擎拼接时考虑对角方向的相邻元素,自动选择对应变体。
  • 统一边界视觉风格
    不同元素的边界做差异化设计:比如黄金边缘加高亮描边,泥土边缘用深色过渡,即使对角相邻也要保证边界线条自然衔接,强化元素区分度。

二、代码逻辑优化

1. 核心问题修复

当前代码中噪声取值范围(-100~100)与阈值(gold=3、dirt=5)匹配不合理,导致元素区域过于零散。调整阈值和噪声参数,让地形更连贯。

2. 修改后的完整代码

extends Node2D

var noise
var map_size = Vector2(100,100)
# 调整阈值,扩大元素生成区域
var dirt_threshold = 20
var gold_threshold = -20

func _ready():
    randomize()
    noise = FastNoiseLite.new()
    noise.set_noise_type(FastNoiseLite.NoiseType.TYPE_PERLIN)
    noise.seed = randi()
    # 降低噪声频率,让地形更平滑
    noise.set_frequency(0.05)
    make_chunk()

func make_chunk():
    var dirt_cells = []
    var gold_cells = []
    # 先清空TileMap避免残留
    $cv.clear()
    for x in range(map_size.x):
        for y in range(map_size.y):
            var block = noise.get_noise_2d(x, y) * 100
            if gold_threshold < block && block < dirt_threshold:
                dirt_cells.append(Vector2i(x, y))
            elif block <= gold_threshold:
                gold_cells.append(Vector2i(x, y))
    # 对应TileSet中设置的地形ID
    $cv.set_cells_terrain_connect(0, dirt_cells, 0, 0) ## 泥土地形ID:0
    $cv.set_cells_terrain_connect(0, gold_cells, 1, 0) ## 黄金地形ID:1

3. 关键配置说明

  • 确保TileSet中已为每个元素的瓦片正确设置地形ID,且开启对角相邻匹配。
  • set_cells_terrain_connect的第三个参数对应地形ID,需与TileSet配置一致。
  • 调用clear()清空TileMap,避免旧单元格干扰新生成的地形。

三、测试与调试建议

  • 在TileSet编辑器中手动绘制单元格,验证瓦片是否能自动切换到正确的边缘变体,若未生效,检查地形规则的相邻条件设置。
  • 调整噪声的frequency参数:值越小,地形越平滑连贯;值越大,地形越细碎。
  • 若需要更复杂的地形,可以叠加多层噪声,实现更丰富的元素分布。

内容的提问来源于stack exchange,提问作者Jojo Fuang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:56:03