小游戏库
小游戏 是已经落地的那一个(跳铃铛的完整设计 + 十条候选清单)——那一份是"当时够用"。 这一份是库:把候选扩到 14 个,每一个都写到"能照着写代码"的粒度,并且补上两件之前没写的东西:
| 新增 | 为什么必须补 |
|---|---|
| 本能兜底(第三节) | 「零失败」以前只写在口号里。这一份给每个小游戏指定兔子自己的本能行为,玩家不碰屏幕时由它把流程走完 |
| 四类操作的判定口径(第二节) | 之前只写了"点击/按住/滑动三选一",但 小游戏 里用这条否掉了拖动类的摆石子——理由说不圆。这一份把判定标准写清楚 |
相关的另外三份:玩法(自动跑跳的数值)· 关卡与解谜(岔路口)· 收集手册(手账与花园)
[!tip] 画面描述用的是哪套色
本文的配色一律写项目简介的四色:米白 #F8F4EA · 蓝灰主色 #A8ACB5 · 墨蓝 #2C3038 · 棕灰 #91877D。
落到线宽、暗面位置、纸纹强度、投影比例这些细节时,以 美术规范 为准——
那一份是从参考图像素里量出来的,色号分得更细(#7C8B99 石青、#7E9B93 苔绿……),
两者是同一套灰蓝水彩的两个粒度,不冲突(#F8F4EA 和规范里的米白 #F8F5EC 只差 2 个色阶)。
一、小游戏在节奏里的定位#
零操作是这个游戏的立身之本(玩法 第四节),所以小游戏不能是"必须过的关卡",否则零操作就成了空话。
| 项 | 定案 | 理由 |
|---|---|---|
| 频率 | 每关 0~1 个,间隔 9000 |
多了就变成"关卡之间的关卡",主循环被切碎 |
| 触发 | 跑到小游戏点,兔子自动停下,面板从底部推上来 | 停下来的动作本身在说"这里可以玩一下",而不是"你必须操作" |
| 时长 | 10~20 秒 | 短于 10 秒不像一件事,长于 20 秒就从"插曲"变成"关卡" |
| 计时 | 没有 | 玩法 第七节明令:小游戏也不计时 |
| 跳过 | 没有跳过按钮 | 因为随时可以放着不管——不做就等于没做。加一个"跳过"等于承认它是障碍 |
| 关系 | 是插曲,不是关卡 | 它的全部价值是让玩家在这十几秒里手感舒服,外加一层 RPG 味的包装 |
1.1 它在两层互动里的位置#
轻解谜(脑子) 每关 2~3 次 看线索 → 选一个出口 ← 慢,无时限
小游戏(手) 每关 0~1 次 一个动作做十几秒 ← 快,也无时限
跑动(眼) 全程自动 看兔子跳、花自己进手账 ← 零输入
三者共用一个前提:没有任何一处考反应。 这条比三条准入标准更底层,被否掉的"打水漂"就是撞在这条上(见第七节)。
二、三条准入标准#
任何新小游戏要进这个库,必须先过这三条(与 小游戏 第二节一致):
| # | 标准 | 为什么 | 可执行的判据 |
|---|---|---|---|
| 1 | 从头到尾只有一种输入事件 | 两种操作 = 两种要教的东西。玩家在插曲里不想学新东西 | 代码里只出现一种 pointer 事件处理分支(tap / hold / drag / swipe 四选一) |
| 2 | 10~20 秒能结束 | 超过 20 秒就是关卡,会打断主循环 | 把最慢的一条路径加一遍(本文每节都给了这道加法) |
| 3 | 零失败:不存在失败状态 | 铁律。不是"失败后可重试",是压根没有"错"这个状态 | 搜一遍代码:不许出现 fail / retry / lose 字样的分支;且完全不输入也能走到结束 |
2.1 操作只有四类,而且要分清"拖动"和"滑动"#
| 类型 | 事件形态 | 手感 | 谁来教 |
|---|---|---|---|
| 单击 | pointerdown → pointerup,位移 < 8px、时长 < 200ms |
点一下就完 | 岔路口的点击(已有) |
| 按住蓄力 | pointerdown 后持续计时,pointerup 时用按住时长换算 |
攒劲、松手 | 跳铃铛(已有) |
| 拖动 | pointerdown 后位移持续跟进,pointermove 每帧都改变画面 |
抓着东西挪 | 全新(本库 2 个) |
| 滑动 | pointerdown 后位移 > 60px 且时长 < 300ms,一次划完就松手 |
甩一下 | 全新(本库 3 个) |
小游戏 里写的否决理由是"它是唯一需要拖拽的,违反了操作只有一种"—— 这句话站不住:拖动本身就是一种操作。真正否掉它的有两条,都在本文第七节写清楚了: ① 它是"先点选石子、再拖动放置",两个动作叠加,这才是"混合了两种操作类型"; ② "摆出能踩的路"隐含"摆错就过不去"的失败状态。 留下这条修正是因为判据说不圆,标准就守不住——下一批设计一定会有人拿"拖动也是一种操作"来抬杠。
三、零失败的公共机制:本能兜底#
这是这份文档最值钱的一节,也是「零失败」第一次落到可执行的写法上。
每个小游戏都必须指定一个「本能兜底」:玩家 0 输入时,由兔子的本能行为把这段流程走完,并且走到同一个终点。 玩家动手不是"通关必需",而是"让这件事变快 / 变好看 / 由我来决定"。
这条规矩解决三个老问题:
| 问题 | 本能兜底怎么解决 |
|---|---|
| "不操作会不会卡住?" | 不会。兜底行为有固定周期(表里给了秒数),一定把流程推完 |
| "不操作会不会亏?" | 终点收获相同,差别只在过程(看清楚了多少、谁决定的、好不好看) |
| "那玩家为什么还要动手?" | 因为动手更快、更有参与感,而且能决定结果的样子。参照跳铃铛的「敲响就有种子」原则 |
它规定了"多久没输入就开始兜底"。这个数字不能太长——玩家读到这里会把它理解为"游戏在等我"。 统一取 2.0~4.0 秒(不超过 4 秒)。
3.1 14 个的本能兜底一览#
| # | 小游戏 | 0 输入时兔子/世界会做什么 | 兜底启动 |
|---|---|---|---|
| 1 | 跳铃铛 | 兔子在原地蹦两下,藤蔓自己枯落让开(等一会儿也行) | 20.0s |
| 2 | 吹蒲公英 | 风自己把种子带走,落在脚边 98px 处的草地上 | 3.0s / 每颗 |
| 3 | 荡藤过涧 | 按满 4.0 秒自动松手,荡到最远处 | 4.0s |
| 4 | 刨苔土 | 兔子路过每处松土自己刨 0.6 秒(只到腐叶层) | 2.5s / 每坑 |
| 5 | 接露珠 | 露珠自己滴落,溅出的水渍连成一条指向收集点的线 | 每颗自然滴落 |
| 6 | 接小麻雀 | 麻雀自己扑腾着飞起来(学飞嘛,摔不着) | 落地前 0.2s |
| 7 | 敲树干 | 兔子自己听见动静去敲,3 秒一下 | 3.0s |
| 8 | 踩水洼 | 兔子路过自己踩,水底的东西被水冲上岸 | 每个水洼路过时 |
| 9 | 追萤火虫 | 兔子看见光就自己扑,每 2.5 秒一次 | 2.5s |
| 10 | 拨开高草 | 风自己把草吹开,每 2.5 秒露一次缝 | 2.5s |
| 11 | 抖落积雪 | 兔子在树下蹦跶震落积雪,每 3 秒掉一根 | 3.0s |
| 12 | 转向日葵 | 植物自己找光,3.5 秒转正一株 | 3.5s / 每株 |
| 13 | 拔根茎 | 兔子自己拔(这是它的本能),4 秒一株 | 4.0s / 每株 |
| 14 | 分种子 | 三只鸟自己飞走,兔子把种子撒在地上,下一关那片地长出一丛花 | 14.0s |
兜底只在玩家 0 输入时启动,一旦玩家碰了屏幕,兜底计时清零重算。 如果做成无条件自动播放,玩家会觉得"那我点它干嘛"——这是这一节唯一容易被做错的地方。
另一条:兜底不推进进度条、不弹提示。它发生在场景里(兔子自己在动),而不是在 UI 上 (不能出现"检测到您长时间未操作"这类文案,那是在催玩家)。
四、公共数值基线(所有小游戏共用)#
| 项 | 数值 | 说明 |
|---|---|---|
| 渲染分辨率 | 540 × 960(原生 1080×1920,×2) | 所有像素值都在这套里写 |
| 兔子地面线 | y = 691 | 世界条基线,钉死不动 |
| 世界条(可走区) | y 442 ~ 749 | 小游戏面板从 749 往上推 |
| 地形剖面层 | y 749 ~ 826 | 刨苔土 / 拔根茎 用这一层 |
| 手账条 | y 826 ~ 960 | 收集物飞进去的终点 |
| 重力 | g = 1800 px/s² | 兔子、石头、果实都用它 |
| 跑速 | 300 px/s | 1×;速度档 1.5× / 2× 时所有小游戏的计时同比放大(否则 2× 下容差会被压成一半) |
| 小跳 / 大跳 | v₀ = 380 / 520,高度 40 / 75px | 起跳距离 68px / 112px |
| 蓄力→起跳 | v = 300 + 按住秒数 × 700,上限 900 |
跳铃铛那一套,别改 |
| 蓄力条 | 长 120px,0→满 = 0.857s | 满档刻度线画在 120px 处 |
| 通用容差 | ±13px(对应 ±18ms) | 精度类判定 |
| 宽松容差 | ±45px(对应 ±115ms) | 探索类判定(吹蒲公英) |
| 单击热区 | 视觉尺寸 × 1.4 | 露珠画 18px,判定圆半径 26px |
玩家把速度切到 2× 时,如果小游戏内部计时不变,那么蓄力条会"跑得比手指快", 判定容差实际被压成 9ms——手感会莫名其妙变差,而且玩家不知道是自己调了速度。 做法:小游戏面板打开时,面板内的所有时间 × 当前速度档(即 2× 时蓄力条涨得慢一半、露珠停 1.8 秒)。 等价于"面板里世界照旧,只是钟慢了"。这条要在实现时就定下来,事后补很麻烦。
五、总表(14 个)#
图例:🌧 雨后 · ❄ 冬 · ☀ 时间/日照 · 🍂 秋/候鸟 · 🌙 夜 | 🐦 与其他动物互动
5.1 玩法总表#
| # | 名称 | 一句话玩法 | 操作类型 | 时长 | RPG 味提供什么 |
|---|---|---|---|---|---|
| 1 | 跳铃铛 ✅ | 按卡片给的顺序,在高、中、低三个铃铛上各跳一下敲响它 | 按住蓄力 | 10~18s | 角色互动——"没东西也跳一下"这个性格变成了正式玩法 |
| 2 | 吹蒲公英 ✅ | 按住攒气吹蒲公英,看种子飘到近树桩还是远风车 | 按住蓄力 | 10~15s | 世界秘密——落点越远看到的地形越多 |
| 3 | 荡藤过涧 ✅ | 抓住藤蔓按住往后荡,松手飞过涧对面不同高度的三块落点 | 按住蓄力 | 10~16s | 探索感——荡上最高的枯树杈能看到这一关的全貌 |
| 4 | 刨苔土 ✅ | 在土壤剖面里按住刨,穿过腐叶层、苔土层、砾石层 | 按住蓄力 | 11~19s | 成长感——根茎是花园升级的第二货币 |
| 5 | 接露珠 ✅ | 花瓣上的露珠停住的那 0.9 秒里点一下,把它收进手账 | 单击 | 13s | 探索感——集满 5 颗,水渍连成一条指向遗物的线 |
| 6 | 接小麻雀 ✅ 🐦 | 学飞的小麻雀掉下来,点一下让兔子举爪接住 | 单击 | 11~12s | 角色互动——手账第一次出现"朋友"这一格 |
| 7 | 敲树干 ✅ | 点倒木上三个年轮疤,听回声的不同找出虫在哪一格 | 单击 | 10~13s | 世界秘密——空腔木意味着附近有某株稀有植物 |
| 8 | 踩水洼 ✅ 🌧 | 点雨后地上的水洼,荡开倒影,看水底露出来的是什么 | 单击 | 12s | 世界秘密——倒影里的鸟和字指向下一关的地形 |
| 9 | 追萤火虫 ✅ 🌙 🐦 | 划一下屏幕,兔子朝那个方向窜,追夜里的光点 | 滑动 | 11~12s | 角色互动——收到 3 只以上它们会排成一行带路 |
| 10 | 拨开高草 ✅ | 左右划开比兔子还高的草,看清草后面的岔路牌 | 滑动 | 12~16s | 世界秘密——提前看到本关岔路口的线索 |
| 11 | 抖落积雪 ✅ ❄ | 划过树上的枝条抖落积雪,看雪下面藏着什么 | 滑动 | 11~15s | 探索感——鸟窝里有上一只鸟留下的东西 |
| 12 | 转向日葵 ✅ ☀ | 拖着花盘转,让它对准画面上那个明牌的小太阳 | 拖动 | 12~15s | 世界秘密——三株转正后连成一条线指向画面深处 |
| 13 | 拔根茎 ✅ | 按住植物往上拖,把埋在土里的根茎一段段拔出来 | 拖动 | 12s | 成长感——最长的根茎对应最稀有的花 |
| 14 | 分种子 ✅ 🍂 🐦 | 三只景深不同的鸟,点一只把种子撒给它,它跟你走 | 单击 | 10~18s | 选择感——全库唯一一个"选了会影响下一关"的 |
上表是「最快路径 ~ 完全不操作(兜底)路径」,两个端点都落在 1020 秒内。
每节里的「时长验算」是把这条链加了一遍(不是估的)——例如 6.4 刨苔土:
每处松土 0.62.6s + 出土 0.8s + 跑位 0.5s,4 处 = 7.615.6s,加开场 3.0s = **10.618.6s**。
5.2 技术与素材总表#
| # | 名称 | 主要用到的横版特性 | 用到的兔子特性 | 复用已有系统 | 实现难度 | 新素材量 |
|---|---|---|---|---|---|---|
| 1 | 跳铃铛 | 高低差 | 跳得高 | 跳跃物理 + 序列帧 | 已实现 | 0 |
| 2 | 吹蒲公英 | 风向 + 抛物线 + 纵深 | — | 蓄力 + 抛物线 + 手账 | 低 | 10 张(小图 ≤12KB) |
| 3 | 荡藤过涧 | 抛物线 + 高低差 + 纵深 | 跳得高 | 抛物线 | 中 | 8 张 |
| 4 | 刨苔土 | 地形剖面(地下) + 重力 | 会挖洞 | 剖面层 + 手账 | 低 | 8 张 |
| 5 | 接露珠 | 前后景分层 + 高低差 | 体型小、灵巧 | 收集系统 | 低 | 6 张 |
| 6 | 接小麻雀 | 抛物线 | 前爪、耳朵 | 跑动画 + 手账 | 低 | 7 张 |
| 7 | 敲树干 | 纵深(三个景深的疤) | 耳朵灵敏 | 已有树干素材 + 音效 | 中(需 3 段音效) | 7 张 + 3 音效 |
| 8 | 踩水洼 | 前后景 / 倒影 | 体型小 | 天空远山图(翻转复用) | 低 | 4 张 |
| 9 | 追萤火虫 | 视线遮挡 + 纵深 | 跑得快 | 光照 / 夜色蒙版 | 中 | 6 张 |
| 10 | 拨开高草 | 视线遮挡 + 前后景视差 | 体型小能钻 | 草的可平铺贴图 | 中 | 5 张 |
| 11 | 抖落积雪 | 高低差 + 重力 | 蹦跳 | 雪粒子 | 低 | 10 张 |
| 12 | 转向日葵 | 光线方向 + 时间 | — | — | 低 | 4 张 |
| 13 | 拔根茎 | 地形剖面(地下) + 纵深 | 会挖洞 | 剖面层 + 花园 | 低 | 6 张 |
| 14 | 分种子 | 纵深(三只鸟三个景深) | 耳朵 | 鸟素材(若有) | 低 | 10 张 |
合计:14 个全部已实现(代码在 tools/art/scene/notes_mini.js)。
表里"新素材量"是设计稿估的位图素材量;实测这批实现一张位图都没用——
全部改成代码绘制(注册表里的 scene / hud),因为:
① 这批图形都是"圆 + 线 + 简单多边形",画出来比切图还快;
② 演示页是自包含的,每加一张图都要内联成 base64,100 张会把包体顶上去;
③ 代码画的东西能直接吃色板变量,改一次色板全部跟着变,不存在"忘了同步某张图"。
这是「零失败」这条准入标准最强的自动验法——一次输入都不给, 看它能不能自己走完、有没有东西交回来。实测结果:
| 游戏 | 零输入耗时 | 交回的奖励 |
|---|---|---|
| 跳铃铛 | 13.2s | 8 颗种子 + 一处花 |
| 吹蒲公英 | 15.5s | 1 颗种子 |
| 荡藤过涧 | 17.4s | 1 颗种子 + 一处花(抓住涧壁草根也摘到花) |
| 刨苔土 | 7.7s | 1 颗种子 |
| 接露珠 | 13.0s | 1 颗种子(露珠自己滴落也进手账) |
| 接小麻雀 | 11.0s | 「朋友 · 麻雀」+ 手账一格 |
| 敲树干 | 11.3s | 2 颗种子 + 甲虫 |
| 踩水洼 | 13.2s | 1 颗种子 + 一行线索 |
| 追萤火虫 | 15.2s | 1 颗种子 |
| 拨开高草 | 8.0s | 本关岔路口的线索 |
| 抖落积雪 | 14.1s | 1 颗种子 |
| 转向日葵 | 11.1s | 三株连线的线索 |
| 拔根茎 | 11.0s | 3 颗种子 + 根茎 |
| 分种子 | 16.1s | 2 颗种子 + 下一关长出一丛花 |
其中 按住蓄力 4 个 / 单击 5 个 / 滑动 3 个 / 拖动 2 个——四种操作都有,但每个小游戏内部只用一种。
六、逐个设计#
代码在 tools/art/scene/notes_mini.js,场景只负责"什么时候开"和"奖励怎么记账"。
每个游戏是一个对象,要实现的东西固定就这几个:
id / name / kind / op / hint(元数据)、open(h) / update(dt) / scene(c) / hud(c)(生命周期)、
down / move / up(输入,只实现该游戏用得着的那几个)。
为什么要写成注册表:第一版只有"跳铃铛",它是硬编码在场景循环里的——
一个 mini 变量、一组 miniXxx 函数、散在 draw 里的三段绘制。加第 2 个要改 6 处,
加第 14 个会变成一坨互相纠缠的分支。
现在加第 15 个只需要 push 一个对象,场景代码一个字都不用改。
(面板 "按什么操作" 那一行也是读 kind 生成的,不是写死的。)
[!warning] 兜底机制有一条通用坑:它必须只在"玩家没有动作"时生效
跳铃铛的兜底是"兔子自己会跳,8 秒后开始、每 3 秒敲一个"。
第一版没做这层判断,结果兜底和玩家抢着做同一件事:
验收时玩家还在蓄力,兜底已经把三个铃敲完了。
解法是加一把锁 —— 玩家一按下就置 engaged,兜底从此让位。
14 个游戏里凡是有兜底的都按这条办。
:一句话 → 操作与判定(照着写代码)→ 时长验算 → 画面 → 为什么零失败 → RPG 味 → 实现难度与素材量。 所有坐标都是 540×960 渲染分辨率下的值。
6.1 跳铃铛 ✅(按住蓄力 · 已实现)#
一句话:按卡片给的顺序,在挂在三个高度的铃铛上各跳一下,把它敲响。
完整设计(含「一跳一铃」那个坑的来龙去脉)在 小游戏 第三节,这里只留一份可查的数值表。
| 项 | 值 |
|---|---|
| 操作 | 按住蓄力,松手起跳。全程只有这一种输入 |
| 铃铛高度 | 低 46px / 中 74px / 高 102px,间距 28px(> 容差 13px,所以最高点只可能匹配一个) |
| 蓄力 | v = 300 + 按住秒数 × 700,上限 900 |
| 判定 | 只在最高点判一次(vy <= 0 的那一帧),取最近的那个铃铛 |
| 容差 | ±13px ≈ ±18ms |
| 目标 | 需要高度 | 需要初速 | 需要按住 | 容差 |
|---|---|---|---|---|
| 低 🔔 | 46px | 407 | 0.153s | ±13px(±19ms) |
| 中 🔔 | 74px | 516 | 0.309s | ±13px(±18ms) |
| 高 🔔 | 102px | 606 | 0.437s | ±13px(±18ms) |
- 时长验算:3 次跳跃 ×(蓄力 0.15
0.44s + 滞空 0.450.67s + 演出 0.8s)≈ 4.2~5.7s,加开场读卡片 3s、结束让路演出 3s → 10~12s;玩家反复试(每次都重蓄)最坏 18s。落在 10~20s 内 ✔ - 画面:铃铛挂在三根从上方垂下的藤蔓上,铃身是米白
#F8F4EA平涂 + 蓝灰#A8ACB5轮廓,铃舌用暖金(唯一允许的暖色,占屏面积 < 1%);藤蔓是棕灰#91877D的细线。兔子在下方地面(y=691),蓄力时下蹲 12px、脚下出现 120px 长的蓄力条(墨蓝#2C3038@ 60% 底 + 米白填充)。起跳后地面投影同时缩小 40%、透明度降到 12%(美术规范 4.3)。 - 为什么零失败:敲错顺序 = 进度归零、灯全灭、飘一句"顺序不对,再听一次",不扣任何东西;每敲响一个铃铛就 +1 种子(不管顺序对不对)。什么都不做:20 秒后藤蔓自己枯落让开,兔子继续跑——不输入也能结束。
- RPG 味:角色互动。玩法 4.3 那条"没东西也跳一下"的性格设定在这里变成正式玩法——玩家会觉得自己在指挥一只爱蹦的兔子,而不是在操作一个光标。
- 难度 / 素材:已实现,0 新素材。
6.2 吹蒲公英(按住蓄力)#
一句话:按住攒一口气把蒲公英吹出去,看种子落在近处的树桩、中景的溪石,还是远处对岸的花丛。
| 项 | 值 |
|---|---|
| 操作 | 按住蓄力,松手释放。只有这一种输入,不需要瞄准(方向恒定 30° 上抛) |
| 种子物理 | 有绒毛 → 下落加速度取 a = 420 px/s²(不是兔子的 1800,这就是"飘"的来源);松手时 vy = −160(向上) |
| 风 | 从左边来,恒定向右 60 px/s(画面上的风纹向右流动) |
| 松手初速 | v_h = 60 + 按住秒数 × 240,上限按住 2.0s(v_h 最大 540) |
| 滞空时间 | 从 y=300 落到 y=0:解 300 + 160t − 210t² = 0 → t = 1.636s(与蓄力无关,绒毛让下落速度固定) |
| 落点 | x = v_h × 1.636,容差 ±45px(≈ ±115ms 的蓄力误差,刻意放宽——这是探索不是精度考核) |
| 落点 | 距起点 | 需要 v_h | 需要按住 |
|---|---|---|---|
| 近处树桩 | 200px | 122 | 0.26s |
| 中景溪石 | 420px | 257 | 0.82s |
| 对岸花丛 | 650px | 397 | 1.40s |
| 远处的旧风车基座 | 850px | 520 | 1.92s(上限内) |
蓄力条上画四个刻度点,每个刻度旁画一个小图标(树桩 / 溪石 / 花丛 / 风车)——明牌,玩家不用试就知道要按多长。
- 时长验算:每颗种子 = 蓄力 0.26
1.92s + 飘 1.64s + 落点演出 0.7s ≈ 2.64.3s;3 颗 → 7.8~12.9s;加开场 2s → 10~15s ✔ - 画面:坡顶,兔子举着一朵蒲公英(花托米白
#F8F4EA、绒毛用 2px 的#A8ACB5细线,共 9 根,逐根带 0.1s 相位滞后摆动)。松手后种子向右上飞出,沿途留下一条 12 点的虚线尾迹(落下 0.6s 后淡出)——玩家靠这条线读自己的蓄力结果。右侧是四层视差:近草(1.0)、树桩(0.7)、溪石(0.4)、远处的旧风车(0.15,压成剪影#2C3038@ 30%)。地面投影随种子升高变小。 - 为什么零失败:完全不按 → 风自己把种子带走(t=0,v_h=60),落在脚边 98px 处的草地上,那里也会长出一株蒲公英,照样进手账。三颗全不吹 → 15 秒后面板自己收起,手账里多 3 株蒲公英。"什么都不做"和"全部吹到风车"的收获完全一样,差别只在落点看到的风景。 蓄力过头也不会脱靶,只是飘出画面边缘,种子绕一圈自己飘回来(1.2s)。
- RPG 味:世界秘密。落在旧风车基座上会看到基座上的一行刻字(第二季的一条线索)——"我能吹多远"直接变成"我能看见多远"。
- 难度 / 素材量:低(一个抛物线 + 一个蓄力条,代码 100% 复用跳铃铛的蓄力与抛物线)。新素材 10 张:蒲公英 3 帧(未吹 / 半吹 / 吹散)、落点图标 4 张、风纹 3 条。合计 ≤ 12KB。
- 横版特性:风向(本库唯一一个把风做成玩法的)· 抛物线 · 纵深(风车剪影)
6.3 荡藤过涧(按住蓄力)#
一句话:抓住垂下来的藤蔓,按住往后荡,松手飞过涧,落在对面三块不同高度的落点上。
| 项 | 值 |
|---|---|
| 操作 | 按住蓄力,松手脱手。只有这一种输入 |
| 涧宽 | 180px(大跳只能过 173px,差 7px——所以这段必须荡,这是玩法成立的前提) |
| 藤 | 长 160px,垂足在涧的起点正上方,起跳点 = 兔子的手(y=600) |
| 松手初速 | v = 500 + 按住秒数 × 300,上限按住 2.0s(v 最大 1100) |
| 脱手方向 | 恒定 30° 上抛(藤的角度就是 30°,玩家松手时藤正好在那个角度) |
| 飞行距离 | d = 0.000481 × v²(= v·cos30 × 2·v·sin30 / g,已按 g=1800 展开) |
| 容差 | ±16px(≈ ±69ms 的蓄力误差) |
| 落点 | 距起点 | 需要 v | 需要按住 | 备注 |
|---|---|---|---|---|
| 涧底的草根(兜底) | < 180px | < 612 | < 0.37s | 不会掉下去,见下 |
| 对岸低岩台 | 190px | 637 | 0.46s | 比起点低 40px |
| 对岸平坡 | 308px | 800 | 1.00s | 与起点等高 |
| 高处的枯树杈 | 470px | 988 | 1.63s | 比起点高 55px |
上表按"落点与起点等高"算。落点每低 40px,实际距离 +18px;每高 55px,−22px。 这两个数(初稿)已并入配表,不在代码里写死——照工程约定"数值走配表"。
- 时长验算:一次荡 = 按 0.46
1.63s + 飞行 0.350.61s + 落地演出 1.1s ≈ 1.93.3s;做 4 次(4 道小涧连成一个段落,宽度都是 180px,中间各有落点)→ **7.613.4s**;加开场 2.5s(兔子跑到藤下、抬头看)→ 10.1~15.9s ✔ - 画面:涧是一条竖向的深色带(墨蓝
#2C3038到#4E5A66的竖向渐变,涧壁两侧分前壁(视差 1.0)和后壁(0.55)——这是纵深的关键,没有后壁就看不出它有多深)。藤是棕灰#91877D的 3px 曲线,按住时藤随摆角弯曲(用 5 段折线近似,每段角度 = 摆角 × (i/5))。兔子荡起来时耳朵向后再飘 6px、身体沿藤的方向倾斜;地面投影在涧上消失(没有地面就没有投影),落到对岸时投影从 0 涨到 26% 用 0.15s。 - 为什么零失败:松手太早 → 兔子抓住涧壁上的一丛草根,蹬两下爬上来(1.5s 动画),而且那丛草根上挂着一朵野花,顺手摘了(照「敲响就有种子」原则:做得不好也有收获)。什么都不按 → 按满 4.0 秒自动松手,直接荡到最远的枯树杈,拿到最多的收获。涧里没有水、没有深坑、没有"掉下去"这个状态——涧底画的是草根和石头,不是虚空。
- RPG 味:探索感。荡上 470px 的枯树杈只有一次机会看清"这一关还剩多长、下一个岔路在哪"——信息是收获的一部分。
- 难度 / 素材量:中(多一个"藤的弯曲"表现)。素材 8 张:藤 2 帧、兔子荡姿 2 帧(复用已有跑姿改耳朵与倾斜)、涧前壁/后壁各 1、落点 3 张。合计 ≤ 20KB。
- 横版特性:抛物线 · 高低差 · 纵深(涧的前后壁)
6.4 刨苔土(按住蓄力)#
一句话:按住让兔子在土里刨,穿过腐叶层、苔土层、砾石层,看每一层里埋着什么。
| 项 | 值 |
|---|---|
| 操作 | 按住蓄力(按住 = 刨,松开 = 停下看)。没有方向、没有位置选择 |
| 位置 | 地形剖面层,y 749(地面)往下 |
| 刨速 | 50 px/s(恒定,按住秒数 × 50 = 深度) |
| 土层 | 腐叶层 0#7E9B93)· 苔土层 30#8C9E93)· 砾石层 85~130px(#9AA3AB) |
| 每层埋的东西 | 腐叶层 3 颗种子(每 10px 一颗)· 苔土层 2 株根茎(35px 和 70px 处)· 砾石层 1 件遗物碎片(110px 处) |
| 到达时间 | 30px → 0.60s;85px → 1.70s;130px → 2.60s |
| 出土演出 | 播 0.8s:出土物走抛物线弹出(v₀=(120, −260),g=1800),飞进手账格 |
| 坑的回填 | 松手后 0.4s 内自己填回一半(不用玩家填,这是铁律「不需要回来管」) |
一个段落 4 处松土:横向排在剖面上(间距 900px),兔子跑过去自动停在下一处。
- 时长验算:每处松土 = 按住 0.6
2.6s + 出土 0.8s + 跑向下一处 0.5s = 1.93.9s;4 处 → 7.615.6s;加开场 3.0s(兔子跑到剖面边、看一眼深度标尺)→ **10.618.6s** ✔ - 画面:剖面是一条横向的土带,里面是平涂的三层色 + 一条 2px 的
#91877D分界线(不要画颗粒噪点,美术规范 4.2 要求"平")。兔子只露上半身,前爪每刨一下向下位移 6px,爪子旁有 3 粒土的抛物线飞溅(零素材:代码画的 3px 圆点)。深度标尺贴在剖面左端(20px 宽),上面画着三层分界线 + 小图标,明牌。出土的根茎是米白#F8F4EA描#A8ACB5线,尾端带一根须根。 - 为什么零失败:完全不按 → 兔子路过每处松土会自己刨 0.6 秒(它的本能),正好刨穿腐叶层,于是 4 处 × 3 颗种子 = 12 颗种子照拿。玩家按住更久 = 多拿 2 株根茎 + 1 件碎片。区别是"多拿",不是"少拿"。刨到最底也不会塌方、不会有虫咬、不会扣任何东西。
- RPG 味:成长感。根茎是花园升级的第二货币(见 收集手册 第四节——眼力/脚程/手账三档都可以用根茎抵一部分种子),这是全库唯一一个直接接上长期成长的。
- 难度 / 素材量:低(一个计时器 + 三个阈值判定)。素材 8 张:松土贴图 1 张、出土物 6 张(3 种子 + 2 根茎 + 1 碎片)、兔子刨土姿 2 帧。合计 ≤ 14KB。
- 横版特性:地形剖面(地下层)——这一层现在只画了土、闲着,这个游戏是给它找的活 · 重力(出土物抛物线)
6.5 接露珠(单击)#
一句话:花瓣上的露珠停住的那一小会儿里点一下,把它收进手账。
| 项 | 值 |
|---|---|
| 操作 | 单击(点露珠)。全程只有这一种输入 |
| 露珠位置 | 三层花瓣,前景 y=560、中景 y=600、后景 y=640(视差各差 0.1) |
| 一轮节奏 | 露珠挂在花瓣边缘停 0.9s(可点窗口)→ 滚落 1.2s → 掉落 0.5s → 消失。一轮 2.6s,共 5 轮 |
| 命中判定 | 露珠视觉直径 18px,判定圆半径 26px(放大 1.4 倍,照顾手指) |
| 点中效果 | 露珠走 0.35s 抛物线(v₀=(90, −220))飞进手账格,+1 水珠 |
| 点空效果 | 什么都不发生,只飘一个"滴答"的音效。不扣、不掉、不打断节奏 |
- 时长验算:5 轮 × 2.6s = 13.0s,误差 ±0(节奏是固定的)✔
- 画面:三片花瓣从上往下依次压住(前景最实、后景最淡,透明度 100% / 78% / 55%),花瓣是米白
#F8F4EA平涂 + 蓝灰#A8ACB51px 轮廓,只有一朵花是暖色的(花心#91877D)。露珠是一颗 18px 的圆,只有一处高光(左上,2px,冷白),滚落时高光跟着转。点中时露珠外圈闪一圈 0.25s 的米白光环。水渍是#A8ACB5@ 26% 的一个扁椭圆(美术规范 4.3 的接触投影色)。 - 为什么零失败:什么都不点 → 5 颗露珠全部自己滴落,落地的水渍连起来是一条线,指向最近的一处收集点(兔子会顺着看一眼、朝那个方向多跑两步)。点满 5 颗 → 那条线更清楚(多一个箭头)。也就是说:不点会拿到"提示",点满会拿到"更清楚的提示"——两种都是正的。13 秒后面板自己收起。
- RPG 味:探索感。这条水渍线是本关第一个"世界在给我指路"的时刻,比任何 UI 箭头都更贴合"看"这个核心动作。
- 难度 / 素材量:低(一次性计时 + 5 个判定圆)。素材 6 张:露珠 1 张 + 花瓣 3 层 + 水渍 1 张 + 露珠闪光 1 张。合计 ≤ 8KB。
- 横版特性:前后景分层(三层花瓣三个景深)· 高低差(露珠从花瓣滚到地面)
6.6 接小麻雀 🐦(单击)#
一句话:学飞的小麻雀从枝头掉下来,点一下让兔子举起前爪接住它。
| 项 | 值 |
|---|---|
| 操作 | 单击。只有这一种输入 |
| 场景高度 | 枝头 y=430,兔子地面 y=691,落差 261px |
| 下落时间 | t = √(2 × 261 / 1800) = 0.539s → 判定窗口 0.54s(很宽,不是考反应) |
| 判定 | 麻雀离地 0~220px 的这段时间内点击有效(约 0.42s 窗口);点击后兔子进入"接"姿 0.3s,麻雀落到耳朵上 |
| 三只的节奏 | 第 1 只自己扑腾飞走(不用接,教"这是会飞的")→ 第 2 只直直掉(要接)→ 第 3 只在空中打旋(要接) |
| 每只间隔 | 4.0s 一轮,共 3 轮 |
- 时长验算:3 轮 × 4.0s = 12.0s(第 1 轮缩短为 3s → 11s)✔
- 画面:枝头是棕灰
#91877D的粗线,挂着 4 片叶(米白偏绿)。麻雀是两笔就能画完的剪影——身体一颗 16px 的椭球(#91877D)+ 一只 8px 的翅膀(#A8ACB5)+ 一颗黑点眼,不描边(美术规范 4.1「极小元素不描边」)。接下之后它停在兔子耳朵上:耳朵被压弯 5°、麻雀随呼吸起伏 2px,停留 3 秒再飞走。落地的麻雀不会摔坏,只是翅膀扑腾 3 下、飞得歪歪扭扭地升起来(这条动画是这个游戏能不能"零失败"的关键,必须画得不狼狈——歪但精神)。 - 为什么零失败:一只都不接 → 每只麻雀落地前自己会扑腾飞起来(它们本来就在学飞),三次之后麻雀妈妈回来把它们叫走,面板收起。手账里依然记一格"朋友 · 麻雀"(只是没有"我接住过"的那个小勾)。也就是说:不接 = 少一个勾,不接 ≠ 少一格。
- RPG 味:角色互动。这是全库第一个"别的活物因为你而改变行为"的设计——它落进手账的第四类格子(不是植物、不是遗物、是"遇见过的动物")。麻雀之后会在别的小游戏(追萤火虫、分种子)的背景里飞来飞去,认得它。
- 难度 / 素材量:低(一个 0.54s 的判定窗口 + 一个"朋友"标记)。素材 7 张:麻雀 4 帧(枝头 / 下落 / 扑腾 / 停耳朵)、枝头 1 张、兔子抬前爪 2 帧。合计 ≤ 12KB。
- 横版特性:抛物线(麻雀的下落与飞走都是)
6.7 敲树干(单击)#
一句话:点倒木上三个年轮疤,听回声的不同,找出虫藏哪一格。
| 项 | 值 |
|---|---|
| 操作 | 单击(点疤)。只有这一种输入 |
| 三个疤 | 沿倒木斜着排:x = 200 / 300 / 400,y = 662 / 672 / 682(越靠右越远越小:直径 46 / 40 / 34px,不透明度 100% / 85% / 70%) |
| 判定 | 点击热区 = 疤的外接圆 × 1.4(半径 32 / 28 / 24px) |
| 回声 | 点一下 → 兔子耳朵贴上去敲 2 下(0.9s),播放回声:空腔 = 200~260Hz 带 0.6s 尾音;实心 = 短促 0.15s(无尾音) |
| 记忆 | 点过的疤多画一圈年轮线(永久,直到面板结束) |
| 全点过 | 三个都点过 → 12.0s 内兔子自己知道虫在哪,把虫请出来(小甲虫爬出,进手账) |
| 兜底 | 3.0s 无输入 → 兔子自己敲下一个没敲过的疤 |
- 时长验算:3 个疤 ×(敲 0.9s + 听 1.2s + 间隔 1.0s)= 9.3s;加开场 1.0s(兔子先绕着倒木走两步)→ 10.3s;反反复复点最慢 → 面板在 13.0s 封顶。10.3~13.0s ✔
- 画面:一根横卧的倒木躺在世界条下半部(y 650~705,占屏宽 65%,棕灰
#91877D),三个年轮疤沿木头斜着排——越靠右越远、越小、越淡,纵深就是靠这三样拉开的(不靠 y 高低,因为兔子够不到高处)。倒木上有 5 条 2px 的#A8ACB5竖纹暗示木纹,不画写实树皮。兔子站在倒木前,用耳朵贴上去敲(耳朵竖起 15°、点一下身体前倾 4px)——这是全库唯一一个把耳朵当手用的游戏。敲下去时疤上扩散一圈 0.4s 的米白光环、倒木微震 1.5px。虫是 8px 的椭圆 + 6 条 1px 的腿,颜色#2C3038(画面里最深的点,为了让它在灰蓝里一眼被找到)。 - 为什么零失败:什么都不点 → 兔子自己会敲(它听见树里的动静了,这是"耳朵灵敏"),3 秒一下,12 秒把三个都敲完,虫照样出来。玩家点只是让它敲得更快、由玩家决定先敲哪个。没有"敲错"这回事——三个都要敲,顺序不重要。
- RPG 味:世界秘密。空腔树 = 这棵树还活着 = 土壤好,手账里会明牌"这一带可能有 XX"(对应 收集手册 第二节某株稀有植物)。听出来的信息比看出来的信息更有 RPG 味——它是这个世界在对你说话。
- 难度 / 素材量:中(要 3 段音效,音效的辨识度是成败关键)。素材 7 张 + 3 段音效:树干 1 张、疤 3 张(同一张改线宽与透明度)、甲虫 2 帧、震纹 1 张。音效是必须的,不能省——这个游戏的全部判定都在耳朵里。
- 横版特性:纵深(同一个树干上三个不同景深的疤 + 回声来自画面深处)
6.8 踩水洼 🌧(单击)#
一句话:点雨后地上的水洼,把倒影荡开,看水底露出来的是种子、叶子,还是一行字。
| 项 | 值 |
|---|---|
| 操作 | 单击(点水洼)。只有这一种输入 |
| 水洼 | 一排 4 个,宽 70 / 95 / 120 / 140px,深浅不同,中心 y 依次 706 / 712 / 718 / 724(越靠右越远) |
| 涟漪 | 从点击点扩散,0.6s 半径涨到 40px,2 圈(第二圈延后 0.15s、半径 60%),1.0s 后淡出 |
| 一个水洼给什么 | ① 1 颗种子 ② 1 片叶子 ③ 1 件遗物碎片 ④ 一行字("水是从东边来的") |
| 重复点 | 点同一个水洼第二次只再荡一圈涟漪——不多给,也不扣 |
| 时长 | 4 个水洼 × 3.0s = 12.0s |
- 时长验算:4 × 3.0s = 12.0s;玩家点完就走最快 8s,面板最晚 13s 收起 ✔
- 画面:这是全库唯一一次用倒影。水洼里画的是画面上方世界的镜像——云、远山、树线(直接拿现成的天空/远山图垂直翻转 + 压暗到 72%,几乎零新素材)。第 4 个水洼的倒影里有一只不是这个季节该有的鸟(一个 14px 的剪影)——这是线索。水洼本体是
#A8ACB5@ 40% 的椭圆 + 一圈 1px 的#F8F4EA高光边(雨后的水边是有亮边的)。点下去涟漪是#F8F4EA的细圆环,一圈圈往外散,倒影随之碎成 6 块向外推开(用遮罩切,不是重画)。水底的土是#91877D压深一档。 - 为什么零失败:什么都不点 → 兔子跑过去自己踩(兔子就是会踩水),4 个水洼各溅一次,底下的东西被溅出来的水冲上岸边、自动收进手账。少的是什么?少的是"看清了倒影"——信息少了,收获没少。而且第 4 个水洼的那只鸟,不踩也会在涟漪自己荡开时露出来(兔子踩的动静够大)。
- RPG 味:世界秘密。倒影是"这个世界的第二层"——倒影里的鸟、云、那行字,指向下一关的地形与季节("水是从东边来的"直接预告下一关会有一条溪)。这个设计把"看"这个核心动作加厚了一层:以前是看地表,现在地表和倒影都要看。
- 难度 / 素材量:低(一个点击 + 涟漪扩散 + 4 张底图切换)。素材 4 张新图:水洼 4 张(同底不同尺寸;倒影复用现有天空/远山翻转,不算新图)。涟漪、高光边、碎块全部代码画。合计 ≤ 6KB——全库素材最省的一个。
- 横版特性:前后景 / 倒影 · 天气(雨后)
6.9 追萤火虫 🌙 🐦(滑动)#
一句话:划一下屏幕,兔子朝那个方向窜出去,追夜里飘的光点。
| 项 | 值 |
|---|---|
| 操作 | 滑动(划一次 = 引导一次)。只有这一种输入,划完立刻松手 |
| 方向量化 | 划的方向量化到 8 个方向(每 45° 一档),划距 > 60px 才算有效 |
| 兔子窜 | 0.5s 内沿该方向位移 180px,窜完落回地面(若不在地面则由 g=1800 落下) |
| 冷却 | 0.5s(一次窜完才能再划) |
| 捕获 | 兔子落点 90px 内有萤火虫 → 带走一只,它飘在兔子耳朵后面跟着 |
| 萤火虫 | 6 只,分 3 个景深(视差 1.0 / 0.65 / 0.35),光晕直径 26 / 20 / 15px |
| 遮挡 | 草丛在萤火虫前面时,光只透过草叶(#C9A45C @ 40%,色板里唯一允许的暖色) |
| 时长 | 6 只 × 2.0s = 12.0s |
- 时长验算:6 只 ×(划 0.5s 冷却 + 窜 0.5s + 收 0.5s)= 9.0s;加开场 1.5s(兔子抬头看见第一只光点)→ 10.5s;一次都划不中最慢 → 12.0s ✔
- 画面:夜。整屏压一层墨蓝
#2C3038@ 55% 的蒙版,但不压黑——兔子和草仍然要看得清(美术规范 禁止纯黑)。萤火虫是一个 26px 的径向光斑(暖金#C9A45C心 + 到透明),带 0.3 的呼吸频率(每只相位错开,否则 6 只一起闪会很假)。草丛用#7E9B93压深到 40%,画在萤火虫之上(这就是视线遮挡)。兔子窜出去时有一条 8 点的米白残影尾迹(0.3s 淡出)。手账格在下面被垂死的光晕照亮。 - 为什么零失败:完全不划 → 兔子自己会追(它看见光就想去,这是本能),每 2.5 秒自动扑一次,15 秒内照样收完全部 6 只。玩家划只是"由我决定先追哪只"。划错方向没有代价——兔子只是跑到别处,0.5 秒后可以再划,而且跑动本身会惊起附近的萤火虫(跑错也算扰动,不是白跑)。
- RPG 味:角色互动。收到 3 只以上,它们会排成一行指向画面深处(指向一处树根或一块石头)——萤火虫成了这个游戏里唯一一个主动带你走的角色。这也是"朋友"格子里的第二类(第一类是麻雀)。
- 难度 / 素材量:中(滑动输入 + 8 方向量化 + 遮挡排序 + 一个新的"夜"画面状态)。素材 6 张:萤火虫光点 1 张(代码做呼吸)、草丛遮挡层 1 张、残影 1 张、夜色蒙版 1 张、兔子窜姿 2 帧。合计 ≤ 10KB。
- 横版特性:视线遮挡(草丛挡住光)· 纵深(3 个景深)· 时间(夜)
6.10 拨开高草(滑动)#
一句话:左右划开比兔子还高的草,看清草后面是什么。
| 项 | 值 |
|---|---|
| 操作 | 滑动(左划 = 草拨向左边,右划 = 拨向右边)。只有这一种输入 |
| 草高 | 110px(兔子高 90px——草是真的挡住它了,这是设计前提) |
| 草带长度 | 1200px,这一段兔子减速到 150px/s(正常 300px/s),走完要 8.0s |
| 露缝 | 划一次 → 缝宽 160px、持续 2.0s(之后草自己合上,合上不是惩罚,是"要再看就再划") |
| 记忆 | 每划开一次,缝里露出的一样东西被记住(画面右上角多一个小标记,最多 3 个) |
| 草后有什么 | ① 一块石头(高度)② 一处闪光(收集点)③ 本关岔路牌(能看到牌上写的线索) |
| 时长 | 4.0s(走 1200px 的一半)+ 看 → 12~16s |
- 时长验算:1200px / 150px·s⁻¹ = 8.0s(兔子走到头),加开场 2s、结尾 2s → 12~16s ✔
- 画面:三层草,各有视差与明度:近景(视差 1.0,
#8C9E93100%)、中景(0.7,78%)、远景(0.4,55%)。草的画法是一条可平铺的叶片带(每 60px 重复一次,逐片 3~5° 相位差摆动),所以三层只要 1 张图 + 3 个透明度。缝是一条柔化 8px 的竖向渐变遮罩(不是硬边),穿过三层草——只有让三层的位移量不同(近层移得多、远层移得少),看起来才像"拨开一片有厚度的草",三层一起平移就变成一张纸在滑。兔子在缝里穿过去时身体被草遮住下半 40px(裁剪),耳朵露出来。 - 为什么零失败:完全不划 → 风自己把草吹开,每 2.5 秒露一次缝、持续 1.2s,于是 7.5 秒内三样东西全露过。一样都不划也能看清全部三样,只是要等。 草合上不会把兔子夹住、不会让它走错路(兔子体型小,会自己从缝里钻过去)。划的方向错了也没关系——左划右划都能开缝,只是草倒向不同。
- RPG 味:世界秘密。草后面藏的是本关岔路口的预告——提前看到牌子上写了什么线索。这直接把两个互动层串起来了:小游戏给了你在解谜层的信息优势。
- 难度 / 素材量:中(三层草的遮罩与位移 + 记忆标记)。素材 5 张:可平铺草叶 3 层各 1 张(可共用一张改色)、兔子钻草 2 帧。合计 ≤ 8KB。
- 横版特性:视线遮挡 · 前后景视差(三层)· 左右(划的方向)
6.11 抖落积雪 ❄(滑动)#
一句话:划过树上的枝条把积雪抖落,看雪下面压着什么。
| 项 | 值 |
|---|---|
| 操作 | 滑动(划过哪根枝条就抖哪根)。位置重要、方向不重要 |
| 枝条 | 5 根,从画面左上到右下分布(y = 480 / 520 / 560 / 600 / 560),每根上的雪块宽 40~90px |
| 雪落下 | 加速度 a = 300 px/s²(比兔子慢得多——雪是飘的),从 y=595 落到地面 691(96px)用 0.8s |
| 雪遮挡 | 落下的雪把下方的东西盖住 3.0s,然后化掉(这就是"冬天的代价",但代价是遮挡不是损失) |
| 雪下有什么 | ① 冻住的浆果 ② 一个鸟窝 ③ 一段刻痕 ④ 一颗种子 ⑤ 一片干叶 |
| 时长 | 5 根 × 2.0 |
- 时长验算:5 ×(划 0.3s + 雪落 0.8s + 看 1.0s)= 10.5s;玩家反复划最晚 15s ✔
- 画面:冬。整体色温往冷推——把
#8C9E93的草换成#A8ACB5的雪,雪的受光面是#F8F4EA、背光面#A8ACB5,两级明暗就够了(美术规范 4.2)。枝条是#91877D的 3px 线,上面压着一条 8px 厚的雪(用一条圆头的白色粗线 + 底边#A8ACB5的暗面)。雪落下是 30 个 4px 的白点,带 ±0.08s 的随机延迟(一起落会像一堵墙)。兔子抬头(耳朵竖起 15°)——耳朵是它的手,用耳朵撞枝条这个动作很兔子。 - 为什么零失败:完全不划 → 兔子在树下蹦跶会震落雪(它在雪地里就是会乱蹦),每 3.0s 掉一根,15s 内 5 根全掉光。收获完全一样,区别只是玩家有没有"亲手抖"。雪盖住下方的东西 3 秒也不会让东西消失,只是晚 3 秒看见。
- RPG 味:探索感。鸟窝里有上一只鸟留下的东西——这是 收集手册 第三节第 3 件遗物「一小块布条」的伏线,也是"季节更替:有鸟来过、又走了"的叙事。
- 难度 / 素材量:低(划线判定 + 雪粒子 + 一个 300 的重力)。素材 10 张:雪枝 5 张(同一张改雪量)、雪下之物 5 张;雪粒是代码画的圆点。合计 ≤ 16KB。
- 横版特性:高低差(枝条在上方)· 重力(雪落)· 季节(冬)
6.12 转向日葵 ☀(拖动)#
一句话:拖着向日葵的花盘转,让它对准画面上那个明牌的小太阳。
| 项 | 值 |
|---|---|
| 操作 | 拖动(按住花盘,手指的角位移 1:1 映射到花盘)。只有这一种输入 |
| 花盘 | 直径 120px,y = 520(比兔子高 171px),上面画 12 个刻度(像钟面) |
| 太阳 | 画在画面右上或左上(由本关的表定时间决定),明牌:一个 34px 的暖金 #C9A45C 圆 + 8 条放射线 |
| 对准判定 | 花盘朝向与太阳方向的夹角 ≤ 15° 即算对准 |
| 吸附 | 松手后 0.3s 内以 180°/s 吸附到最近的 30° 刻度(拖过头不会让花盘歪,它自己回到最近的格) |
| 对准的回报 | 花盘微微发亮 + 一只蜜蜂飞来停 1.5s(+1 颗种子/次) |
| 三株 | 3 株向日葵,初始朝向随机偏 40°~120° |
| 时长 | 3 株 × 3.3 |
- 时长验算:3 株 ×(转 2.0s + 吸附 0.3s + 蜜蜂 1.0s)= 9.9s;加开场 2.0s(三株的花盘先自己摆一下、把"太阳在哪"亮出来)→ 11.9s;转得慢一点 → 15.0s ✔
- 画面:向日葵的花盘是
#91877D的圆 + 12 条 1px 的#A8ACB5辐射线,外圈花瓣是米白#F8F4EA的 16 片(只画一遍,跟着花盘转)。光的方向要画出来:从太阳方向射下 3 条 40px 宽的斜向淡光带(#F8F4EA@ 12%),花盘的受光面朝向太阳的那一侧亮一档。蜜蜂是 6px 的黑点 + 两片 30% 透明的翅膀(#F8F4EA),飞进来时走一条 0.6s 的弧线。拖动时花盘有 2px 的跟手延迟(lerp0.35),这一点延迟就是"重"的手感来源——没有它,花盘会像贴纸一样轻飘飘。 - 为什么零失败:完全不拖 → 向日葵自己会转(植物自己找光),3.5s 转正一株,10.5s 三株全转正。玩家拖只是"帮它转得快一点",而且拖到任何角度都不会有惩罚——不对准就没有蜜蜂,对准就有。"错"这个状态在这里根本不存在,只有"还没对准"。
- RPG 味:世界秘密 + 时间。三株转正后,它们连成一条线,指向画面深处的一个东西(这也是手账里唯一一种"靠几何位置"的线索)。同时它是"一天里什么时候"的显示器——花盘朝向 = 现在是上午还是下午,这个信息在别的关卡里会被岔路口用到。
- 难度 / 素材量:低~中(需要新写一套"角度拖动"输入,但只有这一个游戏用)。素材 4 张:花盘 1 张(旋转复用)、茎叶 1 张、蜜蜂 2 帧。合计 ≤ 6KB。素材第二省。
- 横版特性:光线方向(太阳在画面两侧)· 时间(上午/下午)
6.13 拔根茎(拖动)#
一句话:按住植物往上拖,把埋在土里的根茎一段一段拔出来。
| 项 | 值 |
|---|---|
| 操作 | 拖动(按住往上拖,拖动距离 1:1 映射到拔出的长度)。只有这一种输入 |
| 位置 | 地形剖面层(y 749 往下) |
| 三株 | 地上的叶子分别宽叶 / 细叶 / 双叶;地下的根茎埋深 40 / 70 / 95px(地上看不出来,这就是"要拔才知道") |
| 分段露出 | 拖到 40px 露头(第一段)、70px 露第二段、95px 全部拔出 |
| 手指行程 | 95px(成年人拖动速度 ≥ 40px/s → 一株 1.5~2.5s) |
| 根茎不会断 | 拖一半松手 → 它挂在那个长度,下次接着拔(数值存在配表里,不重置) |
| 时长 | 3 株 × 4.0s = 12.0s |
- 时长验算:3 ×(拖 2.0s + 拔出演出 1.2s + 跑向下一株 0.8s)= 12.0s ✔
- 画面:剖面上兔子只露头,两只前爪抓着叶子的根部往后蹬(后腿蹬 4px 一下,节奏 0.25s 一次)——拔东西要有"对抗感",靠的是兔子的身体在抖、土在裂,不是靠音效。土上会出现一条从根部向上裂的缝(1px 的
#2C3038,随拔出长度从 0 长到 40px),缝的两边长出细小的土粒。根茎是米白#F8F4EA+#A8ACB5轮廓,须根是 6 条 1px 的曲线,随拔出越来越多地露出来("看"的回报就在这里:拔出来的过程就是根的形状逐渐暴露的过程)。 - 为什么零失败:完全不拖 → 兔子自己会拔(这是野兔的本能,它找的就是根茎),4 秒一株,12 秒三株全拔出来,一条都不会少。根茎永不断裂——这是这个游戏最重要的一条:任何"拔断了"的表现都会立刻制造失败感。
- RPG 味:成长感。根茎是能带回花园的母本——最长的根茎(95px)对应最稀有的花。这给了"拔哪一株"一个隐含的偏好,但三株都能拔完,所以不是取舍、只是惊喜的顺序。
- 难度 / 素材量:低(拖动距离映射 + 三段阈值)。素材 6 张:根茎 3 张(不同长度)、地上叶 3 张。裂缝与土粒是代码画的。合计 ≤ 10KB。
- 横版特性:地形剖面(地下) · 纵深(根在土里 = 画面深处)
6.14 分种子 🍂 🐦(单击)#
一句话:三只景深不同的鸟停在田埂上,点一只把种子撒给它,它就跟你走。
| 项 | 值 |
|---|---|
| 操作 | 单击(点三只鸟中的一只)。只有这一种输入 |
| 三只鸟 | 近(y=700,体型 100%,#91877D 实色)· 中(y=670,80%,85% 不透明)· 远(y=650,65%,70% 不透明)——景深靠大小 + 明度 + y 位置三个一起拉开 |
| 判定 | 点击热区 = 鸟的外接圆 × 1.4(半径 22 / 18 / 15px) |
| 选中效果 | 兔子把种子撒给它(0.6s),那只鸟跟着兔子走,一直跟到本关结束,并在下一关的开头出现、跟着跑 5 秒、替玩家多收一格 |
| 三选一 | 选了 A 之后 B 和 C 会跳开两步、但不消失(它们在下一关还会出现,只是不跟你) |
| 时长 | 立刻可选;开局有 4.0s 铺垫(三只鸟依次落下、抖毛、看兔子);不选 → 第 10.0s 出现"要走了"的提示,第 14.0s 三只自己飞走 |
- 时长验算:开场铺垫 4.0s → 玩家最快 1.0s 选完,加 3.0s 演出 + 2.0s 手账收尾 = 10.0s;一直不选 → 4.0 + 10.0 提示 + 4.0 飞走,加收尾 = 18.0s ✔
- 画面:秋。田埂是
#91877D的一条横带,草已经黄了(#B8AC97的枯草,色板里"苇黄"那一档)。三只鸟是同一个造型的三个尺寸(省素材的关键),靠大小与明度拉景深。鸟的样子要朴素:一颗 18px 的椭球 + 一个 6px 的喙 + 一根 10px 的尾羽,米白 + 蓝灰轮廓。兔子手里(胸前)捧着一小撮种子(3 个 4px 的暖金点)。被选中的鸟飞起来时走一条 0.5s 的弧线落到兔子耳朵上,之后每 1.2s 随兔子的跑动节奏上下颠 3px。 - 为什么零失败:一只都不选 → 14 秒后三只鸟自己飞走(它们要南飞了,一只都不损失),并且兔子会把种子撒在地上,于是下一关那片地长出一丛花。也就是说"不选"也是一种选择,而且回报是**"世界因为你变了"**——这是全库唯一一个"不作为也改变世界"的。
- RPG 味:选择感——全库唯一一个。其他 13 个的差别都在"看得清不清楚",只有这一个的差别在**"我让谁跟着我"**,而且影响会延续到下一关。这是最接近传统 RPG「同伴」的一个设计,又完全不违反零失败(三只都活着,不选也有回报)。
- 难度 / 素材量:低(一个点击判定 + 一个"跟班"状态标记)。素材 10 张:鸟 3 种尺寸 × 3 帧(停 / 跳 / 飞,可共用一张缩放)、种子 1 张。合计 ≤ 16KB。
- 横版特性:纵深(三只鸟三个景深)· 前后景 · 季节(秋 / 候鸟)
6.15 实现完之后改动的三处数值(以及为什么)#
设计稿的数字是按"一次玩多久"算的,没有把"4 道涧/5 根枝条连起来的总时长"算进去。 实装之后按准入标准第 2 条(单次 10~20 秒)回测,三处超限,都调了:
| 游戏 | 设计稿 | 实测零输入总时长 | 改成 | 改后的实测 |
|---|---|---|---|---|
| 荡藤过涧 | 自动松手 4.0s | 23.4s | 2.6s | 17.4s |
| 抖落积雪 | 自动震落 3.0s | 26.3s | 2.4s | 14.1s |
| 刨苔土 | 每处松土 0.6s | 26.8s | 相位机重写 | 7.7s |
它一次跳跃就完成一格,3 格很快。单格耗时的游戏,总时长 = 单格 × 格数 —— 设计稿逐节算的都是单格,格数一乘就超了。这是这批设计里最容易漏的一处。
[!warning] 有两个游戏在零输入路径下短于 10 秒:刨苔土 7.8s、拨开高草 8.3s 这不是 bug,是"兜底路径本来就快":
- 刨苔土:兜底每处只刨 0.6 秒(刚好刨穿腐叶层),4 处 + 出场 = 7.8s。 玩家自己按住会按到 2.6 秒去拿根茎和碎片,那就是 10.6~18.6s。
- 拨开高草:兜底每 2.5 秒自动露一次缝,3 样东西 7.5 秒全露过。 玩家自己划会划得更慢(划一次才 2 秒缝),12~16s。
准入标准第 2 条写的是「单次 10~20 秒」——它约束的是玩家实际玩一局的长度。 零输入兜底是"玩家没参与"的路径,它应该不要拖时间(人都没在玩,拖 15 秒没意义)。 所以验收脚本对兜底路径放宽到「≤21 秒必须收尾」,不设下限 —— 下限是有玩家输入时才成立的事,硬设下限会逼着把兜底写慢,那是本末倒置。
[!tip] 还加了 20 秒硬保险丝
放在场景里(stepMini),不放在 14 个游戏里。
与其指望 14 处兜底计时都写对,不如有一处兜底。
实测:14 个里有 7 个一开始写错了兜底,其中"跳铃铛"根本没收尾逻辑 ——
玩家不点就永远停在小游戏里,「零失败」是假的。
七、被否掉的方案#
标准真的会砍东西。这一节列 5 个被否的方案,每一个都指名违反了哪一条——留着它们比留着通过的方案更有用,因为下一批设计一定还会提出同样的东西。
7.1 摆石子过溪(拖动)——违反标准 1 + 标准 3#
| 项 | 内容 |
|---|---|
| 原方案 | 溪里散着几块石子,拖石子到溪里摆出一条能踩的路,兔子踩着过去 |
| 否掉理由 ① | 它其实是两种操作:先点选一块石子(pointerdown 落在石子上 + 一个选中态),再拖动它(pointermove 持续跟进)。"选中 + 拖动"就是两个动作——这才是"混合了两种操作类型"的准确含义。判据也很清楚:玩家要有"我拿了 A,再放到 B"的两步心智,而标准 1 要求的是"一种输入事件" |
| 否掉理由 ② | 它有一个隐含的失败状态:"摆出能踩的路"这句话的反面是"摆不出就过不去"。哪怕写"摆错了可以重摆",玩家心里也有了"我做错了"这个状态——而铁律要的是压根没有错 |
| 正确替代 | 荡藤过涧(6.3):同样是"过去",但操作收敛成按住蓄力一种,且松手太早会被草根接住、顺手还能摘一朵花 |
那一份写的是"它是唯一需要拖拽的,违反了操作只有一种"。这句话不成立(拖动本身就是一种操作)。 驳回它要用上面那两条理由。判据说不圆,标准就守不住。
7.2 数花瓣(单击)——违反标准 2 + 与解谜层重复#
| 项 | 内容 |
|---|---|
| 原方案 | 一朵转动的花,数清有几瓣,点对应的数字 |
| 否掉理由 ① | 时长不可控:花瓣数多(8 |
| 否掉理由 ② | 它有明确的对错状态。"数错了"哪怕不扣任何东西,玩家也知道自己错了——这违反标准 3 的精神(不是违反了"惩罚",是违反了"没有错这个状态") |
| 否掉理由 ③ | 它和轻解谜层重复。"动脑子得出一个答案"归岔路口(关卡与解谜),小游戏这一层管的是手感。两层各管一件事,混起来就变成"到处都是题" |
| 正确替代 | 接露珠(6.5):同样是"看花",但落点是手感(点得准不准),而且点空没有任何后果 |
7.3 打水漂(单击,考时机)——违反"不考反应"(比三条准入标准更底层)#
| 项 | 内容 |
|---|---|
| 原方案 | 兔子扔石片,石片在水面上弹跳,在它触水的那一帧点一下,它就再弹一次 |
| 否掉理由 ① | 它考反应。玩法 2.2 写死了"一局里没有一次是考反应"。零失败救不了它:没有失败但有"我手慢了",玩家会觉得自己笨——这比"失败了可以重试"更伤 |
| 否掉理由 ② | 它的容差调不出中档:窗口宽(>250ms)就没有手感,窗口窄(<120ms)就是考反应。中间那一段不存在 |
| 否掉理由 ③ | 它会把"随时能停"变成"不能停"——手在屏幕上的那 2 秒是不能被打断的。而这个小游戏的全部卖点之一是可以拿起水杯喝完再回来 |
| 正确替代 | 跳铃铛(6.1):同样是"力度/时机",但收敛成一次蓄力——玩家可以想 10 秒再松手,思考时间不受限,只有"松手那一下"是精准的 |
7.4 织草绳(按住节奏)——违反标准 2 + 标准 3#
| 项 | 内容 |
|---|---|
| 原方案 | 按节拍长按 / 松开,把草编成一根绳(小游戏 候选第 10 条) |
| 否掉理由 ① | "按住节奏"实际上是两种操作的叠加:按住(时长)+ 在正确的拍子上松开(时机)。它同时需要"蓄了多少"和"什么时候松"——这正是标准 1 禁止的混合 |
| 否掉理由 ② | 编织感需要长度:要编出"一根绳"的视觉,至少 8~10 个来回,必然超过 20 秒 |
| 否掉理由 ③ | 错拍 = 失败状态。哪怕写"错拍只是绕一圈回去",玩家会立刻意识到自己在"重来" |
| 正确替代 | 刨苔土(6.4):同样是"持续按住",但只有一个维度(按多久 = 挖多深),而且按多久都有收获 |
7.5 联机赛跑(与好友的兔子比谁跑得远)——违反标准 3 + 违反"随时能停"#
| 项 | 内容 |
|---|---|
| 原方案 | 下一关开始时和好友花园里的兔子比一段,谁先到谁赢 |
| 否掉理由 ① | 比较必然制造失败。"赢了"和"输了"是一对,只要有胜负就有失败状态。而 玩法 第七节已经砍掉排行榜,理由是同一个:会把"看"变成"冲" |
| 否掉理由 ② | 它要求等对方(实时联机)或者要求对方"昨天来过"(异步),两种都违反"随时能停、不需要回来管" |
| 否掉理由 ③ | 零操作游戏里的"比赛"是自相矛盾的:兔子自己跑,玩家没有任何手段影响结果,输赢由数值决定——那不是比赛,那是抽签 |
| 正确替代 | 分种子(6.14):同样是"其他玩家/其他活物的存在感",但去掉胜负,只留**"我选了你跟着我"**这种正向的关联 |
7.6 反例的共同形状(给下一批设计用)#
五个被否的方案,违反的其实是同一条藏在三条标准背后的东西:
小游戏不许要求玩家"在同一段流程里既做决定、又保持精准"。 决定(选谁、选哪、数多少)归轻解谜;精准(按多久、划多远)归小游戏。 两者混在同一个 15 秒里,就一定会长出"对错"来。
| 被否方案 | 混了什么 |
|---|---|
| 摆石子 | 决定(放哪)+ 精准(拖多远) |
| 数花瓣 | 决定(几个)+ 精准(点哪个数字) |
| 打水漂 | 精准(时机)+ 决定(往哪打) |
| 织草绳 | 决定(拍子)+ 精准(按住时长) |
| 联机赛跑 | 决定(策略)+ 精准(没有精准,但引入了"别人") |
八、优先级排序#
8.1 打分口径#
四项各 13 分或 15 分,满分 14。分数不是感觉,逐项可查:
| 维度 | 3 分 | 2 分 | 1 分 |
|---|---|---|---|
| 实现难度(低→高分) | 低 | 中 | 高 |
| 素材量(少→高分) | ≤6 张 | 7~9 张 | ≥10 张 |
| 复用已有代码 | 三个以上系统直接复用 | 一两个 | 基本要新写 |
RPG 味单独给 1~5:5 = 会改变手账结构或影响下一关,4 = 给出一条指向世界的线索,3 = 只是过程好看。
8.2 全部 14 个的打分#
- 「难度」列:14 个全部实现完了(见第六节的实现架构)。素材量实测是 0 张位图 —— 全部改成代码绘制,所以“素材”列是当时按位图估的。
- 「RPG 味」列曾被我一次正则误伤覆盖,下面是按每个游戏实际交回的奖励重新判的,
依据写在后面的括号里,可对着
notes_mini.js里的effect(...)调用逐条核对。 原始提案数字没有留存(这个文件当时还没提交进 git),请当实装后回填看。
| # | 名称 | 难度 | RPG 味 | 素材 | 复用 | 合计 |
|---|---|---|---|---|---|---|
| 6 | 接小麻雀 | 3 | 5 | 2 | 3 | 13 |
| 8 | 踩水洼 | 3 | 4 | 3 | 3 | 13 |
| 4 | 刨苔土 | 3 | 5 | 2 | 2 | 12 |
| 14 | 分种子 | 3 | 5 | 2 | 2 | 12 |
| 13 | 拔根茎 | 3 | 4 | 3 | 2 | 12 |
| 2 | 吹蒲公英 | 3 | 4 | 2 | 3 | 12 |
| 5 | 接露珠 | 3 | 3 | 3 | 3 | 12 |
| 9 | 追萤火虫 | 2 | 5 | 3 | 1 | 11 |
| 10 | 拨开高草 | 2 | 4 | 3 | 2 | 11 |
| 3 | 荡藤过涧 | 2 | 4 | 2 | 2 | 10 |
| 12 | 转向日葵 | 2 | 4 | 3 | 1 | 10 |
| 7 | 敲树干 | 2 | 3 | 2 | 2 | 9 |
| 11 | 抖落积雪 | 3 | 3 | 2 | 1 | 9 |
14 个里 12 个拿到 12~13 分(满分 14),说明这批设计整体够用。 最低的抖落积雪 9 分,问题是它只有“好看”没有“给世界”—— 雪下压着的东西只是文字,不改变手账、不给线索。留在这里当反面参照。
RPG 味的判分依据(对着代码看):
| 游戏 | 回填分 | 实际交回的东西(effect(...)) |
|---|---|---|
| 接小麻雀 | 5 | 手账多一格「朋友 · 麻雀」 |
| 刨苔土 | 5 | 根茎接花园升级 |
| 分种子 | 5 | sowNext —— 下一关那片地长出一丛花 |
| 追萤火虫 | 5 | 三只排成一行,指向树根 |
| 踩水洼 | 4 | 第 4 个水洼倒影里的鸟 + 一行线索「水是从东边来的」 |
| 拔根茎 | 4 | 最长的那根对应最稀有的花 |
| 吹蒲公英 | 4 | 四个落点各有刻字 |
| 拨开高草 | 4 | clue —— 本关岔路口牌子上写的那句话 |
| 荡藤过涧 | 4 | 够不着时抓住涧壁草根,那里挂着一朵花 |
| 转向日葵 | 4 | 三株连线指向画面深处 |
| 接露珠 | 3 | 水渍连成线指向收集点(过程好看) |
| 敲树干 | 3 | 空响的那一格有尾音(过程好看) |
| 抖落积雪 | 3 | 雪下的东西只有文字(过程好看) |
| 12 分这一档并列 5 个(刨苔土 / 分种子 / 拔根茎 / 吹蒲公英 / 接露珠),要按"咬合度"再切一刀: |
| 12 分并列者 | 咬合度 | 取舍 |
|---|---|---|
| 刨苔土 | 高:激活闲置的地形剖面层(玩法 1.1 里那一层现在只是背景)+ 根茎接花园升级 | ✅ 直接做 |
| 分种子 | 高:sowNext 真的会改变下一关的地貌,是全库唯一"选了影响下一关"的 |
✅ 直接做 |
| 吹蒲公英 | 中:四个落点各有刻字,靠叙事咬合而不是靠系统 | 做 |
| 拔根茎 | 低:和刨苔土用同一层、同一收获物(根茎) | ⚠ 与 4 重叠,本可以合并 |
| 接露珠 | 中:和"接"这个动作、和手账收集都重复度高 | 做,但它是这批里最可替换的一个 |
提案期建议"拔根茎与刨苔土二选一,先不做"。实装时两个都做了,理由很实际: 它们虽然共用"土壤剖面"这一层,但操作类型不同(刨苔土是按住蓄力、拔根茎是拖动), 手感完全不重复,而且剖面层本来就需要不止一个玩法来把它激活。 真正更该砍的是接露珠 —— 它和"接小麻雀"同为单击 + 接取,逻辑重合度最高。
8.3 提案期定的「先做这三个」(已全部实装)#
| 顺序 | 小游戏 | 为什么是它(提案期的判断,三个现已全部实装) |
|---|---|---|
| 1 | 接小麻雀(单击,6.6) | ① 实现最省:单击输入和岔路口的点击是同一套代码,不用新写任何输入系统 ② RPG 味全库最强:它给手账开出第四类格子「朋友」,"别的活物因为你而改变行为"是这套游戏里第一次 ③ 素材 7 张、复用跑动动画与手账 ④ 兜底逻辑最自然(麻雀本来就在学飞) |
| 2 | 踩水洼(单击,6.8) | ① 素材全库最省:只有 4 张新图,倒影直接拿天空/远山图垂直翻转压暗 ② 它加厚了"看"这个核心动作——地表和倒影要一起看,和主循环咬得最紧 ③ 需求中"和天气有关"的第一个落点(雨后),而且雨后的地面在美术上只是换个地面色 + 加几个椭圆,成本极低 ④ RPG 味实:倒影里的鸟预示下一关 |
| 3 | 刨苔土(按住蓄力,6.4) | ① 复用跳铃铛的按住蓄力这一套(玩家已经学过,零教学成本) ② 它激活了地形剖面层——玩法 1.1 里那一层(y 749~826)现在只画了土,这个游戏是它的第一份工作,等于白捡一层场景 ③ RPG 味强:根茎是直接接上 收集手册 第四节花园升级的第二货币,是小游戏第一次真的产出长期资源 ④ 素材 8 张、逻辑只有一个计时器 + 三个深度阈值 |
为什么不选素材更少的「转向日葵」(4 张):它是本库唯一用拖动的(除拔根茎), 而"角度拖动 + 30° 吸附"是一套全新的输入代码,只为一个小游戏写一遍不划算—— 放进第二批,和拔根茎一起做,一次性把"拖动"这类输入基建修好。
实装时把「拖动」基建一次性做好(onMove + 角度 1:1 映射 + 松手吸附),
之后转向日葵和拔根茎一共只花了不到半小时 —— 因为两者共用同一条输入通道。
真正贵的不是"写拖动代码",而是当时还没有 onMove 这条通道
(原来演示页只有 onDown / onUp 两个 handler)。
教训:"要新写一套输入"的估价,取决于那是一套还是一行。
现在 4 种操作各有一条现成通道,第 15 个游戏可以直接挑一条用。
为什么不做「吹蒲公英」(它几乎零实现成本):它和跳铃铛共用同一套蓄力 + 抛物线, 做完只多一个风力项,成本极低;但它的 RPG 味只有 3 分(落点只是"距离远近",不改变任何结构), 属于"同质化的好做"——排第 4,作为补量用,不要占用前三的工期。
8.4 分批建议#
| 批次 | 做哪些 | 一次要修的基建 |
|---|---|---|
| 第一批 | 6 接小麻雀 · 8 踩水洼 · 4 刨苔土 | 无新输入系统;只需给"本能兜底"建一个统一的调度器(第三节那张表就是配置) |
| 第二批 | 2 吹蒲公英 · 13 拔根茎 · 12 转向日葵 | 一次性把拖动类输入基建做好(拔根茎和转向日葵共用) |
| 第三批 | 3 荡藤过涧 · 7 敲树干 · 14 分种子 | 音效(敲树干要 3 段)· 跨关卡状态(分种子的跟班要活到下一关) |
| 第四批 | 10 拨开高草 · 9 追萤火虫 · 11 抖落积雪 · 5 接露珠 | 三层草遮罩 · 夜间画面状态(追萤火虫要一套夜色蒙版,贵)· 冬季素材(贵,建议整季一起做) |
九、开工前要定的三件事#
| 事项 | 为什么 | 怎么做 |
|---|---|---|
| 本能兜底调度器 | 14 个游戏各自写一套"多久没输入就自动"必然长歪(计时器散落各处、2× 速度档会漏换算) | 一个统一的 idleFallback(seconds, action),配置表在 demo/data/minigames.json;玩家任何输入都清零它(第三节 danger 那条) |
| 小游戏配表 | 数值不许散在代码里(工程约定:数值走配表,公式在代码里) | demo/data/minigames.json:每个游戏一行,含 input(四类之一)、duration、fallbackSec、targets[](落点/阈值/容差) |
| 验收(照 小游戏 第六节的规矩) | 光"看着对"不算数,跳铃铛的教训是要靠数字守(1,1,1 那次) |
扩 tools/art/notes_check.mjs,每个游戏加 3 条硬验收:① 0 输入也能走到 mode=run(兜底真的会跑)② 输入事件类型只有一种(打点统计 pointer 分支)③ 时长落在 10~20s(无输入路径 + 全对路径各测一次) |
"零失败"和"本能兜底"如果只写在文档里,代码里迟早会退化——
一个 if (!playerInput) return; 就能让兔子永远停在那里,而人肉测试很难覆盖到"玩家全程不碰屏幕"这条路径。
所以它必须是一条自动跑的验收:脚本打开小游戏面板,一次输入都不发,等 25 秒,
断言状态回到 mode=run 且手账格数增加。这条不过,就不算做完。