地图生成器定义 (<MapGeneratorDef>)

功能说明

地图生成器定义用于配置负责生成游戏地图不同元素的逻辑。每个地图生成器都指定了一个具体的工作类 (workClass),该工作类会根据提供的配置值 (value) 来执行地图的某一部分生成任务,例如生成地形、放置建筑、植被等。这些生成器是模块化的,可以组合起来构建复杂的地图布局。

可用参数

参数名类型默认值说明
defName字符串必需。该地图生成器定义的唯一标识符。
label字符串(空)可选。该生成器在游戏中显示的名称。
description字符串(空)可选。该生成器的详细描述。
workClass字符串必需。指定处理地图生成逻辑的后端类名。详见下文**workClass 字段**。
valueJSON字符串必需。包含传递给 workClass 的所有必要参数。详见下文**value 字段 (JSON 格式详解)**。

示例

以下展示了几种不同类型的地图生成器定义:

<Define>
    <!-- 树木地图生成器 -->
    <MapGeneratorDef>
        <defName>TreeGenerator</defName>
        <label>树木地图生成器</label>
        <description>一个简单的树木地图生成器,根据密度填充地图为树木。</description>
        <workClass>PlantMapGenerator</workClass>
        <value>
            {
                "tileDefName":"Tree",           <!-- 要生成的树木TileDef名称 -->
                "mapCellSizeX":50,              <!-- 地图的X轴大小 -->
                "mapCellSizeY":50,              <!-- 地图的Y轴大小 -->
                "requiredBaseTileDefName":"Grass", <!-- 必须在什么基础地形上生成 -->
                "density":0.2,                  <!-- 树木的生成密度 -->
                "threshold":0,                  <!-- 生成阈值,用于控制perlin噪声或随机性 -->
                "Scale":5                       <!-- 用于perlin噪声的缩放因子 -->
            }
        </value>
    </MapGeneratorDef>

    <!-- 基地建筑生成器 - 放置特定模式的建筑 -->
    <MapGeneratorDef>
        <defName>BaseBuildingGenerator</defName>
        <label>基地建筑生成器</label>
        <description>一个简单的基地建筑生成器,根据预定义模式放置建筑。</description>
        <workClass>BuildingMapGenerator</workClass>
        <value>
            {
                "defName":"ConcreteWall",  <!-- 默认填充的实体DefName -->
                "positionX":9,             <!-- 建筑模式的起始X坐标 -->
                "positionY":20,            <!-- 建筑模式的起始Y坐标 -->
                "mapping":                 <!-- 数字与DefName的映射关系 -->
                {
                    "1":"ConcreteWall",
                    "2":"SkillTreeShop",
                    "3":"StartPoint"
                },
                "pattern": [               <!-- 建筑布局模式,0代表不放置,1-9代表按mapping放置 -->
                        [2,0,0,0,0,0,0,0,0,0,0,0,0,3],
                        [1,0,0,0,0,0,0,0,0,0,0,0,0,1],
                        [1,0,0,0,0,0,0,0,0,0,0,0,0,1],
                        [1,0,0,0,0,0,0,0,0,0,0,0,0,1],
                        [1,0,0,0,0,0,0,0,0,0,0,0,0,1],
                        [1,0,0,0,0,0,0,0,0,0,0,0,0,1],
                        [1,0,0,0,0,0,0,0,0,0,0,0,0,1],
                        [1,0,0,0,0,0,0,0,0,0,0,0,0,1],
                        [1,0,0,0,0,0,0,0,0,0,0,0,0,1],
                        [1,1,1,1,1,1,1,1,1,1,1,1,1,1]
                    ]
            }
        </value>
    </MapGeneratorDef>

    <!-- 基地地板填充生成器 -->
    <MapGeneratorDef>
        <defName>BaseFloorFiller</defName>
        <label>基地地板填充</label>
        <description>一个简单的基地地板填充生成器,填充指定区域为基地地板。</description>
        <workClass>BasicTerrainMapGenerator</workClass>
        <value>
        {
            "tileDefName":"BaseFloor",    <!-- 要填充的TileDef名称 -->
            "mapCellSizeX":30,            <!-- 填充区域的X轴大小 -->
            "mapCellSizeY":30,            <!-- 填充区域的Y轴大小 -->
            "threshold":-1,               <!-- 生成阈值,-1常用于完全填充 -->
            "Scale":2,                    <!-- 缩放因子 -->
            "offsetX":0,                  <!-- 填充区域的X轴偏移 -->
            "offsetY":0                   <!-- 填充区域的Y轴偏移 -->
        }
        </value>
    </MapGeneratorDef>

    <!-- 基地顶部墙面绘制生成器 -->
    <MapGeneratorDef>
        <defName>BaseUpWallFiller</defName>
        <label>基地顶部墙面绘制</label>
        <description>在地图顶部绘制一层基地墙面。</description>
        <workClass>BasicTerrainMapGenerator</workClass>
        <value>
        {
            "tileDefName":"BaseWall",     <!-- 要填充的TileDef名称 -->
            "mapCellSizeX":30,            <!-- 墙面区域的X轴大小 -->
            "mapCellSizeY":1,             <!-- 墙面区域的Y轴大小 -->
            "threshold":-1,               <!-- 生成阈值 -->
            "Scale":2,                    <!-- 缩放因子 -->
            "originX":0,                  <!-- 墙面起始X坐标 -->
            "originY":30                  <!-- 墙面起始Y坐标 -->
        }
        </value>
    </MapGeneratorDef>
