玩法
兔子一直往右走。它自己会跳、自己会绕、自己会摘花。你只做一件事:看线索,选它往哪拐。
前一版把"点一下跳"当玩家的唯一操作,这一版把它也拿掉了。省下来的整只手,换成"看"。 配套文档:关卡与解谜 · 小游戏 · 收集手册 · 美术规范
一、竖屏怎么装一条横版卷轴#
横版卷轴天然是横向的,竖屏(9:16)会把世界压成一条窄带。这不是缺陷,是这套设计的支点:
竖屏上 2/3 用来"看",下 1/3 用来"收"。 兔子在中间自动走,它碰过的东西直接掉进下面那本手账里,一格一格填上。
| 竖屏纵向区间 | 占屏高 | 放什么 | 为什么放这 |
|---|---|---|---|
| 天空 + 远景 | 0 ~ 46% | 天空带、云、远山、树线、灌木(视差四层) | 大留白给画面呼吸;也是风景带与天色的显示器 |
| 世界条(可走区) | 46 ~ 78% | 地形、兔子、野花、遗物、岔路牌 | 兔子地面线钉在 72%,视觉中心 |
| 地形剖面 | 78 ~ 86% | 土壤、根系、石块、溪流 | 只有这里出现"地下",让世界有厚度 |
| 手账(收集区) | 86 ~ 100% | 收集格(横滑)、线索卡、进度 | 拇指自然落点,看的时候顺便扫一眼 |
1.1 具体像素(原生 1080×1920,渲染按 0.5 缩到 540×960)#
| 区 | 原生 y | 渲染 y | 内容 |
|---|---|---|---|
| HUD | 0 ~ 110 | 0 ~ 55 | 风景带名、里程、速度档 |
| 天空 + 远景 | 0 ~ 884 | 0 ~ 442 | 云(视差 0.06)、远山(0.12)、树线(0.28)、灌木 |
| 世界条 | 884 ~ 1498 | 442 ~ 749 | 花、障碍、缺口、岔路牌 |
| 兔子地面线 | 1382 | 691 | 钉死不动,是画面的水平基准 |
| 地形剖面 | 1498 ~ 1651 | 749 ~ 826 | 土壤、根系、卵石 |
| 手账条 | 1651 ~ 1920 | 826 ~ 960 | 收集格 + 线索卡 |
为什么这解决了竖屏玩横版的老问题:玩家不需要"跟得上兔子的移动"——它自己在走。 视线在上下两个区域之间来回:看上面的风景找线索 → 看下面的手账确认收获。 这个来回正好是竖屏给得了、横屏给不了的节奏。
二、核心循环#
2.1 三层#
20 秒 兔子自动走 → 自动跳过石头 → 自动摘花 → 手账 +1 格 (零操作)
60 秒 跑到岔路口 → 停下 → 翻开线索卡 → 你选一个出口 (唯一的操作)
一局 跑完 3~4 关 → 结算种子 → 回花园升级 (单局 4~6 分钟)
一整季 30 种植物 + 10 件遗物收齐 → 换季 → 地形与谜题重排 (长期)
2.2 一局里玩家的手做了什么#
| 时刻 | 玩家的手 | 玩家的眼睛 |
|---|---|---|
| 0 秒 | 什么都不做 | 看兔子跑(这是主要卖点,要好看) |
| 6 秒 | 什么都不做 | 看它自己跳过一块石头——第一次看会觉得它很机灵 |
| 12 秒 | 什么都不做 | 花自动飞进手账,格子亮起来 |
| 30 秒 | 停下时点一个出口 | 读线索卡上的观察,比对三个出口 |
| 40 秒 | 点第二个出口 | 确认走对了,手账多两格 |
| 50 秒 | 按住屏幕蓄力、松手(小游戏,每关 0~1 次) | 看兔子跳起来敲铃铛 |
| 60 秒 | 什么都不做 | 看终点结算 |
一局里玩家大约动 6~12 次手:其中 6~10 次是"选方向"(解谜), 0~1 次是"按住蓄力"(小游戏)。没有一次是考反应。
三、自动前进#
| 项 | 数值 | 说明 |
|---|---|---|
| 基准跑速 | 300px/s(渲染分辨率) | 和前一版一致,跳跃换算不用重算 |
| 速度档 | 1× / 1.5× / 2× | 玩家唯一可调的东西。放在 HUD 上,随时可切 |
| 加速时的处理 | 动画按比例提速 | 不做"快进跳帧",否则动画会碎 |
| 减速 | 遇到岔路口自动降到 0 | 停下看牌,不是边走边选 |
玩家不想操作,不代表不想控制节奏。速度档让"今天想慢慢看风景"和 "今天想快点收完"两种心情都能满足——而且它随时可切、切了不丢东西, 符合铁律「只加永久生效、不需要回来管的决策」。
四、自动跳跃(这一版的核心新东西)#
兔子自己判断要不要跳、跳多高。玩家完全不碰。
4.1 三档判定#
| 档 | 什么时候用 | 起跳速度 v₀ | 跳跃高度 | 滞空 | 水平距离 |
|---|---|---|---|---|---|
| 小跳 | 障碍高 ≤ 30px | 380 px/s | 40px | 0.422s | 127px |
| 大跳 | 障碍高 30~72px;或缺口宽 ≥ 90px | 520 px/s | 75px | 0.578s | 173px |
| 不跳 | 障碍高 ≤ 12px(矮草堆、小石子) | — | — | — | 直接跨过去 |
重力统一 g = 1800 px/s²。
4.2 起跳点是怎么定的(这一节决定它会不会跳空)#
起跳必须提前,而且提前的距离要和跳跃距离对得上,否则落点就是错的:
起跳距离 d 满足:跳跃水平距离 ≥ 障碍宽度 + 余量 + d
| 档 | 跳跃水平距离 | 障碍最大宽度 | 余量 | 起跳距离 d | 折成时间 |
|---|---|---|---|---|---|
| 小跳 | 127px | 44px | 10px | 68px | 提前 0.23 秒 |
| 大跳 | 173px | 44px | 10px | 112px | 提前 0.37 秒 |
| 大跳(跨缺口) | 173px | 缺口 90~150px | 10px | 20px | 贴边起跳 |
| 验证 | 计算 | 结果 |
|---|---|---|
| 小跳过 30px 的石头,余量 | 40 − 30 | 10px ✔ |
| 大跳过 72px 的石头,余量 | 75 − 72 | 3px ✔(够,但要贴着动画看) |
| 大跳跨 150px 的缺口 | 173 − 150 | 23px ✔ |
| 小跳最矮的石头(12px) | 40 − 12 | 28px,会显得跳太用力 → 交给「不跳」档 |
缺口是地面消失,不是障碍。提前跳会在还没到缺口时就落地, 然后被迫在缺口边缘二次起跳——看起来像在犹豫,非常难看。 所以缺口用另一套判定:脚底即将离开地面的那一帧起跳。 这两套判定在代码里必须分开写,不能合并成一个"前方有东西就跳"。
[!note] 上一版这里是错的,已经修掉了 最初写的是"小跳管 ≤46px"。按小跳只能跳 40px,46px 的石头根本过不去—— 表现就是"兔子一头撞在石头上"。把阈值降到 30px 之后才有 10px 余量。 这条留在这里是因为它很容易被再犯:分档阈值必须按"跳得过"来定,不能按"感觉差不多"来定。
4.3 「自动」不等于「看起来在自动」#
兔子如果永远匀速、等间隔地跳,会显得像个机器。三条让它活起来的做法:
- 提前减速:接近需要大跳的障碍时,跑速先掉到 0.85 倍(0.25 秒内),起跳时恢复。看起来像"它在估距离"。
- 落点微调:落地后有小概率(30%)在原地补一个 8px 的小弹跳,像被自己的重量弹了一下。
- 没东西也跳一下:每 20 秒约一次、且前方 200px 内无障碍时,无理由地小跳一次。
零成本,但它把"跳跃"从功能变成了性格。 玩家看到兔子无缘无故蹦一下,会觉得它有情绪——这是角色塑造里性价比最高的一笔。
五、玩家要做的事(一):岔路口选方向#
完整规则、十个线索模板、选错的兜底,都在 关卡与解谜。这里只说它在主循环里的位置。
| 项 | 定案 |
|---|---|
| 触发 | 跑到关卡里的"岔路点",兔子自动停下(不是边走边选) |
| 界面 | 右下角翻开一张线索卡(一行观察 + 2~3 个出口) |
| 玩家动作 | 点一个出口。就一下 |
| 计时 | 没有。停多久都行,可以放着去干别的 |
| 选对 | 兔子继续走,路上多两处收集 |
| 选错 | 兔子走 3 秒发现是死路,自己折返,回头路上能多捡一样东西 |
走着选等于把解谜变成了反应题(一走神就错过),那这个游戏又变回考手速了。 停下这个动作本身在说:"这里值得你想一下。" 而且它是零压力的——你完全可以拿起水杯喝完再回来点。
5.1 玩家要做的事(二):小游戏#
每关 0~1 次,跑到一处会自动停下,面板从底部推上来。目前实现的是跳铃铛: 按住屏幕蓄力、松手起跳,敲响三个不同高度的铃铛。
它是插曲不是关卡——随时可以不做,做砸了不扣任何东西。 完整设计、十条候选、以及"一跳一铃"那个坑,都在 小游戏。
六、一局的时间账#
一局 = 34 个关卡,每关 6090 秒:
| 段 | 时长 | 玩家在干什么 |
|---|---|---|
| 关内跑动 | 60~90 秒 | 什么都不做,看 |
| 岔路口 | 每关 2~3 次 | 停下,读卡,点一下 |
| 小游戏 | 每关 0~1 次 | 按住蓄力,松手,看它跳 |
| 关卡结算 | 6 秒 | 看手账涨了多少 |
| 合计 | 4 ~ 6 分钟 | 动手 6 |
和前一版(单局 60 秒)比,一局变长了。原因是零操作之后单局太短会显得没内容—— 玩家没有"我在操作"的投入感,就必须靠"我走了多远、收了什么"来给。
七、明确砍掉的东西(不许加回来)#
| 砍掉 | 为什么 |
|---|---|
| 玩家操作跳跃 | 跑动时的跳跃全自动。只有小游戏里才把跳跃交给玩家,而且没有失败、没有计时 |
| 虚拟摇杆 / 方向键 | 零操作的前提是没有手部输入 |
| 血条 / 死亡 / 掉坑惩罚 | 铁律「零失败」 |
| 解谜计时 / 限时挑战 | 停下想事情是这个游戏最舒服的时候,不许有时间压力。小游戏也不计时 |
| 体力 / 门票 / 冷却 | 铁律「不需要回来管」 |
| 每日签到 / 打卡 | 同时违反两条:「需要回来管」(不点就断签)+ 制造焦虑(断签会亏)。花园离线成长已经给了"回来"的理由,不需要再加一个打卡。见 循环与商业化 第五节 |
| 排行榜 / 好友攀比数值 | 会把"看"变成"冲"。社交只做分享发现和花园互访,不做排名 |
| 浇水 / 投喂 / 每日任务 | 同上 |
| 敌人 / 战斗 / BOSS | 参考图的世界里没有敌人,加了就是换了个游戏 |
| 装备 / 属性数值膨胀 | 成长只给"更宽松",不刷新纪录 |
| 排行榜 / 分数竞速 | 会把"看"变成"冲" |
八、开工前要补的两件事#
| 事项 | 为什么 | 怎么做 |
|---|---|---|
| 数值模拟器 | 花园价格与"第几局出现取舍"目前是推的,不是跑的 | 写 tools/sim/notes.mjs,照 farm.mjs 的规矩(贪心 15 次取中位数、排除暴走值、给时间口径) |
| 关卡配表 | 段落、岔路、线索要有数据源,不能散在代码里 | demo/data/levels.json,格式见 关卡与解谜 第二节 |