formation_shape(阵法图形)
文件位置:data/<namespace>/mxt/formation_shape/<path>.json
formation_shape 定义一座阵法画出来的图形:一串笔画,每一笔是圆或者折线——渲染器只会走这两种,别的形状都得由它们拼出来。阵法的绘制模块 mxt:particle 的 shape 指向其中一份,客户端照着定义自己采样、自己铺尘埃,所以图形多密都只花一个 id 的带宽。
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
strokes | 数组,条目见笔画类型 | 必填 | 图形由哪些笔画组成,至少一笔、最多 256 笔;数组顺序就是绘制顺序。 |
{
"strokes": [
{ "type": "mxt:circle", "radius": 1, "color": "#80c0ff" },
{ "type": "mxt:polyline", "points": [[1, 0], [-0.809, 0.588], [0.309, -0.951], [0.309, 0.951], [-0.809, -0.588], [1, 0]], "color": "#ffd76a" }
]
}坐标与起点
坐标一律写 [x, z] 两个数,落在阵法所在的水平面上,单位是阵列的半径:1 正好是阵列自己的 radius 画出来的那个环,所以同一份图形换一个半径就整幅等比缩放,不需要改定义。
0 号方位在正东(+X),角度从那里起、朝 +Z 增加(北朝上看是顺时针)。两种笔画各自的起点是:
- 圆从正东起、绕一整圈,
start_angle可以把它挪到别处(度数,正数朝 +Z);center省略时圆心就是阵心,也可以写到别处。 - 折线从它的第一个点起,依次走到最后一个点。
生长与每一笔自己的窗口
图形不是一次画完的:mxt:particle 的 duration_ticks 决定画多久,客户端按进度逐 tick 铺。每一笔有自己的一段进度:start 与 end(0~1,默认 0 与 1)就是它参与的那一段,图形进度落在这段里的比例就是这一笔画了多少——start 写 0.5 的那一笔,前半段一点都不画。
不写窗口时所有笔画一起长:每一笔按自己的总长截断,所以 progress 到一半时环画到半圈、星形也画到自己总长的一半,折线不闭合时就从第一个点往最后一个点长。把窗口错开就能让它们依次出现,比如环写 end: 0.5、星形写 start: 0.5。end 必须大于 start。
点数由长度和这一笔自己的 spacing 算出:一笔要 ceil(这一笔已画长度的格数 ÷ 它自己的 spacing) + 1 个点,端点一定落在进度指定的位置上;单笔最多 2048 个点(客户端保护,不是给作者定的规则,spacing 写得过小或半径过大时才会碰到)。
笔画的疏密与尘埃大小
spacing 与 size 和 color 一样是每一笔自己的字段:
| 字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
spacing | 数值 0.01..64 | 0.33 | 相邻两个尘埃之间多少格。它只决定点数与疏密。 |
size | 数值 0.01..4 | 2 | 一个尘埃画多大。太小看着断断续续,太大就糊成一片。 |
所以一幅图里可以外环稀、内层密:两笔一样长,spacing 写 1 的那一笔点数是写 2 的两倍。不写的笔按上面的默认值走。这两个字段不在 mxt:particle 上——那个模块只决定画哪份图形、画多久、多久发一次心跳。
每笔自己的颜色
每一笔都要有自己的颜色,写在一个 color 字段里,两种写法选一种:
| 字段 | 类型 | 说明 |
|---|---|---|
color | 颜色,或 2~16 个 {"at": …, "color": …} | 整笔一个颜色(#RRGGBB,写法与别处一致),或者沿这一笔自己的长度的渐变。渐变里 at 0 是它的起点、1 是它的终点,必须按 at 从小到大写;两端之外保持端点色,所以不必铺满整笔。 |
没有图形级的颜色兜底,所以不写 color 的定义直接加载失败;一个字段也意味着不存在"既纯色又渐变"的一笔。渐变是跟着笔画长度走的,不随进度拉伸:图形只画到一半时,看到的是这条渐变的前半段。
模组自带的三个
本体自带 mxt:five(环 + 五角星)、mxt:six(环 + 两个三角)、mxt:eight(环 + 两个方框),写在模组自己的包里,代码里没有针对它们的特例——它们和包写的图形走同一条路。这三份的每一笔都写 #ffffff,疏密与大小都用默认值(0.33 与 2)。