</Define>

复杂参数说明

workClass 字段 (工作类)
  • 说明:指定负责实际地图生成逻辑的后端类名。此字符串必须精确匹配到游戏中对应的地图生成器类。不同的 workClass 会需要不同结构的 value 参数。
  • 示例
    <workClass>PlantMapGenerator</workClass>
    <workClass>BuildingMapGenerator</workClass>
    <workClass>BasicTerrainMapGenerator</workClass>
    
  • 注意workClass 定义的详细讲解将在 第三章:核心工作类定义 中提供。
value 字段 (JSON 格式详解)
  • 说明:这是一个 JSON 格式的字符串,包含了传递给 workClass 指定的地图生成器类的所有必要参数。value 的内部结构和字段名必须与 workClass 所期望的参数类型严格匹配。

  • JSON 格式的特点

    • 键值对:由键(字符串)和值组成,键和值之间用冒号 : 分隔。
    • 对象:用大括号 {} 包裹,包含零个或多个键值对,键值对之间用逗号 , 分隔。
    • 数组:用方括号 [] 包裹,包含零个或多个值,值之间用逗号 , 分隔。
    • 数据类型:支持字符串、数字、布尔值 (true/false)、JSON 对象、JSON 数组和 null
  • 编写规则

    • 整个 JSON 结构必须是合法的。
    • 所有键(字段名)必须用双引号 "" 包裹。
    • 所有字符串值也必须用双引号 "" 包裹。数字、布尔值不需要。
    • JSON 内部可以包含换行符和缩进,以提高可读性,这些空白字符在解析时会被忽略。
  • 不同 workClass 对应的 value 结构示例

    • PlantMapGeneratorvalue (如 TreeGenerator 示例所示):

      {
          "tileDefName":"Tree",
          "mapCellSizeX":50,
          "mapCellSizeY":50,
          "requiredBaseTileDefName":"Grass",
          "density":0.2,
          "threshold":0,
          "Scale":5
      }
      

      这些参数通常用于控制植被的类型、生成范围、密度以及基于Perlin噪声的分布。

    • BuildingMapGeneratorvalue (如 BaseBuildingGenerator 示例所示):

      {
          "defName":"ConcreteWall",
          "positionX":9,
          "positionY":20,
          "mapping":
          {
              "1":"ConcreteWall",
              "2":"SkillTreeShop",
              "3":"StartPoint"
          },
          "pattern": [
                  [2,0,0,0,0,0,0,0,0,0,0,0,0,3],
              ]
      }
      

      这些参数通常用于定义一个二维的建筑放置模式,通过 mapping 将模式中的数字映射到具体的实体定义。

    • BasicTerrainMapGeneratorvalue (如 BaseFloorFiller 示例所示):

      {
          "tileDefName":"BaseFloor",
          "mapCellSizeX":30,
          "mapCellSizeY":30,
          "threshold":-1,
          "Scale":2,
          "offsetX":0,
          "offsetY":0
      }
      

      这些参数通常用于在指定区域填充单一类型的地形或方块,通过 mapCellSizeX, mapCellSizeY, offsetX, offsetY 来定义区域范围。

  • 注意事项

    • value 中的 JSON 结构必须与 workClass 内部定义的参数类结构完全匹配,包括字段名的大小写和数据类型。任何不匹配都可能导致地图生成器无法正确执行。
    • 为了配置文件的可读性和易维护性,强烈建议使用多行和缩进来格式化 value 的内容。