| name | level-design |
| description | 为「烧风」(物理益智:放置热/冷源造风,让纸飞机抵达站点)创作全新关卡:纯数据 JSON 协议 v1、SDF 地形表达式、参数量程与设计红线。只读本文即可写出合法可玩的关卡。 |
烧风关卡创作指南(协议 v1)
关卡是纯数据 JSON:热/冷源造风 → 纸飞机抵达全部站点即过关。设计哲学 = 少量原子能力 × 组合涌现玩法,不堆新机制。本文档自足:读完即可产出关卡文件。
1. 一个关卡长什么样
{
"$schema": "./level.schema.json",
"id": "luo-yu",
"name": "落羽",
"tagline": "冷让风下沉",
"win": { "title": "轻羽落地", "text": "阳光是热的来处,冷是风的另一张面孔……" },
"world": { "w": 76, "h": 56, "cell": 0.75 },
"terrain": { "sdf": "42 + 8*ss(x/30) - y" },
"budget": { "hot": 2, "cold": 3 },
"spawn": { "x": -5, "y": 8, "vx": 16 },
"goals": [{ "x": 62, "r": 7.5 }],
"ambient": { "x": 2.6, "y": 0 }
}
$schema 是编辑器提示(可省略);其余字段语义见 §3。更多实例:既有 25 关(第 1 关「落羽」最简;第 16-20 关用圆/盒/胶囊原语做浮石、隧道、石柱地形;第 21-25 关「彩风」= 气球篇)。
2. 坐标、单位与尺度
- 坐标:x 向右、y 向下,单位 = 世界单位。画布即
world.w × world.h 的矩形,原点左上。
- 画布:常规关 76×56;大地图 100×64、110×68。cell(流体网格粒度)0.5–1.5,常规 0.75、大地图 0.8–0.9。
- 网格容量(超出会被关卡校验拒绝):画布含 10 单位外扩边距(左/右/上)折算成网格后须满足
16 ≤ (w+20)/cell ≤ 256、16 ≤ (h+10)/cell ≤ 160。
- 摆放边界:站点/固定源/风扇必须在画布内(x∈[0,w],y∈(0,h]);出生点可以出画布 ±20 单位(飞机从画布外飞入是常态)。
- 物理刻度(设计直觉用):
- 悬停风速 = 1.0 单位/秒:上升风超过它则飞机抬升,不足则下沉;无风时坠落终速同为 1 单位/秒。风强弱判断以它为基准。
- 源注入半径 3.4 单位;温度场钳制 ±9。
- 风扇注入半径 3 单位。
- 站点检测圆在锚点(杆底)上方 2 单位处;锚点缺省 = 该 x 处地表高度。
- 坡度:剖面
h*ss((x-c)/w) 的最大坡度 = 1.5×h/w(缓坡靠加大 w)。
- 摩擦角 ≈16.7°:比它缓的坡飞机可停驻;更陡的坡无风自然下滑;垂直墙不可穿透。陡坡/崖 = 天然屏障。
- 结算口径:总耗时 = 通关时间 + 源罚 4s/个 + 贴地罚 1s/s(贴地 = 离地 <1 单位)。少源快解是"更优解",设计多源配合类关卡时要意识到单源捷径的存在。
3. 字段速查(协议全表)
必填:id、name、tagline、win、world、terrain、budget、spawn、goals。顶层未知字段会被拒绝(防笔误)。
| 字段 | 类型/范围 | 含义与要点 |
|---|
$schema | 字符串,可省略 | 仅编辑器补全提示,游戏不校验它 |
id | 小写 slug:[a-z0-9][a-z0-9-]{0,31} | 全局唯一标识(语义化命名,如 luo-yu);显示序号由关卡顺序决定,与 id 无关 |
name / tagline | 非空字符串 | 关卡名 / 选关页副标题 |
win.title / win.text | 非空字符串 | 过关标题与文案(叙事与浪漫感放这里,机制先成立文案后补) |
world.w / world.h | >0 | 画布宽高(世界单位) |
world.cell | 0.5..1.5 | 网格粒度(小地图 0.75 即可) |
terrain.sdf | SDF 表达式字符串 | 有符号距离场:>0 空气、<0 实体(§4) |
budget.hot / budget.cold | 整数 ≥0 | 玩家可放置的热/冷源数量上限 |
spawn.x | 数值 | 出生 x(允许画布外 ±20) |
spawn.y | 数值,可省略 | 出生 y,缺省 = 该 x 处地表 |
spawn.vx / spawn.vy | 数值,可省略 | 初速度(缺省 0)。飞入感用 vx 10–30 |
goals[] | ≥1 项 | 抵达圆站点;全部抵达过即过关,顺序无关;滑行进入同样计数 |
goals[].x | 0..w | 站点中心 x |
goals[].y | (0,h],可省略 | 锚点(杆底)y,缺省 = 该 x 处地表;洞穴内站点必须显式给 y |
goals[].r | (0,15] | 抵达半径 = 虚线圆半径。教学关 9–11 给容差,硬核图可小到 3.5–4 |
ambient | 可省略 | 环境风(常风 + 可选温度偏置/潮汐) |
ambient.x / ambient.y | 数值 | 常风分量(既有全部 y=0 的横风,x∈[0.4,3.4]) |
ambient.temp | [-10,10],可省略 | 环境温度偏置:正 = 全域上升风、负 = 全域下沉(量程见 §5) |
|
4. 地形 SDF
sdf(x,y):>0 空气、<0 实体,世界坐标 y 向下。世界内必须有气(有处可飞);实体可选——无地面的纯空域合法(飞机可全靠风场飞行,不着地也成立),全实体则被拒绝。两种写法:
- 高度场
H(x) − y:地表在 y = H(x)(H(x) 是剖面配料之和,如 42 + 8*ss(x/30))
- 真 SDF 原语:可表达高度场做不到的洞穴、拱门、悬挑、浮石
可用函数:
- 变量/常量:
x y PI E;运算:+ - * /、一元正负、括号(无幂/取模)
- 剖面(以 x 为自变量,加进
H(x) − y):ss(t)(= smoothstep,自动钳 [0,1])、smoothstep(e0,e1,x)(GLSL 三参形式,要求 e0<e1)、bump(c,w,h)(对称孤峰,中心 c、半宽 w、高 h)、gauss(c,w,h)(高斯圆丘,3w 外视为平原)、clamp abs min max sin cos sqrt
- 原语(精确距离):
flat(y0)(水平地基:y0 以下实体)、circle(cx,cy,r)(实心圆盘/浮石)、box(cx,cy,hw,hh[,r])(圆角盒/石柱)、capsule(x0,y0,x1,y1,r)(圆润山脊/隧道顶)
- 组合:
min(a,b) 并 / max(a,b) 交 / smin(a,b,k) 光滑并 / smax(a,b,k) 光滑差(k = 过渡带宽);挖洞 = smax(a, -b, k)
配方(均出自既有关卡,可直接改数):
缓坡高原(L1 落羽): 42 + 8*ss(x/30) - y
陡峰长坡(L2 扶摇): 48 - 26*ss((x-36)/12) - y
对称台地(L4 潮汐): 44 - 34*ss((x-34)/4)*ss((50-x)/4) - y
两级山脊(L5 回归): 30 - 6*ss((x-20)/10) - 6*ss((x-44)/10) - y
山体隧道(L17 回音): smax(58 - 36*ss((x-34)/3)*ss((74-x)/3) - y, -capsule(28,46,80,46,8), 2)
石柱群岛(L16 坠星): min(flat(60), min(box(56,44,3,16), circle(82,44,10)))
地下洞穴: smax(flat(40), -circle(30,42,6), 1.5)
空中浮石: min(flat(40), circle(30,20,4))
坡度控制:h*ss((x-c)/w) 最大坡度 1.5h/w。比摩擦角(16.7°)缓的坡能停驻飞机,更陡的坡无风下滑——坡不只是地形,是"可停驻的台/必须推上去的崖"两种工具。
5. 物理量程(设计刻度)
常风:横向风 0.4–3.4(1 以下微风、1.8 左右有明显推力、3.4 极强)。带固定源的关卡常风 ≤0.8:再大飞机可沿平地无限滑行挂机通关。
环境温度 temp(均衡升沉速 ≈ 11×|temp| 单位/秒):
| temp | 手感 | 用法 |
|---|
| ±0.05–0.1 | 微风 | 背景氛围(L16–L20 组基调) |
| ±0.2–0.5 | 玩法级 | 显著牵引/压制飞机 |
| ±1 起 | 极端 | 飞机任风摆布,靠源链/地形造生存走廊(L12 逆旅 temp=−1) |
| |temp|≥9 | 单极世界 | 源温被 ±9 钳制:+9 时冷源也压不下空气("无下沉世界")、−9 对称——浮力只剩一极 |
极端温度是重型原子,一关只表达一个温度概念。正 temp 会抬升贴地挂机飞机、叠加常风漂移——用了 temp 的关卡更要严防挂机。
风扇:射流从风口起 ~4 单位内最强(约 1.3×power),10–14 单位后消散——关卡跨度要短,或让射流贴地供滑行借用。柱顶有回流区,飞机在柱顶悬停可能被抛高;摇头摆幅 ≤0.4 rad 稳定可控、大摆幅(既有 1–1.15)营造节奏但更混沌,方向不要越过水平线(永不上扬)。
源与站点:热源注入 +10/s、冷源 −10/s(半径 3.4,温度钳 ±9)。站点 r:教学 9–11,硬核 3.5–4——r 太小 = 擦边必败。
预算与出生:既有关卡 hot 1–4、cold 0–3(合计 2–7);出生 x 在画布外 −6..−4、vx 10–30、vy 恒 0(斜抛出生暂非主流)。
气球:锚定障碍,不遮风(风场穿透)、不判定过关。摆幅 = 当地风×0.09、钳在半径 25% 内(常风 3 时约 0.27 单位的微摆,可当风向标读);机球心距 < r+0.6 即爆,反推风速 9、沿球心→飞机方向(正中心命中退化为向上弹)。四种用法:风向标(读摆向)、缓冲/偏转幕(挡路)、弹推借力(爆气反推当跳板)、门帘(balloonGate:全爆才揭示 goals)。反推很强:垂直下落撞气球会被弹回高处反复(一次弹跳≈十几秒),链路设计别让飞机"蹦着走"。
6. 设计方法
- 组合思维:问"我在组合哪些原子?"——热源+地形=托升、冷源+地形=压降、多站点=多段旅程、常风+潮汐=节奏、固定源+风扇=热风走廊、temp+源=净浮力谜题。新字段 = 新原子,必须想得出第二个用法才值得加(第二关测试)。
- 解法先行倒推:先手工摆出可通关摆法,再倒推地形/预算。早期关卡只留一个明显思路;站点"全部抵达过、顺序无关",顺序感靠地形引导,不靠判定强制。
- 起承转合:引入 → 发展 → 转折 → 收束;教学关一段只教一个概念。
- 假设 → 挫败 → 顿悟:让玩家带着旧经验失败后重估(L3:第一站自然抵达、第二站被山脊挡住)。
- 挂机红线:零操作 150s 内不许通关(挂机轨迹不得进入任何抵达圆);允许自然抵达前几站做免费教学。
balloonGate 关卡额外注意:挂机撞爆部分/全部气球后的轨迹同样不得入圆。
- 克制:一个关卡表达一个概念。
- 叙事:嵌进
win/tagline,机制成立后再写文案。
7. 反模式
- 强热柱接力:轻质飞机在强热柱中轨迹混沌,摆放差 1–2 单位结果剧变——避开"必须精确命中"的布局。
- 站点圆太小:边缘擦过 = 几乎必败;教学关 r 用 9–11。
- 一关教太多:三个新机制 = 没人学得会,拆到后续关卡。
- 单源捷径:耗时优先的解法天然偏好少源(源罚 4s/个);意图是多源配合的关卡,要确认单源解不存在或慢得不值得。
- 固定源 + 强常风:平地滑行挂机通关(红线常风 ≤0.8)。
- 单点调参碰运气:挂机通关与否对 temp/风扇功率非单调(改 0.1 可能从"能挂机"变"不能"再变回);调参破坏挂机时要把候选档全部验证一遍,选全档失效的组合。
- remix 免自检:只调参不改地图,红线不会自动成立——调参后必须重查挂机。
- 气球铺满图:气球是调味不是主菜——一关 ≤10 只为宜(gate 关除外也克制),多了飞机"蹦着走"且爆音成噪音。
8. 验收清单(发布前逐项过)
- 字段合法:范围见 §3,未知顶层字段零容忍,SDF 语法与世界内有气(§4)。
- 150s 挂机不通关(红线;确定性强,单样本即可,但调参/remix 后必须重跑)。
- 至少一个可复现解:坐标 2 位小数(玩家 URL 放置同精度),且解不"脆"——源位置挪动 1–2 单位仍能过关(鲁棒 ≥75% 才宽容好上手)。
- 教学关站点 r ≥ 9;多源意图关跑过单源捷径检查。
- 文案非空、id 全局唯一且语义化。
验证工具(挂机模拟、可解性精验、解法搜索、参数扫描、登记流程)见同目录 ENGINEERING.md。