规则瓦片定义 (<TileDef>)
功能说明
规则瓦片定义用于创建一种智能瓦片,它能根据周围相邻瓦片的类型自动改变其自身的纹理、动画、碰撞体和属性。这种机制极大地简化了地图的绘制工作,尤其适用于那些需要平滑过渡或形成复杂图案的自然地形(如水体、草地边缘、道路等)。每个规则瓦片都包含一系列规则 (rules),系统会根据这些规则来决定在特定邻居条件下应该显示哪种外观。
可用参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
defName | 字符串 | 无 | 必需。该规则瓦片定义的唯一标识符。 |
label | 字符串 | (空) | 可选。该瓦片在游戏中显示的名称。 |
description | 字符串 | (空) | 可选。该瓦片的详细描述。 |
collider | 枚举 (字符串) | None | 必需。瓦片的默认碰撞体类型。详见下文**collider 字段**。 |
texture | 字符串 | (空) | 可选。瓦片的默认纹理路径或名称,当没有规则匹配时使用。 |
tileCost | 浮点数 | 0.0 | 可选。当实体进入该瓦片时,其移动速度降低的百分比(0为不减速,1为完全停止)。 |
rules | 规则瓦片规则定义数组 | 无 | 必需。定义瓦片如何根据邻居生成不同外观。详见下文**rules 字段**。 |
示例
这是一个定义了水体规则瓦片的例子,它根据周围水瓦片或非水瓦片的存在来选择不同的纹理:
<Define>
<TileDef>
<defName>Water</defName>
<label>水面</label>
<description>地图上的水体瓦片,构成河流和湖泊的背景。</description>
<collider>Grid</collider> <!-- 水面具有网格碰撞体 -->
<texture>tileMap_37</texture> <!-- 默认纹理或中心水纹理 -->
<tileCost>0.5</tileCost> <!-- 经过水面时,移动速度减慢50% -->
<rules>
<!-- 规则1:周围八个方向都是水瓦片时,显示完整的中心水面 -->
<rule>
<neighborConditions>
<li>This</li><li>This</li><li>This</li>
<li>This</li> <li>This</li>
<li>This</li><li>This</li><li>This</li>
</neighborConditions>
<animationTextures>
<li>tileMap_37</li>
</animationTextures>
<outputCollider>Grid</outputCollider>
</rule>
<!-- 规则2:顶部无水瓦片,形成水体顶部边缘 -->
<rule>
<neighborConditions>
<li>Any</li><li>NotThis</li><li>Any</li>
<li>This</li> <li>This</li>
<li>This</li><li>This</li><li>This</li>
</neighborConditions>
<animationTextures>
<li>tileMap_19</li>
</animationTextures>
<outputCollider>Grid</outputCollider>
</rule>
<!-- 规则3:左侧无水瓦片,形成水体左侧边缘 -->
<rule>
<neighborConditions>
<li>Any</li><li>This</li><li>This</li>
<li>NotThis</li> <li>This</li>
<li>Any</li><li>This</li><li>This</li>
</neighborConditions>
<animationTextures>
<li>tileMap_36</li>
</animationTextures>
<outputCollider>Grid</outputCollider>
</rule>
<!-- ... 更多规则,定义了水体不同边缘和角的纹理 -->
<!-- 规则10:左上无水瓦片,顶中和左中是水瓦片,形成左上角内凹 -->
<rule>
<neighborConditions>
<li>NotThis</li><li>This</li><li>Any</li>
<li>This</li> <li>This</li>
<li>Any</li><li>This</li><li>This</li>
</neighborConditions>
<animationTextures>
<li>tileMap_90</li>
</animationTextures>
<outputCollider>Grid</outputCollider>
</rule>
<!-- 规则20:完全独立的水单元,孤立于所有其他瓦片 -->
<rule>
<neighborConditions>
<li>Any</li><li>NotThis</li><li>Any</li>
<li>NotThis</li> <li>NotThis</li>
<li>Any</li><li>NotThis</li><li>Any</li>
</neighborConditions>
<animationTextures>
<li>tileMap_73</li> <!-- 示例:孤立水图标 -->
</animationTextures>
<outputCollider>Grid</outputCollider>
</rule>
</rules>
</TileDef>
</Define>
规则瓦片规则定义 (<RuleTileRuleDef>)
功能说明
每个规则瓦片规则定义(通常作为 规则瓦片定义 (<TileDef>) 内部的匿名定义存在)规定了在满足特定邻居条件时,该瓦片应该采用何种外观、动画、碰撞体和变换方式。规则按顺序评估,第一个匹配的规则将被应用。
可用参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
defName | 字符串 | 无 | 可选。该规则的唯一标识符(作为匿名定义时可省略)。 |
label | 字符串 | (空) | 可选。该规则的描述性标签。 |
description | 字符串 | (空) | 可选。该规则的详细描述。 |
neighborConditions | 邻居条件枚举数组 | [Any,Any,...,Any] | 必需。定义周围八个方向(中心瓦片周围的3x3网格,去除自身)的瓦片条件。详见下文**neighborConditions 字段**。 |
neighborConditionExtend | 邻居条件定义数组 | 无 | 可选。用于定义更复杂或非标准位置的邻居条件。详见下文**neighborConditionExtend 字段**。 |
outputType | 枚举 (字符串) | Single | 可选。瓦片的输出类型,例如单个精灵、固定动画或随机精灵。 |
transform | 枚举 (字符串) | Fixed | 可选。输出精灵的变换方式,例如固定方向或随机旋转。 |
outputCollider | 枚举 (字符串) | None | 可选。此规则生效时,瓦片采用的碰撞体类型。会覆盖 TileDef 中的 collider 值。 |
chance | 浮点数 | 0.5 | 可选。当多个规则匹配时,此规则被选中的相对概率。 |
animationTextures | 字符串列表 | 无 | 可选。当 outputType 为 Animation 时,定义动画帧的纹理路径或名称列表。 |
animationSpeed | 浮点数 | 1.0 | 可选。动画播放速度。 |
tileCost | 浮点数 | 0.0 | 可选。此规则生效时,瓦片的移动成本(减速率0-1)。会覆盖 TileDef 中的 tileCost 值。 |
复杂参数说明
collider 字段 (瓦片碰撞体类型)
- 说明:定义瓦片的碰撞体类型。
- 可选值:
None: 无碰撞体,实体可以自由穿过。Grid: 网格碰撞体,通常用于阻挡实体移动。Sprite: 使用瓦片纹理的像素数据生成碰撞体,提供更精确的碰撞区域。
- 示例:
<collider>Grid</collider>
rules 字段 (规则瓦片规则定义数组)
- 说明:这是一个数组,每个
<li>元素包含一个 规则瓦片规则定义。这些规则会按顺序进行评估,直到找到第一个满足条件的规则并应用其输出。 - 数组定义方式:
<rules> <rule> <!-- 规则1的匿名定义 --> <neighborConditions> <li>Any</li><li>NotThis</li><li>Any</li> <li>This</li> <li>This</li> <li>This</li><li>This</li><li>This</li> </neighborConditions> <animationTextures> <li>tileMap_19</li> </animationTextures> </rule> <rule> <!-- 规则2的匿名定义 --> <neighborConditions> <li>Any</li><li>This</li><li>This</li> <li>NotThis</li> <li>This</li> <li>Any</li><li>This</li><li>This</li> </neighborConditions> <animationTextures> <li>tileMap_36</li> </animationTextures> </rule> <!-- ... 更多规则 --> </rules>
neighborConditions 字段 (邻居条件数组)
- 说明:这是一个固定大小为8的数组,按顺时针方向定义了中心瓦片周围八个邻居的条件,从左上角开始。
瓦片位置(数字代表数组索引):
[0] [1] [2][7] [.] [3](.是当前瓦片自身)[6] [5] [4] - 相邻条件类型 (
NeighborConditionType):Any: 任何类型的瓦片都可以。This: 邻居瓦片必须与当前规则瓦片定义的是同类型瓦片。NotThis: 邻居瓦片不能是当前规则瓦片定义的是同类型瓦片。
- 数组定义方式:
这个例子表示要求所有八个邻居都是当前瓦片类型。<neighborConditions> <li>This</li><li>This</li><li>This</li> <!-- 左上、上、右上 --> <li>This</li> <li>This</li> <!-- 左、右 --> <li>This</li><li>This</li><li>This</li> <!-- 左下、下、右下 --> </neighborConditions>
neighborConditionExtend 字段 (扩展邻居条件数组)
- 说明:这是一个数组,允许定义除了标准8个邻居之外,任意偏移位置的邻居条件。每个
<li>元素包含一个 邻居条件定义 (<NeighborConditionDef>) 的匿名定义或引用。 - 数组定义方式:
<neighborConditionExtend> <li> <position>2,0</position> <!-- 距离中心瓦片右侧2格的瓦片 --> <Type>NotThis</Type> </li> <li> <!-- 引用已定义的扩展邻居条件 --> <defName>FarNeighborIsGrass</defName> </li> </neighborConditionExtend>
outputCollider 字段 (输出碰撞体) 与 tileCost 字段 (瓦片移动成本)
- 说明:这些字段允许你在特定规则生效时,动态地改变瓦片的碰撞体类型和移动成本(减速率)。如果规则中定义了这些值,它们将覆盖 TileDef 中对应的默认值。
- 示例:
<outputCollider>Grid</outputCollider> <tileCost>0.8</tileCost> <!-- 当此规则生效时,移动减速80% -->
animationTextures 字段 (动画精灵列表)
- 说明:这是一个字符串列表,指定了动画的每一帧所使用的纹理资源路径或名称。当规则的
outputType为Animation时,这些纹理会按顺序播放,形成动画效果。 - 列表定义方式:
<animationTextures> <li>tileMap_37</li> <li>tileMap_38</li> <li>tileMap_39</li> </animationTextures>
邻居条件定义 (<NeighborConditionDef>)
功能说明
邻居条件定义通常作为 规则瓦片规则定义 (<RuleTileRuleDef>) 中 neighborConditionExtend 字段的匿名定义或引用,用于指定除了标准8个方向之外的、任意偏移位置的瓦片需要满足的条件。
可用参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
defName | 字符串 | 无 | 可选。该邻居条件的唯一标识符(作为匿名定义时可省略)。 |
label | 字符串 | (空) | 可选。该邻居条件的描述性标签。 |
description | 字符串 | (空) | 可选。该邻居条件的详细描述。 |
position | 字符串 | 无 | 必需。相对于中心瓦片的位置偏移,格式为 "X,Y"(例如:"1,0"表示右侧一格,"-1,1"表示左上角对角线一格)。 |
Type | 枚举 (字符串) | Any | 必需。该位置上的瓦片需要满足的条件。详见上文**neighborConditions 字段中的相邻条件类型 (NeighborConditionType)**。 |
示例
这是一个定义了一个扩展邻居条件的例子:
<!-- 在 RuleTileRuleDef 中的使用 -->
<rule>
<!-- ...其他规则条件... -->
<neighborConditionExtend>
<li>
<position>2,0</position> <!-- 距离中心瓦片右侧2格的瓦片 -->
<Type>NotThis</Type> <!-- 要求右侧2格的瓦片不能是当前规则瓦片类型 -->
</li>
<li>
<position>0,-3</position> <!-- 距离中心瓦片下方3格的瓦片 -->
<Type>This</Type> <!-- 要求下方3格的瓦片必须是当前规则瓦片类型 -->
</li>
</neighborConditionExtend>
<!-- ...其他输出属性... -->
</rule>