用 WorkBuddy + AI 从零做出这个游戏(下):调物理、修 bug、换肤切关
系列第 3 篇(实战下)。接着上篇,游戏已经能玩了,但"手感"和"完整性"还差得远。这篇讲怎么把粗糙的第一版打磨成成品,以及两个加分项:换肤和关卡切换。
示例图:
1. 调掉落物理(越掉越快、碰到停住)
我:水果掉下来要有重力感,越来越快,碰到东西要停住叠上去,不能穿过去。
AI:每帧给掉落水果加速度,碰到下方水果就用碰撞分离顶在上方。
每帧{f.vy+=0.45;// 重力,越掉越快f.vy*=0.985;// 空气阻力(很小)f.y+=f.vy;// y 朝下,y 变大 = 往下// 碰到下方水果时,碰撞分离把它顶住,vy 清零}用真实数字看"越掉越快"(初始 y=100, vy=0):
帧1: vy=0.45 → y=100.45 帧2: vy=0.89 → y=101.34 帧3: vy=1.33 → y=102.67 帧4: vy=1.76 → y=104.43 帧5: vy=2.18 → y=106.61每帧下落距离 0.45→0.89→1.33→1.76→2.18,越来越大 = 加速下落。
2. 调碰撞(不重叠、滑落、卡缝、级联)
我:水果不能叠在一起,单果上要滑落不能粘,两个果之间的窄缝要卡住,点走一个它上面失去支撑的才掉。
AI 把碰撞拆成两块:
碰撞分离(两两重叠就各退一半,重复 10 次):
for(每对 a,b){dist=两点距离(a,b);if(dist<a.半径+b.半径){// 重叠重叠量=(a.半径+b.半径)-dist;沿连线 各退 重叠量/2;// 刚好分开}}支撑判断(掉到固定水果圆面上):用"上一帧在面上、本帧到面下"判定穿过,单支撑滑落、双支撑窄缝卡住:
if(掉落果穿过某个挂枝果圆面){if(支撑只有1个)沿圆面切线滑落;if(两个支撑且开口<1.45倍半径)卡住不动;}踩坑实录:有次水果从容纳不下的窄缝穿过去。我截图说"缝隙容不下一个水果却穿过去了"。AI 加了"上一帧位置快照比对",穿模修好了。这种 bug 给 AI 看截图最有效。
级联掉落(只放直接失去支撑的那层,不递归):
点走水果X{释放X正上方、且只靠X撑着的水果;// 不递归释放更上面的,留到下一帧再判断}3. 修「消除不成对」的坑(配对完整性)
我:玩到最后剩 4 个消不掉,还有蓝色水果不成对。你计算错了?
AI 查了三处根因,不是算法错,是数据漏了:
| 根因 | 现象 | 修法 |
|---|---|---|
| 生成数量奇数 | 某种颜色多一个,永远消不完 | 每种颜色生成偶数个 |
| 摆不下被静默丢弃 | 屏幕放不下,多出的没进队列 | 摆不下的全部进补位队列 |
| 道具只删一个 | 消除按钮只删当前果,配对断档 | 同步删同色配对 |
生成关卡(){每种颜色数量=偶数;摆不下的水果 → 补位队列.add(它);// 别丢}给后端同学的提醒:这坑你最该在意——本质就是"数据一致性"。我让 AI 加了个
assertPairable()校验函数,启动时检查"每种颜色都是偶数、场上+队列总数配对",不配对直接报错。后端做单测那套思路直接用。
4. 换肤:让 AI 用 AI 生图(三国 → 蜡笔小新)
我:第二关水果换成三国人物,第三关换成蜡笔小新,图片用 AI 生成。
AI:用图像生成工具出 10 张透明底 Q 版头像,存到
heroes/和shinchan/,画水果时按关卡换图。
代码只改"画什么",逻辑不动(皮肤不影响本质):
画水果(f){if(当前关==2&&三国图就绪)圆形裁剪里画(三国头像[f.类型]);elseif(当前关==3&&小新图就绪)圆形裁剪里画(蜡笔小新头像[f.类型]);else画(普通水果[f.颜色]);}加分项:AI 生成的图要"预加载"完再显示,否则第一帧会闪。AI 加了
onload回调,没加载完就先画普通水果兜底。
5. 加关卡切换功能
我:加个能切换关卡的功能。
AI:顶部"第 X 关"徽章改成可点,弹出 1~5 关选择面板,点哪个重开哪关。
点关卡徽章(){弹出面板(显示1~5关,当前关高亮);}选关卡(lv){当前关=lv;清空三个筐;按 关卡规则(lv)重新生成;关掉面板;}6. 方法论:怎么让 AI 高效修 bug
做了 26 个 bug,总结出让 AI 修得又快又准的 4 条:
- 说清三步:你点了啥 → 预期咋样 → 实际咋样。
- 带截图 + 圈出问题点:视觉 bug 截图比文字强 10 倍。
- 给坐标 / 数字依据:说"dist=14"不如说"a在(300,115) b在(350,115) 半径50 所以 dist=50"——AI 才能验证。
- 一次一个功能:别"顺便把物理也调了",容易改崩。
7. 总结
26 个 bug 复盘完,真正的"算法错误"只有 5 个,其余 21 个都是需求理解偏差(比如 y 轴朝下搞反)和参数没调对(迭代次数、阈值)。
给后端同学的话:你不是不能做前端游戏,你只是缺"把想法翻译成需求"这一步。WorkBuddy 帮你写代码、跑、预览,你只管想清楚 + 说清楚。这个游戏从空壳到成品,我一行前端没从头写,全是对话出来的。
系列完。源码在fruit-game.html,设计思路在第 1 篇,实战在上/下两篇。去试试,做个你自己的小游戏。
一句话收尾:设计想清楚(第1篇)→ 搭骨架(上篇)→ 调手感加料(下篇)= 一个能玩、能发、能换皮的游戏。
