摸鱼的时候找到一个微信小游戏的skill,说是能通过skill实现微信小游戏开发的基本链路,感觉用起来还不错,起码不用在微信开发者工具预览 和 AI中不停切换看预览效果
workbuddy使用文档 微信小游戏助手(WorkBuddy 版本) | 微信游戏内容服务平台文档
1.游戏生成前准备工作
1.1 通过 AI 或素材网站准备好基本素材
1.2 明确描述信息
在 WorkBuddy 中编写好当前游戏的生成需求,尽可能在首次对话中明确游戏类型、游戏界面、游戏玩法、后续的功能预留位置以及游戏整体框架。以便于插件能够在 UI 层次上做好预留,避免后续因为新增/修改功能导致整体 UI 大变动,从而引发一些不必要的 Bug。
帮我生成一个2D类射击游戏,
游戏的界面有以下三个
一:游戏首页,主界面中有三个按钮 分别是
闯关模式(点击后进入关卡选择弹窗,默认是第一关,通关第一关后解锁第二关,以此类推。一共10关,每关中默认都是只有10波敌人,每一关的敌人的血量 会根据当前关卡*敌人的基础血量,)
无尽模式(点击后进入直接开始游戏,无尽模式中 波数会一直增加,直到玩家血量为0,或者主动结束游戏)
属性升级(点击后进入属性升级弹窗,弹窗中通过5个tab【通用属性,主炮台,火焰炮台,寒冰炮台,毒雾炮台】)
通用属性:
减少敌人血量:每级减少0.5%,最多减少30%。对boss仅剩生效50%,每次升级所需金币:1000,每一级所需金币+500
减少升级经验:每级减少10,最多减少400,但是升级所需经验最低不少于100,每次升级所需金币:200,每一级所需金币+50
主炮台:
增加攻击力:每级增加10,每次升级所需金币:100,每一级所需金币+20
增加攻速:每级增加0.5%,每次升级所需金币:100,每一级所需金币+20
增加吸血:每级增加0.1%,最多增加10%。,每次升级所需金币:1000,每一级所需金币+200
火焰炮台:
增加攻击力:每级增加10。每次升级所需金币:200,每一级所需金币+50
增加攻速:每级增加0.5%。每次升级所需金币:200,每一级所需金币+50
增加灼烧伤害:每级增加1。每次升级所需金币:200,每一级所需金币+50
寒冰炮台:
增加攻击力:每级增加10。每次升级所需金币:200,每一级所需金币+50
增加攻速:每级增加0.5%。每次升级所需金币:200,每一级所需金币+50
增加减速效果:每级增加0.1%减速效果,最多增加20%。每次升级所需金币:200,每一级所需金币+50
毒雾炮台:
增加攻击力:每级增加10。每次升级所需金币:200,每一级所需金币+50
增加攻速:每级增加0.5%。每次升级所需金币:200,每一级所需金币+50
增加毒雾范围:每级增加毒雾范围1px,最多增加50px。每次升级所需金币:200,每一级所需金币+50
增加毒雾伤害:每级增加1。每次升级所需金币:200,每一级所需金币+50
二: 在选择了闯关模式下的指定关卡/进入无尽模式时,跳转到 游戏进行中界面
界面结构如下:
1. 游戏最上面 80px是 游戏的HUD部分展示结构严格按照以下排版
当前的攻击力:x 无尽/关卡x 第x波 暂停ICON
攻速:x , 剩余敌人:x 金币数量:x
当前HP:(500/500) ,
当前经验:0/100 LV1 ,
注意这里的HP和经验 需要用一个矩形进度条来展示,并且矩形圆角为5px
要注意的是 这里的HUD结构是有一个背景层,后续敌人出现的位置只会是在HUD+10px的位置出现 而不是直接在屏幕的最上方出现,这样的感官会更好一些,同理子弹也不会在HUD的背景层里显示
2. 剩余的位置就是敌人和炮台的位置,炮台在屏幕最下方,占据100px左右其中70px是炮台的位置剩余20-30是边界线的位置
三:游戏的结束界面
当玩家通关闯关模式时,,显示 游戏通关弹窗,此时 弹窗的内容如下
下一关
返回首页
无尽模式下HP为0 时,显示 游戏结束弹窗,此时 弹窗的内容如下
升级炮台
返回首页
游戏核心框架如下:
1. 屏幕最下方是一个炮台
2. 炮台上方会有一个边界,距离炮台50px左右。如果后续敌人触碰到这个边界,敌人就会死亡,并且 扣除当前炮台的血量,扣除的血量以敌人血量的1%,
3. 敌人的类型有以下几种
肉盾型:血量:300 攻击力:0 攻击范围:0px 移速:慢(25) 类型:普通类型。
速度型:血量:100 攻击力:0 攻击范围:0px 移速:快(75) 类型:普通类型。
均衡型:血量:150 攻击力:0 攻击范围:0px 移速:中等(50) 类型:普通类型。
攻击型:血量:100 攻击力:2 攻击范围:100px 移速:慢(20) 类型:普通类型。
首领型:血量:100 攻击力:2 攻击范围:500px 移速:慢(20) 类型:Boss类型。
(当攻击力和攻击范围=0的时候 不会主动攻击,唯一的攻击方式就是触碰边界,类似自爆兵)
(当移速=0时,不会移动)
在无尽模式中 所有敌人的血量计算有一个增长公式
boss类型 = 基础血量 * 当前波次 * 当前玩家等级
普通类型 = 基础血量 + 当前波次 * 当前玩家等级
4. 炮台初始属性如下
攻击=50
火焰:每秒持续灼烧敌人,
冰冻:使敌人移速减慢20%,
毒雾:敌人会在每次被攻击后向周围50*50圆形范围内 喷散毒雾导致其他敌人也触发中毒,中毒时每一秒扣除1滴血
初始攻速=1秒
炮台本身没有血量,生命=500是全局的血量 可以视为是玩家的血量,具体的游戏结果逻辑在下文有提及
5. 当炮台升级时会有以下技能三选一,
攻速增加(30%),描述:增加主炮台30%攻速
攻击增加(30%),描述:增加主炮台30%攻击
攻击吸血(以当前攻击的10%),描述:主炮台每次攻击时,回复10%伤害的生命
子弹+1,但是所有子弹伤害-15%,描述:多一颗子弹,但攻击力降低15%,
子弹穿透+1,描述:子弹可穿透一个额外敌人
激活火焰属性炮台,炮台拥有主炮台30%的攻击属性,最多获取一个,描述:获得火焰炮台,攻击力为主炮台当前的30%'
激活冰冻属性炮台,炮台拥有主炮台30%的攻击属性,最多获取一个,描述:获得冰冻炮台,攻击力为主炮台当前的30%'
激活毒雾属性炮台,炮台拥有主炮台30%的攻击属性,最多获取一个,描述:获得毒素炮台,攻击力为主炮台当前的30%'
所有元素炮台攻速增加(30%),描述:元素炮台攻速提升30%
所有元素炮台攻击增加(30%),描述:元素炮台攻击力提升30%
所有元素炮台子弹+1,但是所有子弹伤害-15%,描述:元素炮台多一颗子弹
所有元素炮台子弹穿透+1,描述:元素子弹穿透+1
注意这里子弹+1 要确保是在第一颗子弹发射出去后,紧接着发射+1的那颗子弹,并不是并发子弹
6. 游戏波数:每一波的敌人是上一波的1.2倍,初始波数的敌人为15。并且在无尽模式中,每当5的倍数波次时,会额外出现一个boss。
8. 游戏成功逻辑:当炮台血量不等于0 并且消灭 所有波数的敌人后通关当前关卡,
9. 游戏失败逻辑:当炮台血量等于0
10. 玩家升级逻辑:初始经验=0,每升一级需要100经验值,每消灭一个敌人就获取25经验值,每一级所需经验+25 最多需要500升级经验,最高100级
11. 金币掉落逻辑:
boss类型 = 死亡时掉落 200 * 金币x ,金币x:当前波数/5 取整数值(最小值为1,如第五波,x就是1,第十波x就是2
普通类型 = 死亡时掉落 50金币
1.3 等 AI 分析完后,与 AI 确认细节
将内容给到 AI,让它先分析具体需求,不确定的点先抛出来,等待我们确认后再继续生成小游戏。这样会大大减少它自主发挥的情况,也能大大增加本次生成的小游戏的可控性。
等待完成编译后就有了一个初版的效果,但是这里点击后没有反应。我们继续告诉 AI,并且希望 AI 能够调整 UI 大小以自适应屏幕,而不是写死一个固定的值,否则会在一些大屏手机上导致整体 UI 太小,这不符合我们的预期。
2.对游戏进行 Bug 修复并优化小游戏细节
等待 AI 跑完后,能确保在绝大部分机型的 UI 都能保持相对一致的比例。
2.1 子弹逻辑调整以及子弹的弹道计算
但是这里的子弹逻辑,它现在发射的子弹都是未经过旋转的素材,子弹都是同一个方向的,以及边界线逻辑不太合理,那就继续针对这两个方面让 AI 做出调整。另外,这里能通过插件内置的网格线能力来计算当前道具、元素等 UI 的布局以及具体需要多少像素。
发现以下问题:
1. 这里子弹素材的方向不是固定的,要根据当前的主炮台的位置 适当旋转子弹的角度,并且子弹应该自动攻击最近的敌人 不是垂直向上的
2. 这里子弹默认是不穿透敌人的 只会攻击到一个敌人,3. 这里如果没有获取元素炮台的时候 不应该在升级的时候出现元素炮台相关的增幅技能, 只会出现选择元素炮台的技能
3 这里边界线向下移动50px,并且多个炮台的水平并排排列
然后就是下一轮对话 让AI做出调整 发现还是不对
不对 这里子弹只在发射的时候会根据敌人位置发射出去,如果途中敌人死亡 子弹位置不会做出改变,另外这里,子弹不穿透逻辑未生效,击中第一个敌人后 依旧往后面穿透 然后子弹的元素图 朝向依旧不对,还是固定的方向,应该是根据敌人位置做出指定角度的旋转 另外这里如果是冰冻的debuff 在敌人的状态栏上应该是蓝色,火焰是红色,剧毒是绿色 你先理解这里的需求 和我确认后再进行修改代码
2.2 金币数据持久化
发现每次刷新后就会把我们辛辛苦苦攒下来的金币都重置了。那肯定不行,得改成持久化。于是 AI 进行调整。
继续做出修改,越详细的描述越能让 AI 明确改动。改完后这里就正常了很多。然后再继续打磨一些细节,包括但不限于:子弹的效果、炮台给敌人挂载 Debuff 效果展示、敌人 HP 展示、玩家 HP 扣除展示。
2.3 毒雾特性未生效
然后在实际游戏中发现,毒雾炮台的扩散特性没有生效,可能是这里 AI 漏掉了实现。那我们就再针对这个特性,让 AI 重新实现这个能力。
prop_ripple_poison_skull_150x150.png 发现在毒雾炮台的 扩散特性 你没有支持到,
这个扩散是指,每一次毒雾炮台攻击的时候 会对周边50px*50px 圆形范围的敌人都造成一个中毒的效果(每秒钟扣1滴血,每次)(这里范围是能通过升级扩大的)每一次攻击就会有一个范围中毒效果并且这个中毒的效果持续3秒,你先理解这个特性
给 AI 信息后,做出了毒雾效果的第一版,但是发现其实只有效果没有伤害。那就继续把问题抛给AI,让它继续修复已知的问题。修复完之后,伤害和叠加伤害也有了,但是伤害计算还是不太正确——这里希望的是每一次攻击就叠加伤害,而不是现在这种第一层伤害持续三秒、然后再第二层伤害持续三秒的方式。然后又让 AI 继续修改。
最后完美实现了毒雾的扩散效果。
3.使用真机调试
通过小程序申请正式的小游戏 AppID,并且在「管理 - 开发管理 - 小程序代码上传」里生成当前 AppID 的上传密钥。
然后在微信小游戏助手中配置对应的 AppID 和密钥,
然后再次点击真机预览,等待代码上传到微信公众平台。
就能通过开发者账号/小游戏绑定的微信账号扫码,使用手机进行调试了。确认真机调试后的效果符合预期之后。通过上传按钮吧
代码进行上传,等待上传成功后,就能在微信公众平台上的「版本管理」里看到本次填写的版本号以及备注。后续就是代码提交审核阶段,等待审核通过后就能发布正式的版本了。
4. 将 game.js 中不同模块进行拆分
这一步并不是必须的,整个项目直接通过 game.js 完全能够流畅运行。
但是考虑后续不同模块之间的迭代(炮台/元素炮台、技能、敌人、关卡、各种素材),后续新增/修改就直接针对某一个模块,让 AI 分析单一文件内容即可,就能大幅度减少上下文,减少 Token 的消耗。那就可以试着让 AI 分析并且拆分对应的模块。
整个 game.js 共 1421 行,可拆分为 10 个模块,按职责清晰分层:
| 模块 | 文件 | 行数 | 职责 |
|---|---|---|---|
| 配置 | js/config.js | ~115 | CONFIG, SKILL_POOL, UPGRADE_TABS |
| 画布 | js/canvas.js | ~45 | canvas, ctx, 缩放工具, 布局参数 |
| 资源 | js/assets.js | ~20 | 图片预加载 |
| 存档 | js/save.js | ~40 | loadSave, saveSave |
| 状态 | js/state.js | ~35 | 全局状态对象 G |
| UI | js/ui.js | ~90 | 按钮, 进度条, 圆角矩形, 碰撞检测 |
| 玩家 | js/player.js | ~115 | 初始化, 属性计算, 技能系统 |
| 战斗 | js/combat.js | ~290 | 生怪, 射击, 碰撞, 元素效果 |
| 渲染 | js/renderer.js | ~380 | 所有页面渲染 + HUD + debuff图标 |
| 输入 | js/input.js | ~90 | 触摸事件, 点击路由 |
| 入口 | game.js | ~22 | require + gameLoop |
但是也并不是拆分越细越好,太过细分会导致如果改动稍大就要额外读取所有有关联的文件,反而会导致 Token 消耗加快。等待 AI 拆分完后再次编译项目,也能完美运行~
5. 总结
感觉整体用下来对话效率还行,除了几轮对话没和AI确认实现方案,出现了偏差。其他时候都能很好的理解需求点,而且也不用理解项目的代码。能够更好的上手,而且对于一些游戏上的轨迹运动。弹道处理。都能正确处理,代码也能直接上传到微信公众平台上。
感觉通过AI生成代码不是它的亮点 主要是能直接把代码发布到 微信公众平台,可惜就是没有提交代码审核。以及发布正式版本的一个流程。否则就就能实现基本流程都通过skill跑通。整体消耗的 token 也不会很高。如果能减少一些不必要的对话,以及优化上下文的话,能以更少的 token 去完成整个项目