--- 课时: 10 主题: 涂鸦PK(三)— 动画 + 音效 + 特技 核心能力: [审美力, 提问力] 核心工具: [Trae IDE, Kimi] 时长: 90分钟 透明化层级: 过程层 适用路线: AICODE-06 --- ### 1. 课程目标 **知识目标:** - 理解「游戏感(Game Feel)」的概念:每次操作必须有视觉反馈,玩家才知道自己的行动生效了 - 理解「增量需求」的写法:在已有系统上叠加新功能,只描述新增部分,避免 AI 误改已验收的代码 - 理解 Web Audio API 的核心思想:用纯代码合成音效,不需要任何音频文件 **能力目标:** - 能用「感觉语言」描述动画需求(「快速冲过去然后弹回来」),让 AI 把感觉翻译成代码参数(审美力) - 能写出增量需求文档,只描述新增的动画/音效,不重写已有战斗逻辑(提问力) - 能在 AI 生成代码后,通过视觉对比和试玩,判断动画「感觉对不对」并给出精准修改意见(审美力) **情感目标:** - 对「同样的游戏,有没有动画,体验天差地别」产生真实感受——建立「视觉反馈是游戏的灵魂」的审美直觉 - 体验到「我说出一种感觉,AI 把它变成了代码」的成就感,增强自然语言驱动开发的自信 - 对下节课的班级对战产生期待感 --- ### 2. 核心概念与误概念预设 **核心概念认知层级:** | 概念 | 学生类比 | 认知层级 | |------|---------|---------| | 游戏感(Game Feel) | 打篮球投篮时「嗖」一声进了网——同样进了,但有没有这个声音感觉完全不一样 | 理解层 | | 增量需求 | 你去装修只告诉工人「加一个书架」,不需要重新描述整个房子的结构 | 理解层 | | 感觉语言→参数翻译 | 给厨师说「要辣一点」而不是「加5克辣椒粉」——厨师懂怎么翻译成具体操作 | 应用层 | | Web Audio 合成音效 | 用嘴巴「嗖——」发出声音,不需要找一个录好的「嗖」的音频文件 | 理解层 | | 特技视觉标记 | 超市商品的标签——没有标签你看不出这是打折商品;特技没有特效,玩家感知不到它生效了 | 应用层 | **典型误概念表:** | 编号 | 误概念 | 正确认知 | 激发策略 | |------|--------|---------|---------| | M1 | 动画只是装饰,不影响游戏质量 | 动画是「游戏感」的核心:每次操作必须有视觉反馈,玩家才知道自己的行动生效了 | 展示对比:无动画(只有数字变化)vs 有动画(角色冲刺),问学生哪个更爽 | | M2 | 音效需要找音频文件,太麻烦了 | Web Audio API 用纯代码合成音效,零素材依赖,浏览器内置支持 | 演示:三行代码合成一个攻击音效,不需要任何音频文件 | | M3 | 增量需求要把整个需求文档重写一遍 | 增量需求只写新增的部分;已验收的功能不重写,避免 AI 误改 | 类比:装修只说「加书架」,不需要重新描述整个房子 | | M4 | 动画描述必须用技术参数(duration: 200ms) | 先用感觉描述(「快速冲过去然后弹回来」),AI 把感觉翻译成参数;感觉描述比参数描述更准确 | 让学生先说出感觉,再看 AI 翻译的参数,对比哪种方式更自然 | | M5 | 特技效果只要触发就行,不需要视觉区分 | 特技必须有独特的视觉效果,玩家才能感知到特技生效了(如燃烧 = 橙色粒子,冰冻 = 蓝色闪烁) | 问:「如果燃烧特技触发了但什么都没发生,你怎么知道它触发了?」 | --- ### 3. 教学准备 **工具与环境:** - 每台电脑已安装 Trae IDE,可正常打开上节课(第9课)的战斗游戏文件 - 每台电脑浏览器可正常播放 Web Audio(Chrome/Edge 均支持,确认未被系统静音) - 投影可切换至任意学生屏幕 - 准备两个演示文件:`demo-2-pk-battle.html`(无动画版)和 `demo-3-animation.html`(有动画版) **教学资源:** - 教师准备:`demo-3-animation.html` 在本机调试好,各按钮动画流畅可用 - 教师准备:「动画增量需求」保底提示词(见第5节)、「音效合成」保底提示词(见第5节) - 教师准备:Web Audio 三行代码片段(在 Kimi 里提前验证过能正常合成音效) - 学生资源:上节课(第9课)完成的战斗游戏 `index.html`,血条/行动/胜负判定已可用 **教师备课体验任务:** > 备课前,教师必须亲自完成以下操作: > > 1. 打开 `demo-2-pk-battle.html`,实际点一遍「普通攻击、重击、格挡、特技」四个按钮,感受没有动画时的体验——记录「哪里感觉很空洞」 > 2. 打开 `demo-3-animation.html`,同样点一遍四种行动,对比感受差距——这是课堂对比演示的素材 > 3. 用「动画增量需求」保底提示词向 Kimi 提交一次,拿到动画代码片段,在自己的测试文件里跑通——记录可能遇到的报错 > 4. 写一段 Web Audio 代码合成「攻击音效」,在浏览器里验证能正常播放(注意 Chrome 需要用户交互后才能触发音频) > 5. 确认学生电脑音量未被静音,Web Audio 可正常发声 --- ### 4. 教学流程 --- **第一幕:联系 (Connect) — 10分钟** 🔗 *本幕目标:通过无动画 vs 有动画的真实对比,让学生切身感受「游戏感」的差距,建立「视觉反馈是游戏的灵魂」的直觉* **【环节】上节课回顾 (2分钟)** **师:** 上节课我们做了什么?谁来说一下我们的战斗系统现在能做什么? **生:**(预期:有血条、可以攻击、有胜负、有特技) **师:** 对,上节课我们还跑了测试脚本,伤害公式和胜负判定都验证通过了。今天我问你们——你们觉得现在这个游戏,好玩吗?好看吗? **生:**(预期:还行 / 感觉有点无聊 / 就是点按钮数字变化) **师:** 嗯。现在先别回答,我让你们看两个版本——看完再说。 **【环节】对比演示——无动画 vs 有动画 (8分钟)** 【投屏展示 demo-2-pk-battle.html,教师操作】 **师:** 这是我们现在的版本。我点一下「普通攻击」—— 【点击普通攻击,血条数字变化,但角色没有任何动作】 **师:** 发生了什么? **生:**(预期:血量少了 / 没什么感觉 / 就是数字变了) **师:** 对,血条从 100 变成了 85。游戏逻辑是对的。那感觉呢? **生:**(预期:感觉很平淡 / 不知道攻击有没有打出去 / 没什么反应) **师:** 好,这个感受记住。现在看第二个版本。 【切换投屏到 demo-3-animation.html】 **师:** 同样的游戏,我点「普通攻击」—— 【点击普通攻击,角色冲刺向对方,对方受击抖动,音效响起】 **师:** 现在感觉怎么样? **生:**(预期:爽多了!/ 有打击感 / 感觉真的在打架) 【继续演示重击:角色蓄力放大→猛冲,屏幕震动】 【演示格挡:角色后退,护盾闪烁】 【演示特技:粒子效果爆发】 **师:** 这两个游戏,逻辑是完全一样的。血条、伤害、胜负——一模一样。唯一的区别是什么? 【诊断点:学生是否能说出「动画」「视觉反馈」「音效」等关键词】【识别层】 **【分支A】若学生说出「动画」「特效」「声音」:** **师:** 对!动画、音效、视觉反馈。这些加在一起,有一个专门的词——叫做「游戏感(Game Feel)」。什么叫游戏感?就是每次你操作,都有看得见、听得到的反馈——你的动作「生效了」。没有游戏感的游戏,就算逻辑完美,玩起来也像在操作表格。 **【分支B】若学生说「好看多了但说不出为什么」:** **师:** 你说好看多了,我问你——当你点普通攻击的时候,第一个版本你看到了什么? **生:**(预期:数字变了) **师:** 第二个版本呢? **生:**(预期:角色冲过去了、对方抖了) **师:** 对。第一个版本你的操作「发生了」但你看不到。第二个版本你的操作「生效了」,你看得到、感受得到。这种「每次操作都有反馈」的体验,叫「游戏感」。今天我们的任务就是把游戏感加到你们的战斗系统里。 **师:** 今天三件事:第一,给每种行动加动画;第二,加上音效;第三,让特技有独特的视觉标记。加完之后,你的战斗游戏就「活了」——可以参加下节课的班级对战了。 --- **第二幕:建构 (Construct) — 65分钟** 🛠️ --- **【分段一:动画系统——用感觉描述需求】(20分钟)** *本段重点:学会用「感觉语言」而不是技术参数来描述动画;学会写增量需求(只写新增的动画部分,不重写已有战斗逻辑)* **预设误概念:** - 误概念 M3:增量需求要把整个需求文档重写一遍 - 误概念 M4:动画描述必须用技术参数(duration: 200ms) **讲解与演示 (Teach & Demo): (5分钟)** **师:** 我们要给战斗系统加动画。但加动画不是从头重写游戏——我们用「增量需求」的方式,只告诉 AI 「新加什么」,已有的代码不动。 **师:** 有人知道为什么不能重写吗? **生:**(预期:不知道 / 会改坏 / 太麻烦) **师:** 你上节课的战斗逻辑,血条、伤害、胜负——都测试通过了,是吧?如果我现在把整个需求文档重写一遍提交给 AI,AI 很可能会「重新理解」你的战斗逻辑,把你已经调好的伤害公式改掉,或者把你的特技系统换一种方式实现。这叫「误改」。增量需求就是告诉 AI:「已有的代码已经验收通过,你只需要在这个基础上加动画,不要动其他东西。」 **师:** 就像你家装修完了,现在只想加一个书架——你不会让装修工人重新来一遍,你只说「加一个书架,其他不动」。 **师:** 然后——动画要怎么描述?我问你:你觉得「普通攻击」的感觉应该是什么样子的? **生:**(预期:冲过去 / 快速冲向对方 / 用力打一下) **师:** 好,「快速冲向对方」——再具体一点,冲过去之后呢? **生:**(预期:然后回来 / 弹回来) **师:** 对!「快速冲向对方,然后弹回来」——这就是动画描述。不需要说「x偏移100像素,duration 200ms,ease Power2」——你只需要说出感觉,AI 会把感觉翻译成参数。 【投屏展示对比】 ``` ❌ 技术参数描述: 普通攻击:x += 100, duration: 200, ease: 'Power2', yoyo: true ✅ 感觉描述: 普通攻击:攻击方快速冲向对方,然后弹回原位,感觉轻快有力 ``` **师:** 我们来做个小练习——每个人说出四种行动的感觉,不要用技术词汇,就说你脑子里的画面。 【投屏展示四种行动,每个留5秒空白让学生思考】 | 行动 | 你脑子里的画面是什么? | |------|---------------------| | 普通攻击 | ? | | 重击 | ? | | 格挡 | ? | | 受击 | ? | **师:** 说一下,「重击」你觉得是什么感觉? **生:**(预期:很用力冲过去 / 先蓄力然后猛冲 / 会震动) **师:** 「先蓄力然后猛冲」——太好了,这就是完美的感觉描述。AI 看到这个会知道要做两段动画:第一段蓄力(角色变大),第二段冲刺(快速位移)。 **学生实践 (Practice): (10分钟)** 在窗口 A 里,学生用感觉语言写出增量需求,提交给 Kimi,获取动画代码。 > 教师走动观察:谁停下来不动超过2分钟立刻过去,观察他们写的感觉描述是否太技术化(「角色向右移动100px」)还是真的在用感觉语言 **学生写增量需求的结构提示(投屏展示):** ``` 我已有一个用 HTML/JavaScript 写的战斗游戏,战斗逻辑已经验收通过。 现在我要新增动画系统,只描述新增部分,请不要修改已有的战斗逻辑。 普通攻击动画:[你的感觉描述] 重击动画:[你的感觉描述] 格挡动画:[你的感觉描述] 受击动画:[你的感觉描述] 死亡动画:[你的感觉描述] ``` **进度同步 (Checkpoint): (5分钟)** **师:** 谁来分享一下你写的感觉描述?用感觉语言写的举手。 【诊断点:检验学生是否真的用了感觉语言,而不是技术参数】【理解层】 **【分支A】若学生写出了好的感觉描述(「像被闪电劈中一样抖动」):** **师:** 这个描述太棒了!我们来看 AI 怎么翻译—— 【投屏展示 Kimi 返回的参数,对应学生的感觉描述】 **师:** 你说「像被闪电劈中一样抖动」,AI 翻译成了「x 方向快速来回震荡5次,每次10像素,总时长150毫秒」。感觉对吗? **【分支B】若学生的描述还是偏技术(「角色向右移动」):** **师:** 我来问你——你玩游戏里打人,那个「被打」的感觉是什么?能用一个词或一句话描述吗? **生:**(预期:抖了一下 / 像撞墙一样 / 闪了一下) **师:** 对,把这个感觉写进去,比说「向右移动」更准确——AI 更能理解你真正想要的效果。 **【分支C】若学生 AI 返回的动画代码与感觉不符:** **师:** 你看一下动画效果,跟你想的感觉一样吗?哪里不对? **生:**(预期:太慢了 / 感觉不够有力 / 角色跑的方向不对) **师:** 好,现在你就直接告诉 AI:「重击感觉不够震撼,蓄力时间太短了,冲刺速度也不够快,能不能把蓄力时间加长一倍,冲刺速度加快?」——这就是用感觉来迭代。 --- **【分段二:音效系统——描述声音感觉】(20分钟)** *本段重点:用三行代码演示 Web Audio 合成原理;学会用「声音感觉」而不是技术参数描述音效需求;实现五种基础战斗音效* **预设误概念:** - 误概念 M2:音效需要找音频文件,太麻烦了 - 误概念 M4(延伸):描述音效也要用技术参数 **讲解与演示 (Teach & Demo): (5分钟)** **师:** 现在我们加音效。有人觉得加音效很麻烦的举手——要找音频文件、下载、导入…… **生:**(预期:举手 / 点头) **师:** 告诉你们一个秘密——我们不需要任何音频文件。我们用代码「生成」声音。 【投屏展示,教师打开浏览器控制台】 **师:** 这是 Web Audio API——浏览器内置的音频引擎。我现在在控制台里写三行代码,让浏览器发出一个「攻击音效」。 【现场演示,逐行输入并解释】 ```javascript const ctx = new AudioContext(); const osc = ctx.createOscillator(); osc.frequency.value = 300; // 音调——300 是中等音高 osc.type = 'sawtooth'; // 波形——锯齿波比较「粗糙有力」 const gain = ctx.createGain(); gain.gain.value = 0.3; // 音量 osc.connect(gain); gain.connect(ctx.destination); osc.start(); setTimeout(() => osc.stop(), 80); // 只响 80 毫秒 ``` **师:** 听到了吗?这是攻击音效——短促有力,像轻击。全部代码就这几行,不需要任何文件。 **师:** 和动画一样,音效也用感觉来描述。我来问你——「重击」的声音是什么感觉? **生:**(预期:低沉 / 爆炸感 / 震动 / 轰的一声) **师:** 「低沉震撼,像爆炸」——这就是感觉描述。告诉 AI 这个感觉,AI 会帮你调频率、波形、时长。你不需要知道「锯齿波还是方波」——你只需要知道「你要什么感觉」。 【投屏展示感觉→参数对应表】 | 行动 | 声音感觉(你来填) | AI 可能翻译成 | |------|----------------|-------------| | 普通攻击 | 短促有力,像轻拍 | 频率300Hz,锯齿波,80ms | | 重击 | 低沉震撼,像爆炸 | 频率150Hz,锯齿波,150ms | | 格挡 | 硬邦邦,像金属碰撞 | 频率800Hz,方波,50ms | | 受击 | 痛感,短促的「嗷」 | 频率400→150Hz扫频,120ms | | 胜利 | 欢快,像叮当 | 三音符523→659→784Hz,正弦波 | **学生实践 (Practice): (10分钟)** 学生打开窗口 B(独立于战斗游戏),用感觉描述让 Kimi 生成五种音效代码。验证每种音效能正常播放后,再把音效函数添加进战斗游戏的对应行动里。 > 教师走动观察重点: > 1. 学生在描述音效时是否用了感觉语言还是乱写参数 > 2. 音效代码添加进战斗游戏后,有没有整合进「行动触发」时机(不能只是独立的函数,要在攻击时自动调用) **进度同步 (Checkpoint): (5分钟)** **师:** 谁来演示一下?点一个行动,我们听听音效。 【让1-2位学生上来演示战斗,播放音效】 【诊断点:音效是否在正确的时机触发(点攻击时响,而不是游戏开始时就响)】【应用层】 **【分支A】若音效在正确时机触发且效果合理:** **师:** 注意听——每次点攻击有没有声音?每种行动的声音有没有区别? 【让全班听对比,引导学生注意重击和普通攻击的音效差异】 **师:** 好,把这个感觉记住——有音效和没音效,游戏感差距很大。 **【分支B】若音效能响但时机不对(比如每隔一秒自动响):** **师:** 音效响了,但是时机有点问题——应该是点攻击时响,而不是自动响。你的音效函数是在哪里被调用的? **生:**(查代码)……好像放到外面了? **师:** 对,你需要把 `playSound_attack()` 这个函数的调用,放进你处理「普通攻击」按钮点击的那个函数里——告诉 AI:「请把音效调用放在行动触发时,不要自动播放」。 **【分支C】若音效完全没有声音(Chrome 浏览器 AudioContext 未激活):** **师:** 先检查电脑音量,再检查——在 Chrome 里,必须是用户点击页面之后,音频才能播放。你有没有先点一下游戏页面,再点攻击按钮? 【引导学生先点一下页面,激活 AudioContext,然后再试】 --- **【分段三:特技视觉效果完善 + 平衡性调整】(15分钟)** *本段重点:给每个特技加上独特的视觉标记(粒子/颜色/光效),让玩家能感知特技「生效了」;同时微调特技触发概率让对战更平衡* **预设误概念:** - 误概念 M5:特技效果只要触发就行,不需要视觉区分 **讲解与演示 (Teach & Demo): (4分钟)** **师:** 最后一段——特技。你们的特技现在已经有效果了,对吧?但我问你——燃烧特技触发了,你怎么知道它触发了? **生:**(预期:有文字提示 / 看日志 / 对方血量变化快) **师:** 靠文字提示来告诉玩家「特技触发了」——这叫什么?这叫「说给玩家听」。而好的游戏是「让玩家感受到」。 **师:** 每个特技必须有专属的视觉标记——就像每种英雄技能有自己的颜色。我来给你们看几个方向: 【投屏展示特技视觉效果参考】 ``` 🔥 燃烧:目标角色持续冒出橙红色小粒子,向上飘散 🛡 护甲:角色周围出现蓝色光圈,护盾吸收伤害时闪烁 ⚡ 连击:第二次攻击时黄色闪光从角色身上爆发 💉 吸血:攻击时绿色光线从对方身上流向自己 ❄️ 冰冻:对方角色整体变蓝(tint 0x4444ff),出现碎冰粒子 🎯 穿透:攻击线变红色,穿过对方护盾 ``` **师:** 你的游戏里有哪种特技?现在打开需求文档,给你的特技加一条「视觉效果描述」——用感觉语言,告诉 AI 特技触发时玩家应该「看到什么」。 **学生实践 (Practice): (8分钟)** 学生在窗口 A(增量需求)里补充特技视觉效果描述,提交给 Kimi 生成代码;同时,根据上节课测试结果,检查特技触发概率是否合理(可调整概率,让对战更有趣),把最终版战斗游戏跑通。 > 教师走动重点:检查学生的特技视觉效果是否真的有视觉差异,而不是所有特技都做成「同一种颜色的粒子」 **进度同步 (Checkpoint): (3分钟)** **师:** 好,现在所有人试玩一下自己的战斗游戏——从开始到有人胜利,完整走一遍。有动画、有音效、有特技视觉效果的请举手。 【诊断点:完整游戏循环(动画+音效+特技视觉)是否全部正常运行】【应用层】 **【分支A】若学生完整游戏循环正常:** **师:** 很好,你的涂鸦PK已经有游戏感了。下节课的班级对战,就用这个版本。给自己鼓个掌。 **【分支B】若学生动画有但音效没有(或相反):** **师:** 没关系,少一项我们继续加。现在缺的是哪一个?告诉我——动画、音效、特技视觉,哪个没做完? 【针对性引导完成缺失的部分,优先保证动画完整,音效可以只有三种基础音效也算通过】 **【分支C】若学生整个游戏运行出错:** **师:** 现在打开浏览器的控制台(F12),看一下有没有红色的报错信息,把报错信息截图或者复制下来,告诉 AI「我在运行时遇到了这个报错,请帮我定位问题」——这是你们最后一次用 AI 调试,我们在课堂上解决。 --- **第三幕:反思 (Contemplate) — 10分钟** 🤔 **【环节】成果展示 (6分钟)** **师:** 好,时间到。谁愿意来展示一下今天的战斗游戏?要展示三件事:第一,你的角色是谁;第二,你加了什么样的动画;第三,你设计了什么特技的视觉效果。 【邀请 2-3 名学生展示,每人 1.5 分钟】 **师:** 展示的时候,先说你「用感觉描述了什么」,再演示效果——让大家看你的感觉描述和 AI 翻译出来的代码,差距有多大。 【第一位学生展示】 **师:** 你说「重击感觉像被大锤砸到」,AI 做出来的效果,符合你的感觉吗? **生:**(预期:基本符合 / 比我想的还要好 / 有一点不对但我改了) **师:** 好——改了几次才满意? **生:**(预期:两三次) **师:** 两三次迭代就做到满意——这就是「用感觉描述 + 迭代优化」的效率。 **【环节】互评与讨论 (4分钟)** **师:** 谁来给刚才展示的游戏说「一个优点 + 一个改进建议」?要具体说,不能只说「很好看」。 **生:**(预期:动画很流畅,但是音效重击的声音感觉不够震撼) **师:** 好,「不够震撼」——怎么改? **生:**(预期:声音低一点 / 时间长一点 / 加个爆炸效果) **师:** 对,这就是具体的改进建议。今天我们训练的核心能力是什么? **生:**(预期:动画 / 音效 / 特效) **师:** 这些都是工具。背后的能力是——**审美力**:用感觉描述「好不好看、好不好听」,让 AI 把你的感觉变成代码。审美力不是说「画画好看」,是说「你能不能清楚地描述一个体验,并且判断 AI 做出来的是不是你要的」。 --- **第四幕:延续 (Continue) — 5分钟** 🚀 **【环节】抽象总结 (3分钟)** **师:** 今天三件事,我们来总结一下。第一件是什么? **生:**(预期:动画 / 加了动画) **师:** 对,我们加了动画。背后的方法是什么? **生:**(预期:用感觉描述 / 感觉语言) **师:** 对——「用感觉描述需求」。不用技术参数,直接说你脑子里的画面,AI 来翻译。这个能力不只能用在游戏开发里——你想做一个网页、一个动效、一个演示文稿,都可以这样描述:「我想要一种……的感觉」,AI 来实现。 **师:** 第二件事,音效。背后的发现是什么? **生:**(预期:不需要音频文件 / 代码可以直接合成声音) **师:** 对——Web Audio API 用代码合成声音。零文件,浏览器内置。这说明一件事:很多你以为「需要素材」的东西,代码都可以直接生成。 **师:** 第三件事,特技视觉效果。核心原则是什么? **生:**(预期:要让玩家看得见 / 每种特技要有独特的效果) **师:** 对——「让玩家感受到,而不是告诉玩家」。这是所有好游戏的共同原则。 **【环节】下节预告 + 5分钟挑战 (2分钟)** **师:** 下节课——班级大乱斗。你们的战斗游戏会互相对战,不同角色、不同特技。在对战之前,你有机会再调整一次你的特技参数——如果你觉得你的角色太弱,可以偷偷增强一点…… **生:**(预期:笑声 / 期待) **师:** ……但是太强了也不行,因为我会检查公平性。 **师:** 本周的5分钟挑战:给你的一个特技,加一个你自己设计的视觉特效——不用上课说的那些,完全自己想。描述感觉,让 AI 实现,下节课展示。 --- ### 5. AI助教使用指南 **教师演示用提示词(动画增量需求):** ``` 我已有一个用 HTML + JavaScript 写的战斗游戏,代码在下面。 战斗逻辑(血条、行动、伤害、胜负判定)已经验收通过,请不要修改。 现在我要新增动画系统,只描述新增的动画部分: - 普通攻击:攻击方快速冲向对方100像素然后弹回来,感觉轻快有力 - 重击:攻击方先膨胀变大(1.2倍,蓄力感),然后猛冲向对方150像素,对方水平抖动3次 - 格挡:格挡方向后退50像素,同时闪烁两次(半透明/不透明切换,护盾感) - 受击:被击方左右快速抖动(±10像素,3次),同时变红后恢复原色 - 死亡:旋转360度同时缩小到0并淡出,600毫秒内完成 - 胜利:上下弹跳3次(-30像素/次,200毫秒/次) 请只输出新增的动画相关代码,以及在哪里插入。不要改动现有代码结构。 ``` **教师演示用提示词(音效合成,窗口 B):** ``` 我要用 Web Audio API 合成战斗游戏音效,全部在 HTML 里实现,不需要任何音频文件。 请帮我写以下音效函数(每个独立的 function),音效感觉描述如下: 1. playSound_attack():短促有力,像轻击金属,80毫秒 2. playSound_heavy():低沉震撼,像远处爆炸,有一点回响感,150毫秒 3. playSound_block():清脆硬邦邦,像剑挡住了另一把剑,50毫秒 4. playSound_hit():短促的痛感,像「嗷」一声,120毫秒 5. playSound_win():欢快的三音符上升,像「叮叮叮」,音调一个比一个高 每个函数调用时直接播放,不需要预加载。请输出可以直接放进 HTML 的完整代码片段。 ``` **学生保底提示词(动画增量需求,窗口 A):** ``` 我已有一个用 HTML/JavaScript 写的战斗游戏(代码如下)。 战斗逻辑已验收,请不要修改已有代码。 在此基础上新增动画: - 普通攻击:角色冲出去然后弹回 - 重击:先蓄力放大再猛冲,对方抖动 - 格挡:角色后退并闪烁 - 受击:角色抖动并变红 - 死亡:旋转消失 请只添加动画相关代码,告诉我在哪里插入。 ``` **学生保底提示词(音效合成,窗口 B):** ``` 请帮我用 Web Audio API 合成以下游戏音效,写成 HTML 代码片段,每个音效一个函数: 1. 普通攻击:短促有力的金属碰撞声 2. 重击:低沉震撼的爆炸声 3. 格挡:清脆的金属阻挡声 4. 受击:短促的痛苦音 5. 胜利:三音符上升的欢快音 函数名分别为 playSound_attack、playSound_heavy、playSound_block、playSound_hit、playSound_win。 调用时直接播放,不需要任何音频文件。 ``` **进阶提示词(特技粒子效果):** ``` 我的战斗游戏有一个「燃烧」特技,触发时目标会持续受到灼烧伤害。 请帮我用 Canvas 2D API(不用任何外部库)实现: - 燃烧状态下,目标角色周围持续出现橙红色小粒子 - 粒子从角色身体向上飘散,透明度随时间降低到0后消失 - 燃烧持续3秒,期间粒子效果一直在 请只给我新增的粒子系统代码,以及调用时机说明。 ``` --- ### 6. 教师指南 **本课技术备注:** **关于 Canvas 动画实现方式(不用 Phaser 的情况下):** 本课的战斗游戏基于 HTML Canvas 2D 直接绘制(无 Phaser),动画通过 `requestAnimationFrame` 循环和时间差(deltaTime)驱动。动画「缓动感」来自 lerp(线性插值):每帧把当前位置向目标位置靠近一小步,产生「减速停下」的感觉。AI 生成的代码通常会用 `let t = 0; t += deltaTime / duration` 的方式控制进度,0到1之间变化,再套上缓动函数(如 `1 - (1-t)^3`)产生弹性效果。 **关于 Web Audio API 的自动播放限制:** Chrome/Edge 要求页面必须有用户交互(点击/键盘输入)后,才允许 `AudioContext` 播放声音。如果游戏一打开就尝试播放,会被浏览器拦截(报错:`AudioContext was not allowed to start`)。解决方案:把第一个 `AudioContext` 的创建放在用户点击按钮之后,或者用 `ctx.resume()` 在点击时激活。AI 生成的代码不一定会处理这个问题,需要教师在课堂提醒。 **关于增量需求的上下文传递:** 让学生在「增量需求提示词」里把整个现有代码粘贴进去,Kimi 才能根据现有代码结构插入新代码。如果不提供现有代码,Kimi 会自己猜代码结构,生成的插入位置可能不对。提醒学生:「把你的战斗游戏代码全选复制,粘贴到提示词末尾」。 **关于特技粒子效果的性能:** 粒子效果如果每帧创建大量 DOM 元素,会导致游戏卡顿。告诉学生用 Canvas 绘制粒子(在 `requestAnimationFrame` 里画圆点),不要让 AI 创建 `
` 元素来做粒子。如果学生的游戏明显卡顿,检查是否有粒子数组无限增长的问题(每帧加粒子但不清除),引导学生告诉 AI「粒子消失后从数组里删除」。 **常见问题 FAQ:** | 问题 | 应对 | |------|------| | 「动画代码加进去之后,血条不显示了」 | 很可能是 Canvas `clearRect` 的调用顺序被改了,告诉 AI:「加了动画代码后血条不显示,请检查 clearRect 和绘制顺序是否被修改」 | | 「音效能响但是每次攻击响很多次」 | `playSound_attack` 函数被错误地放在了 `requestAnimationFrame` 里,每帧都在调用;告诉 AI「音效每次行动只应该播放一次」 | | 「死亡动画结束后角色还留在屏幕上」 | 死亡动画只改了透明度,没有在动画结束后将角色标记为「已死亡」并停止绘制;引导学生告诉 AI「动画结束后停止绘制该角色」 | | 「特技粒子效果触发一次后就一直在了」 | 粒子系统的「存活时间」逻辑没有实现,粒子永远不消失;告诉 AI「每个粒子有3秒存活时间,时间到了就从数组里移除」 | | 「我的重击蓄力动画太慢了游戏变拖沓」 | 这是审美判断问题,直接让学生告诉 AI:「蓄力时间改成 150ms,冲刺时间改成 80ms,感觉更爽快」 | | 「Chrome 没有声音」 | 先确认系统音量;再确认是否先点击了游戏页面;最后检查 `AudioContext` 是否在按钮点击后创建 | **课堂风险预案:** - **如果 Kimi 返回的代码加进去运行报错:** 让学生把报错信息复制给 Kimi,提示词格式:「我按你说的把代码加进去了,运行时出现了这个报错:[报错信息],原来的代码是 [原代码],请帮我找到原因并给出修正后的代码」 - **如果学生进度差异过大(有人全部做完有人还没做动画):** 做完的学生进入拓展任务(给特技加粒子效果 + 调平衡性);做到一半的学生优先完成动画,音效用保底提示词一步到位 - **如果整体时间不够(25分钟建构还剩两段没做完):** 合并分段二和分段三,音效只做三种基础音效(攻击/受击/胜利),特技视觉效果作为课后挑战 --- ### 7. 5分钟日常AI挑战 **本周挑战:** 给你的一个特技,设计一个全新的视觉特效 **挑战说明:** 选你游戏里你最喜欢的一个特技,想象它触发时应该「看起来像什么」——可以是粒子爆炸、颜色变化、屏幕震动、时间静止特效……只要用感觉语言描述出来,告诉 AI 实现。要求:这个特效必须和课上做的不一样,完全是你自己的设计。 **下节课分享:** 下周课上选 2-3 位同学展示特技特效挑战成果,说明自己是怎么描述感觉的,AI 实现了几轮才满意。 --- ### 8. 拓展任务 **拓展一(推荐):屏幕震动特效** 重击时,不只是角色抖动——整个游戏画布轻微震动一下(Canvas 偏移 ±5 像素,持续 200ms)。这种效果叫「屏幕震动(Screen Shake)」,是格斗游戏的经典手法。用感觉描述让 AI 实现:「重击时整个画面抖一下,像相机被猛地推了一把」。 **拓展二(挑战):行动预判音效** 在角色攻击「蓄力」阶段播放一个低频「嗡——」的充能音效,攻击命中时再播放冲击音效——两段音效组合,制造出「蓄力→爆发」的完整听觉体验。提示:需要两个 Web Audio 函数,第一个在蓄力开始时调用,第二个在命中时调用,注意时机控制。 --- ### 附:本课核心教学框架速查 **四幕时间分配(合计 90 分钟):** | 幕 | 内容 | 时长 | |----|------|------| | 联系 Connect | 对比演示无动画 vs 有动画,引出「游戏感」 | 10 分钟 | | 建构 · 分段一 | 感觉语言描述动画,写增量需求 | 20 分钟 | | 建构 · 分段二 | 用代码合成音效,整合进战斗行动 | 20 分钟 | | 建构 · 分段三 | 特技视觉标记完善 + 平衡性微调 | 15 分钟 | | 反思 Contemplate | 成果展示 + 感觉描述回顾 + 互评 | 10 分钟 | | 延续 Continue | 抽象总结三件事 + 预告班级对战 + 挑战发布 | 5 分钟 | **本课核心能力训练路径:** ``` 审美力路径: 无动画体验(识别层) → 用感觉描述动画/音效需求(理解层) → 对比 AI 输出和自己预期,定位差距(应用层) → 精准迭代修改,达到满意(迁移层) 提问力路径: 理解增量需求的必要性(识别层) → 只写新增部分的提示词,不重写全局(理解层) → 在已有代码基础上定向追加功能(应用层) ``` **关键词速查(下课前可口头检查学生是否能解释):** - 游戏感(Game Feel):每次操作都有视觉/听觉反馈,让玩家感受到行动生效 - 增量需求:在已验收代码基础上只描述新增部分,避免 AI 误改 - Web Audio API:浏览器内置音频引擎,用代码合成声音,无需音频文件 - 感觉语言:用描述体验和画面感的词汇提需求,而非技术参数