从弄丢的杂志光盘到女儿的物理启蒙:网页版机关游戏 Contraption Lab 开发调测记
前言
2001 年前后,电脑杂志还流行附光盘,买杂志一半是为了那张盘。有一张盘里装了个小游戏,我到现在记得它的玩法:开局给你几颗球、几块木板、蜡烛、滑轮、传送带,把它们摆成一套连锁机关,按下启动,看球滚下坡、撞翻杠杆、点燃蜡烛、烧断绳子……最后一环正好把目标搞定。关卡设计得很「坏」,道具永远只给差一个,逼着你想「能不能用蜡烛延时替代传送带」。那阵子放学就蹲在电脑前摆机关,一关能琢磨一晚上。
后来那张光盘被高中同学借去,就再没回来。同学情谊还在,光盘没了。那个年代没有网盘没有现成的下载站,程序跟着光盘一起消失,之后很多年我偶尔想起它,连名字都想不起来,只剩玩法画面刻在脑子里。
二十多年过去,女儿上小学了。想给她找点真正动脑子的游戏,应用商店翻了翻:插广告的、氪金抽卡的、把「益智」做成第 41 套卷子的……突然想起那个机关游戏——与其挑,不如把它做出来。凭着记忆里的画面去搜,大概率对上了 Sierra 的《The Incredible Machine》系列(民间叫「不可思议的机器」),设计文档就按它对标。
于是有了「奇妙机关工坊 Contraption Lab」:纯网页的 2D 物理连锁机关解谜 + 关卡创作平台,代码已开源:https://github.com/anTtutu/contraption-lab。这篇不念功能清单,讲讲它长什么样,以及开发路上我被物理引擎教育的几件事。
1、这游戏长什么样
三大模式一句话说清:
- 闯关:7 大主题章节 × 6 关 = 42 个官方关卡,从「东西为什么往下掉」一路玩到齿轮传动、蜡烛延时、风与浮力。通关得 ★1,道具用得少得 ★2,全程不看提示得 ★3——鼓励的是「自己想出来」,不是「磨出来」
- 编辑器:道具随便摆,目标自己配,摆完还能导出成
.clab文件发给朋友——是的,你完全可以做一个「变态难」的关卡去祸害别人家孩子 - 沙盒实验室:通关第 1 章解锁,全道具无限量随便造,还能 0.25 倍速慢放围观自己的机关翻车全程。先学会走,再给你整个操场
章节地图长这样,7 个主题章节外加沙盒和「我的关卡」:
第 1 章全三星(内测成果,没有一关是白给的):
编辑器,左边道具库、中间画布、右边属性和目标配置,顶栏试运行、保存、导出一条龙:
顺带一提零素材:全游戏的画面是代码现场画的矢量图,音效是代码现场合成的,整个仓库没有一张图片、没有一个音频文件。好处除了包小、加载快,还有一点私心——我完全不会画画,也不会作曲,那就干脆都不需要。
2、复刻不是照抄:给小孩玩要做的减法
原作是好游戏,但它是给 2000 年的理科生玩的,直接端给小学生就是灾难。所以复刻的过程一半是做减法:
- 原作任意角度、像素级摆放,键盘鼠标伺候 → 改成 15° 角度吸附 + 半格位置吸附,手指头也能玩
- 原作卡关没人管你 → 三级提示:先文字引导,再给个半透明的「幽灵答案」虚影,最后干脆放一遍参考解慢动作。看提示会丢一颗星,但永远有下一步
- 没有失败惩罚:随便重试、随时停、失败文案是「小齿轮们需要再排排队~」这种。大不了推倒重来,反正搭坏了的机关再壮观也不心疼
- 炸弹不炸人,落地是一团礼花彩带;主角配角是一只住在实验室的小仓鼠,负责跑滚轮发电和卖萌
一句话原则:物理是认真的,脾气是好的。
3、开发路上被物理引擎教育的几件事
写这个项目之前,我以为物理引擎是个「给个重力就能跑」的东西。天真了。
第一课:球滚坡像陷进糖浆。 第一版里球从 25° 的坡上滚下来,越滚越慢,最后优雅地停住,像一颗陷入沉思的钢球。查了半天自己的代码没毛病,是引擎的圆体在斜面上有固有数值损耗,实测有效加速度只剩理论值的五分之一。解决办法简单粗暴:把重力放大三倍补偿。从此球滚得眉清目秀。
第二课:球会被「睡死」。 为省性能,物理引擎会把低速物体「休眠」——但低速球在缓坡上明明还在慢慢滚,引擎觉得它不动了,一巴掌拍睡。球就那么停在半坡,任凭你怎么等。这个 bug 实锤了两次我才认命,直接全局关掉休眠。性能?42 关的规模,省它干嘛。
第三课:齿轮是作弊的。 真让两个齿轮的齿去碰撞咬合,得到的是抖动、穿齿和随机卡死,像两个喝醉的齿轮。最后的实现是:看起来咬得严丝合缝,其实是我在背后按半径比偷偷联动。对,作弊了。但大带小变快、小带大变慢的教学效果一分不少,而且它永不抽风——游戏的世界里,「稳定地像真的」比「真的是」重要。
第四课:无解关是儿童游戏的第一大罪。 解谜游戏最惨的事故不是崩溃,是无解关——孩子认认真真折腾半小时,其实压根通不了关。对成人是个差评,对小孩是劝退,对家长是「这什么破游戏」。所以每个官方关卡都带一份作者录好的「参考解」,42 个关卡交给自动化测试逐关「考试」:加载、启动、跑完、断言通关——全部考完只要半秒。另外编辑器里没亲手试玩通关过的关卡不许导出,从流程上禁止你祸害别人家孩子。
第五课:文档写得像诗,不如刷新一次页面。 存档最初选了一套很时髦的浏览器数据库方案,设计文档里写得行云流水。实测:刷新页面,进度全没。乖乖退回「内存库 + 快照备份」的老实方案,刷新一千次进度都在。从此立下规矩:每个「应该没问题」都必须配一次「真的试了」。
这些坑最后都变成了自动测试用例——全套 103 个测试 3 秒跑完,改任何参数全量重跑,没有借口偷懒。
4、想玩的话
仓库在此:https://github.com/anTtutu/contraption-lab(MIT),克隆下来三行命令:
|
|
两个注意点:要用 localhost 或 HTTPS 访问(浏览器本地数据库的限制,直接双击文件打不开);它还是个 PWA,手机浏览器打开可以「添加到主屏幕」离线玩,进度存在本地。
建议路线:第 1 章先通两关找手感(那就是二十多年前的味道)→ 通关第 1 章解锁沙盒实验室放飞自我 → 最后进编辑器做一关自己的,导出 .clab 发给朋友——记住第三课的教训,导出前先自己通一遍。
总结
二十多年前光盘丢就丢了,玩法一直活在记忆里,这次终于把它换了个载体重新造出来,还多了一个用途——给女儿的物理启蒙。她现在知道重的球砸跷跷板更狠、齿轮大的带小的会变慢、蜡烛烧绳需要等一等,虽然她管这套东西叫「爸爸的多米诺」。
至于我,收获是重新被教育了一遍:物理引擎不是给个重力就能跑的,文档写得漂亮不如刷新一次页面,以及——想做出一个不坑小孩的解谜游戏,得先让机器替你把每一关都玩一遍。
接下来就等小玩家慢慢验收。看她对着第 7 章的综合大机关抓耳挠腮、然后突然眼睛一亮的样子——那画面,和当年的我一模一样。
相关阅读
- 原文作者:Anttu
- 原文链接:https://anTtutu.github.io/post/2026-10-23-contraption-lab/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。