🌻 设计文档小农场 · 野花笔记
← 全部文档/野花笔记/玩法

小游戏库

提案 #玩法#小游戏#横版#RPG docs/野花笔记/小游戏库.md
这一份和 [小游戏](小游戏.md) 的分工

小游戏 是已经落地的那一个(跳铃铛的完整设计 + 十条候选清单)——那一份是"当时够用"。 这一份是库:把候选扩到 14 个,每一个都写到"能照着写代码"的粒度,并且补上两件之前没写的东西:

新增 为什么必须补
本能兜底(第三节) 「零失败」以前只写在口号里。这一份给每个小游戏指定兔子自己的本能行为,玩家不碰屏幕时由它把流程走完
四类操作的判定口径(第二节) 之前只写了"点击/按住/滑动三选一",但 小游戏 里用这条否掉了拖动类的摆石子——理由说不圆。这一份把判定标准写清楚

相关的另外三份:玩法(自动跑跳的数值)· 关卡与解谜(岔路口)· 收集手册(手账与花园)

[!tip] 画面描述用的是哪套色 本文的配色一律写项目简介的四色:米白 #F8F4EA · 蓝灰主色 #A8ACB5 · 墨蓝 #2C3038 · 棕灰 #91877D。 落到线宽、暗面位置、纸纹强度、投影比例这些细节时,以 美术规范 为准—— 那一份是从参考图像素里量出来的,色号分得更细(#7C8B99 石青、#7E9B93 苔绿……), 两者是同一套灰蓝水彩的两个粒度,不冲突(#F8F4EA 和规范里的米白 #F8F5EC 只差 2 个色阶)。


一、小游戏在节奏里的定位#

零操作是这个游戏的立身之本(玩法 第四节),所以小游戏不能是"必须过的关卡",否则零操作就成了空话。

项 定案 理由
频率 每关 0~1 个,间隔 900013000px(约 3043 秒) 多了就变成"关卡之间的关卡",主循环被切碎
触发 跑到小游戏点,兔子自动停下,面板从底部推上来 停下来的动作本身在说"这里可以玩一下",而不是"你必须操作"
时长 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 上 (不能出现"检测到您长时间未操作"这类文案,那是在催玩家)。


四、公共数值基线(所有小游戏共用)#

照 玩法 1.1 与 玩法 第四节,不要另起一套:

项 数值 说明
渲染分辨率 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× 速度档是这里唯一的坑

玩家把速度切到 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 张会把包体顶上去; ③ 代码画的东西能直接吃色板变量,改一次色板全部跟着变,不存在"忘了同步某张图"。

实测:14 个全部零输入都能自己收尾,且都给奖励

这是「零失败」这条准入标准最强的自动验法——一次输入都不给, 看它能不能自己走完、有没有东西交回来。实测结果:

游戏 零输入耗时 交回的奖励
跳铃铛 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 个——四种操作都有,但每个小游戏内部只用一种。


六、逐个设计#

实现架构:一个注册表,14 个自包含对象

代码在 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.150.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.261.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.461.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 = 深度)
土层 腐叶层 030px(#7E9B93)· 苔土层 3085px(#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.62.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 平涂 + 蓝灰 #A8ACB5 1px 轮廓,只有一朵花是暖色的(花心 #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,#8C9E93 100%)、中景(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.02.8s = **1014s**
  • 时长验算: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.34.7s = **1014s**
  • 时长验算: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 的跟手延迟(lerp 0.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):同样是"过去",但操作收敛成按住蓄力一种,且松手太早会被草根接住、顺手还能摘一朵花
顺带修正 [小游戏](小游戏.md) 里的表述

那一份写的是"它是唯一需要拖拽的,违反了操作只有一种"。这句话不成立(拖动本身就是一种操作)。 驳回它要用上面那两条理由。判据说不圆,标准就守不住。

7.2 数花瓣(单击)——违反标准 2 + 与解谜层重复#

项 内容
原方案 一朵转动的花,数清有几瓣,点对应的数字
否掉理由 ① 时长不可控:花瓣数多(813 片)时,玩家会反复数,没有自然终点。小游戏必须有确定的下界和上界(1020s),这个可以是 6s 也可以是 90s
否掉理由 ② 它有明确的对错状态。"数错了"哪怕不扣任何东西,玩家也知道自己错了——这违反标准 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 且手账格数增加。这条不过,就不算做完。