合成大游戏skill
把一批任意图片,变成能直接玩的「合成大○○」+ 一张素材规范表。
默认交付三件套
- 飞书多维表格 — 尺寸规范 + 「最终贴图」附件列回写成品
- 各级贴图 — 去底、按 10 级尺寸适配、透明背景
- 可运行游戏 — 自包含单文件 HTML,双击即玩
用户明确只要其中某几件时才裁剪范围。
游戏标题按用户说法命名:说「合成大猫猫」就叫合成大猫猫,说「合成大狗狗」就叫合成大狗狗。
执行流程
分两个阶段:先建表约定排序 → 拿到图后再处理生成。不要跳过阶段一直接处理图片,表格是和用户对齐尺寸与顺序的依据。
用户在首次触发时就已经给了图片,则阶段一的建表照做,但不必再索要图片,直接和用户确认排序后进入阶段二。
阶段一:建表 + 索要贴图
第 1 步:先建好空的多维表格
先读 references/bitable_schema.md 拿字段设计与已知坑,再按 lark-base skill 的语法建表。
这一步在拿到图片之前完成。 表格先建好,用户才能对照每一级的尺寸要求准备图,避免来回返工。
建 10 行,对应游戏的 10 个层级,逐行填好「层级序号」「要求尺寸(px)」「文件格式」「色彩模式」「需要透明背景」等规范字段,「最终贴图」附件列先留空——它是阶段二的回写目标。
建完通过交付工具把表格链接给用户。
第 2 步:索要 10 张贴图并约定排序
交付表格后,主动向用户索要 10 张贴图,并把排序规则一次说清:
> 表格已建好,共 10 级。请提供 10 张图片,按从小到大的顺序给我:
> - 第 1 张 → lv0,最小,80×80,游戏开局投放的
> - 第 10 张 → lv9,最大,408×408,合成的最终目标
>
> 排序方式二选一,你方便就行:
> - 文件名带序号(1.png、2.png…),我按名称排
> - 直接按顺序发给我,或告诉我哪张放哪一级
排序必须和用户确认到位,因为它直接决定合成链的视觉递进——小的在前、大的在后,顺序错了游戏体验会很怪。用户没明确说时,不要自行假设,问一句再动手。
图片不足 10 张:告诉用户可以补齐,也可以就用现有的——脚本会循环复用补足 10 级,但要在最终回复里说明哪几级用了同一张图。
图片不适合做贴图时(大幅风景照、多主体合影、文字截图),提醒用户主体不突出的图缩到 80×80 会糊,建议换主体清晰、背景单一的图。
用户没图、想让你生成:用环境里的图片生成能力造一套——先生成一个核心形象作为画风锚点,再基于它延展出其余各级,保证画风统一。生成后仍按上面的顺序规则对号入座。
阶段二:处理 → 回写 → 生成游戏
第 3 步:处理贴图
python3 scripts/prepare_sprites.py --src <图片目录> --out <输出目录>
- 源图已是透明 PNG 时加
--no-bg-removal - 去底不干净时调大
--tol(默认 28) - 需要非标准尺寸时用
--sizes 80,92,108x108
传目录时按自然排序取图(2.png 排在 10.png 前,不是字符串序)。要完全按自己指定的顺序时,用逗号分隔显式传:--src "a.png,b.png,c.png",脚本原样保留不重排。
脚本用四角泛洪去底,只删与画布边框连通的白色,主体内部的白色(白毛、白描边、高光)完整保留。写盘后会回读断言尺寸与 RGBA 模式。
真人照片 / 复杂实景背景(夜景、车内、街景、泳池等非白底图)不要用泛洪——它只认白底。走人像分割管线,细节见 references/portrait_cutout.md:rembg(u2net_human_seg) 分割 → alpha 拉伸 → 连通域去碎块 → 内缩羽化去镶边 → 头肩方裁(大脸特写几何居中、全身照偏上取头肩)→ 必要时椭圆遮罩修发际线四角。合集图先按白色间隙切成单张再处理。
处理完先核对一遍顺序:确认 lv0 是用户指定的最小那张、lv9 是最大那张。顺序错了后面全错,这一步别省。
第 4 步:回写贴图到多维表格,完成映射
把处理好的 10 张贴图上传到阶段一那张表的「最终贴图」附件列,逐行对应——lv0 的贴图挂到层级序号 0 那行,以此类推。
附件上传只接受相对路径,必须 cd 到贴图目录后用 ./filename,传绝对路径会报 unsafe file path。
串行上传,并发容易写冲突。中途超时就先回读看已传了几行,补齐剩余的,不要整体重来。
替换某一级贴图时:附件上传是 append 语义,直接传会让同一单元格挂两张图。必须先用 +record-remove-attachment --file-token <旧token> --yes 删掉旧附件(file_token 从 +record-list 该单元格取),再传新的,最后同步更新「参考文件大小」。
传完回读校验:逐行核对附件的文件名尺寸与该行「要求尺寸(px)」是否一致,确认 10/10 匹配。这张表就是贴图与层级的映射关系表。
校验通过后重新交付表格链接给用户。
第 5 步:生成游戏
python3 scripts/build_web_game.py --sprites <贴图目录> --title "合成大猫猫" --out <输出.html>
图片以 base64 内嵌,不依赖任何外部图床。加 --names "名1,名2,..." 可自定义各级名称,用于结算面板展示。
可选定制参数(用户提了才加,不提走默认):
- --sayings "台词1,台词2,..." — 高级合成时在合成点炸开的随机台词气泡,英文逗号分隔(文案内部只能用中文逗号);不传则永不弹气泡。
- --say-from <n> — 从哪个 0 基层级起弹,默认 3(即合成出显示「Lv.4」时;显示 Lv.N 对应 index N-1,别算错一位)。
- --over-title "..." — 游戏结束面板标题,默认「又叠塌了」。
- --max-dim 408 — 真人照片等细节多的贴图把内嵌上限从默认 200 提到 408,小脸才不会糊。
示例:
python3 scripts/build_web_game.py --sprites out/ --title "合成大楚楚" --out game.html \
--max-dim 408 --names "楚楚 Lv.1,楚楚 Lv.2" \
--sayings "加油,稳住,呼!" --say-from 3 --over-title "再试一次吧"
需要改的是原版 Cocos 仓库(liyupi/daxigua)而非网页版时,改用:
python3 scripts/apply_native_skin.py --game <daxigua目录> --sprites <贴图目录>
python3 scripts/apply_native_skin.py --game <daxigua目录> --restore # 回滚
动手前先读 references/daxigua_asset_map.md——UUID 映射和同尺寸干扰项都在那里。
第 6 步:验证后再交付
必须在浏览器里真实打开,确认贴图渲染出来了,不能只看脚本输出的 OK。
验证要点:
- 页面 NEXT 图与进化链是否显示
- NEXT 槽显示的就是松手会掉落的球(state.cur),连投几轮核对「预告=掉落、投后预告刷新」,不能错开一位
- 投放后掉落的是图片而非兜底色块
- 同级相撞能否合成、分数是否递增
- 人像/非对称贴图任何碰撞后都保持正立(模板已用 inertia:Infinity + 不 rotate 锁死,别改回 ctx.rotate(b.angle);测试时不要用 Body.setAngularVelocity 人为赋角速度,那会绕过惯性锁定造成误判,只看自然碰撞)
- 配了 --sayings 时:未达 --say-from 不弹、达到后随机弹、长句贴边不溢出;没配时任何合成都不弹
- 合成链的大小递进是否符合和用户约定的排序
浏览器可能缓存旧页面,加 ?v=2 或强刷。内置浏览器截图通道超时时,可用页面自身 JS 读状态(state/Composite)、或 canvas.toDataURL() 导出帧后 Read 查看;DOM 覆盖层(气泡/面板)不在 canvas 导出里,用 getComputedStyle/getBoundingClientRect 核验。
硬性约束
- 贴图绝不能用外链:图床通常不返回 CORS 头,canvas 引用外链贴图会静默失败、退化成兜底色块。必须 base64 内嵌。
- 同理不要给 Image 设
crossOrigin:canvas 只做绘制、不读像素,设了反而导致加载失败。 - 尺寸不能拉伸:等比缩放后居中贴透明画布,
153x152这类非正方尺寸才不会变形。 - 人像/文字等非对称贴图必须锁正立:物理 body 设
inertia:Infinity、渲染不ctx.rotate,否则碰撞后会倒置;模板已内置,禁止回退。圆形水果不转也无副作用。 - NEXT 预告永远显示 state.cur(即将掉落的那个),不是 state.next;掉落后 cur 承接旧 next 再刷新预告。
- 台词气泡默认关闭:只有
--sayings传了文案才出现;阈值按显示级别换算(Lv.N → index N-1)。 - 原版仓库只能同名覆盖:Cocos 按 UUID 索引资源,改名或新增文件都会失效。
常见问题
掉下来是色块不是图片 — 贴图加载失败。检查是否用了外链、是否设了 crossOrigin。
图片边缘有白边 — 去底容差不够,调大 --tol。
主体白色部分被删掉 — 不应发生,泛洪只删边框连通区域。若出现,检查主体是否与画布边缘相接。
Cocos 版页面卡在 99% — 无 GPU 环境的固有现象,原始仓库也一样。改用静态校验确认素材正确,别死等渲染。
首屏加载很慢 — 原版 index.html 有两个失效的广告视频源(返回 502),删掉第 76–77 行的 <source>。
资源
scripts/prepare_sprites.py— 图片批量处理成各级贴图scripts/build_web_game.py— 生成自包含单文件网页游戏scripts/apply_native_skin.py— 替换原版 Cocos 仓库素材,支持备份与回滚references/daxigua_asset_map.md— UUID 映射表、同尺寸干扰项、代码级事实references/bitable_schema.md— 多维表格字段设计与附件回写要点references/portrait_cutout.md— 真人照片/复杂背景的抠图管线与踩坑assets/game_template.html— 参数化游戏模板,由 build_web_game.py 注入数据