上次用免费的ChatGPT额度让Codex做了一个PPT,题材随口说的。做出来的效果没人觉得好。但这也不赖我呀。我让它用Image2生成几张背景图片,额度明显不够,生成的图片质感很差。
这次充了值,看看效果能提升多少。
老样子,口喷。
写一个用Codex开发小游戏的PPT,要求顶级精美,专业,大气。背景用Image2生成。放到docs文件夹中,没有则创建。
开启GPT 5.5,高度思考。
这次没报什么Python包找不到的错。看来AI和人一样,说做不到只是个借口。钱给够,一切都不是事。
我观察了一下生成过程,AI还是先写代码,让代码驱动PPT的生成。
exportasyncfunctionslide02(presentation, ctx){const slide = presentation.slides.add();awaitbg(slide, ctx);kicker(slide, ctx,"WORKFLOW CLAIM");title(slide, ctx,"Codex 的价值不是“写代码快”,而是让游戏开发形成闭环。","把目标、代码、运行反馈放在同一条迭代链路里,小游戏可以在很短时间内从想法变成可玩的原型。",88,780);const steps =[["目标","玩法一句话\n成功标准",C.cyan],["计划","拆循环\n定文件边界",C.amber],["实现","小步改代码\n保持可运行",C.lime],["验证","本地启动\n观察问题",C.rose],["修补","定位缺陷\n继续迭代",C.cyan]];let x =82;for(const[h, b, c]of steps){node(slide, ctx, x,360,170,116, h, b, c); x +=210;}["→","→","→","→"].forEach((a, i)=> ctx.addText(slide,{text: a,x:266+ i *210,y:394,w:34,h:30,fontSize:24,color:C.cyan,bold:true,typeface:"Aptos",align:"center"}));ctx.addText(slide,{text:"闭环越短,手感越快出现;反馈越具体,修补越少靠猜。",x:206,y:525,w:870,h:38,fontSize:24,color:"#F4FBFF",bold:true,typeface:"Microsoft YaHei",align:"center"});footer(slide, ctx,2);return slide;}exportasyncfunctionslide03(presentation, ctx){const slide = presentation.slides.add();awaitbg(slide, ctx,{narrow:true});kicker(slide, ctx,"GAME CONCEPT FIRST");ctx.addText(slide,{text:"先锁住可玩性,再决定技术细节。",x:62,y:88,w:560,h:112,fontSize:38,color:C.ink,bold:true,typeface:"Microsoft YaHei UI"});ctx.addText(slide,{text:"Thunder Rift 的核心不是“炫酷特效”,而是玩家移动、射击、躲弹、吃道具、打 Boss 的连续体验。",x:64,y:240,w:470,h:64,fontSize:18,color:C.muted,typeface:"Microsoft YaHei"});awaitscreenshotFrame(slide, ctx,612,88,538,328,"Image2 · 可玩性目标截图");panel(slide, ctx,670,454,424,106,"#061A22E6");ctx.addText(slide,{text:"Playable Promise",x:700,y:476,w:260,h:26,fontSize:22,color:C.ink,bold:true,typeface:"Aptos Display"});ctx.addText(slide,{text:"玩家在 60 秒内看见:响应跟手、敌人与弹幕变化、得分和 Boss 目标。",x:700,y:510,w:348,h:34,fontSize:13,color:"#D9E9F5",typeface:"Microsoft YaHei"});chip(slide, ctx,92,390,"Canvas 渲染",C.cyan);chip(slide, ctx,230,390,"键盘控制",C.amber);chip(slide, ctx,368,390,"Boss 波次",C.rose);chip(slide, ctx,92,438,"粒子反馈",C.lime);chip(slide, ctx,230,438,"HUD 仪表",C.cyan);chip(slide, ctx,368,438,"本地服务",C.amber);footer(slide, ctx,3);return slide;}exportasyncfunctionslide04(presentation, ctx){const slide = presentation.slides.add();awaitbg(slide, ctx);kicker(slide, ctx,"CODE ARCHITECTURE");title(slide, ctx,"四个文件足够承载一个完整的浏览器小游戏。","Codex 会先读现有代码边界,再把 UI、渲染、状态与本地服务各归其位,减少互相污染。",88,720);node(slide, ctx,84,326,226,128,"index.html","Canvas 舞台、HUD、菜单、Toast 与可访问标签。",C.cyan);node(slide, ctx,366,326,252,128,"styles.css","深色视觉系统、响应式 HUD、按钮、面板与扫描线质感。",C.amber);node(slide, ctx,674,326,278,128,"game.js","游戏状态、输入、关卡、敌人、碰撞、粒子与主循环。",C.lime);node(slide, ctx,1004,326,190,128,"server.js","本地静态服务,快速打开、调试、验证。",C.rose);ctx.addText(slide,{text:"HTML → CSS → JS → Run",x:394,y:508,w:500,h:38,fontSize:28,color:"#EAFBFF",bold:true,typeface:"Aptos Display",align:"center"});ctx.addText(slide,{text:"结构清楚,后续扩展音效、排行榜、关卡编辑器时才不会被早期原型拖住。",x:260,y:556,w:760,h:32,fontSize:16,color:C.muted,typeface:"Microsoft YaHei",align:"center"});footer(slide, ctx,4);return slide;}exportasyncfunctionslide05(presentation, ctx){const slide = presentation.slides.add();awaitbg(slide, ctx);kicker(slide, ctx,"BUILD ROADMAP");title(slide, ctx,"把小游戏拆成 5 个可验证里程碑。","每一步都要能运行、能看见、能判断手感;这比一次性生成大段代码更稳。",88,680);const items =[["01","可移动","Canvas 尺寸、坐标系、键盘/指针输入",C.cyan],["02","可射击","子弹、敌人、碰撞、分数反馈",C.amber],["03","可变化","波次、关卡色彩、Boss 阶段",C.lime],["04","可读懂","HUD、血量、武器、连击、暂停",C.rose],["05","可交付","本地服务、响应式、QA 与演示",C.cyan]];let x =82;for(const[num, head, body, color]of items){panel(slide, ctx, x,330,205,154,"#061421E6");ctx.addText(slide,{text: num,x: x +16,y:350,w:52,h:30,fontSize:24, color,bold:true,typeface:"Aptos Display"});ctx.addText(slide,{text: head,x: x +72,y:352,w:104,h:26,fontSize:21,color:C.ink,bold:true,typeface:"Microsoft YaHei"});ctx.addShape(slide,{x: x +18,y:400,w:166,h:1,fill:"#FFFFFF20",line: ctx.line()});ctx.addText(slide,{text: body,x: x +18,y:420,w:165,h:44,fontSize:12,color:C.muted,typeface:"Microsoft YaHei"});x +=226;}ctx.addShape(slide,{x:126,y:526,w:1028,h:4,fill:"#FFFFFF14",line: ctx.line()});ctx.addShape(slide,{x:126,y:526,w:823,h:4,fill:C.cyan,line: ctx.line()});footer(slide, ctx,5);return slide;}exportasyncfunctionslide06(presentation, ctx){const slide = presentation.slides.add();awaitbg(slide, ctx);kicker(slide, ctx,"PROMPTING PATTERN");title(slide, ctx,"好提示词像产品需求文档的最小版本。","把目标、约束、验收标准和当前问题说清楚,Codex 才能做出可控的小步修改。",88,720);panel(slide, ctx,100,304,500,230,"#110B16D9","#FF3E7855");ctx.addText(slide,{text:"模糊请求",x:126,y:330,w:180,h:28,fontSize:22,color:C.rose,bold:true,typeface:"Microsoft YaHei"});ctx.addText(slide,{text:"“帮我做个小游戏,越酷越好。”",x:126,y:382,w:420,h:34,fontSize:20,color:"#F9EAF0",typeface:"Microsoft YaHei"});ctx.addText(slide,{text:"问题:范围无限、验收不清、调试入口缺失。",x:126,y:450,w:420,h:30,fontSize:15,color:C.muted,typeface:"Microsoft YaHei"});panel(slide, ctx,680,270,500,300,"#061A22E6","#41F8FF66");ctx.addText(slide,{text:"高质量请求",x:706,y:296,w:220,h:28,fontSize:22,color:C.cyan,bold:true,typeface:"Microsoft YaHei"});ctx.addText(slide,{text:"“做一个浏览器 Canvas\n街机射击游戏。先实现移动、射击、敌人、碰撞和\nHUD;保持四个文件结构;本地用 server.js\n跑;最后检查移动端布局。”",x:706,y:350,w:414,h:102,fontSize:18,color:"#EAFBFF",typeface:"Microsoft YaHei"});ctx.addText(slide,{text:"效果:边界清楚、反馈可跑、每次修改都能回归验证。",x:706,y:490,w:420,h:30,fontSize:15,color:C.muted,typeface:"Microsoft YaHei"});ctx.addText(slide,{text:"→",x:614,y:392,w:48,h:40,fontSize:34,color:C.amber,bold:true,typeface:"Aptos",align:"center"});footer(slide, ctx,6);return slide;}exportasyncfunctionslide07(presentation, ctx){const slide = presentation.slides.add();awaitbg(slide, ctx);kicker(slide, ctx,"DEBUG + QA");title(slide, ctx,"小游戏质量来自持续验证。","Codex 的强项是把“我看到的问题”转换为定位、修改和回归检查,而不是押注一次性生成。",88,720);panel(slide, ctx,88,318,494,230,"#06111DEA");ctx.addText(slide,{text:"$ node server.js",x:122,y:350,w:360,h:24,fontSize:20,color:C.lime,bold:true,typeface:"Aptos Mono"});ctx.addText(slide,{text:"Thunder Rift running at http://127.0.0.1:8000/",x:122,y:386,w:390,h:24,fontSize:14,color:"#DDFBFF",typeface:"Aptos Mono"});ctx.addShape(slide,{x:122,y:436,w:396,h:1,fill:"#FFFFFF22",line: ctx.line()});ctx.addText(slide,{text:"验证动作:打开游戏 → 移动 → 开火 → 触发 Boss →\n调整数值 → 重跑。",x:122,y:462,w:386,h:42,fontSize:15,color:C.muted,typeface:"Microsoft YaHei"});panel(slide, ctx,668,300,470,270,"#071928E6");ctx.addText(slide,{text:"QA Checklist",x:704,y:326,w:220,h:28,fontSize:23,color:C.ink,bold:true,typeface:"Aptos Display"});bar(slide, ctx,706,382,210,"输入响应",0.92,C.cyan);bar(slide, ctx,706,426,210,"弹幕清晰度",0.78,C.amber);bar(slide, ctx,706,470,210,"HUD 可读性",0.84,C.lime);bar(slide, ctx,706,514,210,"移动端适配",0.66,C.rose);ctx.addText(slide,{text:"每轮围绕一个观察到的问题修补。",x:704,y:544,w:378,h:18,fontSize:11,color:C.muted,typeface:"Microsoft YaHei"});footer(slide, ctx,7);return slide;}exportasyncfunctionslide08(presentation, ctx){const slide = presentation.slides.add();awaitbg(slide, ctx);kicker(slide, ctx,"POLISH SYSTEM");title(slide, ctx,"精致感来自一套统一的反馈语言。","HUD、粒子、颜色、震屏、Boss 血条不是装饰,它们共同告诉玩家:我做了什么、发生了什么、下一秒该怎么办。",88,760);panel(slide, ctx,112,332,1056,146,"#071827E6");const hud =[["HULL","87%",C.lime],["WEAPON","LV 3",C.amber],["SCORE","48,260",C.cyan],["WAVE","05",C.rose],["COMBO","x12",C.lime]];let x =142;for(const[label, value, color]of hud){ctx.addText(slide,{text: label, x,y:360,w:140,h:16,fontSize:11,color:C.muted,bold:true,typeface:"Aptos"});ctx.addText(slide,{text: value, x,y:386,w:160,h:38,fontSize:30, color,bold:true,typeface:"Aptos Display"});ctx.addShape(slide,{ x,y:438,w:154,h:5,fill:"#FFFFFF13",line: ctx.line()});ctx.addShape(slide,{ x,y:438,w:112,h:5,fill: color,line: ctx.line()});x +=200;}ctx.addText(slide,{text:"视觉调优顺序:可读性 → 层级 → 动效 → 爽感。Codex 负责快速改动,设计判断仍由人来拍板。",x:192,y:536,w:894,h:34,fontSize:19,color:"#E9F7FF",bold:true,typeface:"Microsoft YaHei",align:"center"});footer(slide, ctx,8);return slide;}exportasyncfunctionslide09(presentation, ctx){const slide = presentation.slides.add();awaitbg(slide, ctx,{narrow:true});kicker(slide, ctx,"REUSABLE PLAYBOOK");title(slide, ctx,"把小游戏沉淀成下一次创作工作流","Codex 最适合做你的开发副驾驶:读懂上下文、执行小步修改、跑验证、把可复用经验写回项目。",88,760);node(slide, ctx,96,318,250,136,"1. 说清目标","玩法一句话、平台边界、验收标准。",C.cyan);node(slide, ctx,386,318,250,136,"2. 小步实现","先主循环,再敌人、HUD、关卡与特效。",C.amber);node(slide, ctx,676,318,250,136,"3. 每轮验证","启动服务,观察手感、性能、响应式。",C.lime);node(slide, ctx,966,318,214,136,"4. 留下资产","代码、PPT、流程、下一步清单。",C.rose);metric(slide, ctx,196,524,210,"1 个","可运行原型","浏览器直接启动",C.cyan);metric(slide, ctx,442,524,210,"4 类","关键反馈","输入 / 视觉 / 数值 / 布局",C.amber);metric(slide, ctx,688,524,210,"N 轮","快速迭代","每轮都可回归",C.lime);ctx.addText(slide,{text:"下一步:把 Thunder Rift 做成可发布版本。",x:242,y:636,w:796,h:36,fontSize:26,color:"#F5FBFF",bold:true,typeface:"Microsoft YaHei UI",align:"center"});footer(slide, ctx,9);return slide;}exportasyncfunctionslide10(presentation, ctx){const slide = presentation.slides.add();awaitbg(slide, ctx,{qna:true,narrow:true});kicker(slide, ctx,"THANK YOU",64,54,C.amber);ctx.addText(slide,{text:"感谢观看",x:64,y:132,w:430,h:72,fontSize:58,color:C.ink,bold:true,typeface:"Microsoft YaHei UI"});ctx.addText(slide,{text:"Q&A",x:66,y:224,w:330,h:88,fontSize:74,color:C.cyan,bold:true,typeface:"Aptos Display"});ctx.addText(slide,{text:"欢迎讨论:玩法设计、Codex 提示词、代码结构、调试验证,以及如何把原型推进到可发布版本。",x:68,y:340,w:456,h:82,fontSize:19,color:"#CFE3F3",typeface:"Microsoft YaHei"});panel(slide, ctx,70,478,374,80,"#061A22D9","#41F8FF66");ctx.addText(slide,{text:"Thunder Rift · From prompt to playable prototype",x:96,y:506,w:320,h:28,fontSize:15,color:"#EAFBFF",bold:true,typeface:"Aptos"});ctx.addText(slide,{text:"问题越具体,下一轮迭代越有力量。",x:68,y:632,w:520,h:30,fontSize:22,color:C.amber,bold:true,typeface:"Microsoft YaHei UI"});footer(slide, ctx,10);return slide;}PPT生成出来后,直接打开就成功了,没报什么格式已损坏,要不要修复之类的警告。
我微调了一下PPT页面中的位置,改动很小。效果怎么样?比上次强多了吧。
而且Codex给我做了4个图层——最底层背景图片,上一层是用来降低整个背景饱和度的半透明蒙版,再上面是文字和一个小蒙版,在它之上是前景图片。上次有个高手说Codex只能生成2个图层,而他做的高端PPT至少要5个图层,蒙版设置也比较复杂,不得已还是手搓。这里为他扼腕叹息。如果提示词他再研究一下,可能就告别手工时代了。

别问我PPT的主题为何是Codex编写小游戏。我是抱着小兵回来变成小丘的心态去线下讲这个PPT的。因为我也没怎么开发过游戏,就去教人游戏开发了,误人子弟啊。好在我不收费,不像某音上教小白AI课的博主,那才叫割韭菜。Tranformer大模型整个运算机制,孬好我还是明白的。万一大家嫌乎我不懂游戏开发,我还可以现场手撕大模型预训练的公式。