first commit
This commit is contained in:
@@ -0,0 +1,277 @@
|
||||
# 需求文档:坦克大作战(微信小游戏版)
|
||||
|
||||
## 引言
|
||||
|
||||
《坦克大作战》是一款面向微信小游戏平台的经典坦克对战休闲游戏,目标用户为25-40岁怀旧玩家及泛休闲用户。游戏核心卖点为"单手操作还原FC手感 + 微信好友排行榜/对战"。技术栈采用 Cocos Creator + 微信小游戏云托管。
|
||||
|
||||
游戏核心循环为单局3-5分钟的快节奏体验:玩家需保护基地不被敌方坦克摧毁,击毁所有刷新的敌方坦克,通过拾取道具升级火力和辅助通关,最终根据击杀数、通关时间、基地血量计算得分并上传排行榜。
|
||||
|
||||
---
|
||||
|
||||
## 需求
|
||||
|
||||
### 需求 1:游戏基础框架与场景管理
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望游戏能够流畅加载并在不同场景间平滑切换,以便获得良好的游戏体验。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家打开小游戏 THEN 系统 SHALL 展示加载界面并在3秒内完成资源加载,进入主菜单场景。
|
||||
2. WHEN 资源加载完成 THEN 系统 SHALL 支持以下场景的管理与切换:主菜单、游戏关卡、结算界面、排行榜界面。
|
||||
3. WHEN 玩家在任意场景中操作 THEN 系统 SHALL 保持稳定的60FPS帧率(目标值),避免明显卡顿。
|
||||
4. WHEN 游戏运行时 THEN 系统 SHALL 使用对象池技术管理子弹、爆炸特效等高频创建/销毁的对象,避免内存抖动。
|
||||
5. IF 设备性能较低 THEN 系统 SHALL 自动降级渲染效果(如减少粒子特效),保证基本流畅度。
|
||||
|
||||
---
|
||||
|
||||
### 需求 2:地图与地形系统
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望游戏拥有经典的砖块、钢铁、河流、森林等地形元素,以便体验丰富的战术策略。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 关卡加载时 THEN 系统 SHALL 基于13×21的网格(13行×21列)生成俯视2D地图,横屏布局确保在手机上视野宽阔清晰。
|
||||
2. WHEN 地图中存在**砖块**地形 THEN 系统 SHALL 允许子弹击碎砖块(Lv3子弹可一次击碎更大范围),砖块被击碎后变为可通行区域。
|
||||
3. WHEN 地图中存在**钢铁**地形 THEN 系统 SHALL 阻挡普通子弹(Lv1/Lv2),仅允许Lv3(破钢)子弹摧毁钢铁墙。
|
||||
4. WHEN 地图中存在**河流**地形 THEN 系统 SHALL 阻止坦克通行但允许子弹飞越河流。
|
||||
5. WHEN 地图中存在**森林**地形 THEN 系统 SHALL 允许坦克和子弹通过,但森林覆盖在坦克上方(遮挡视觉)。
|
||||
6. WHEN 地图加载时 THEN 系统 SHALL 在地图底部中央放置玩家基地(老鹰图标),基地周围默认有砖块围墙保护。
|
||||
7. WHEN 关卡数据加载时 THEN 系统 SHALL 支持从预设的关卡配置数据中读取地图布局(支持未来扩展自定义关卡)。
|
||||
|
||||
---
|
||||
|
||||
### 需求 3:玩家坦克操控系统
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望通过虚拟摇杆和发射按钮操控坦克,以便在手机上获得流畅的操作体验。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 游戏进入战斗场景 THEN 系统 SHALL 在屏幕左下角显示虚拟摇杆(控制上下左右四方向移动),右下角显示发射按钮。
|
||||
2. WHEN 玩家拖动虚拟摇杆 THEN 系统 SHALL 控制坦克朝对应方向移动,坦克炮管朝向与移动方向一致。
|
||||
3. WHEN 玩家点击发射按钮 THEN 系统 SHALL 从坦克炮管方向发射一颗子弹。
|
||||
4. IF 玩家坦克火力等级为Lv1 THEN 系统 SHALL 限制同屏最多1颗玩家子弹(单发模式)。
|
||||
5. IF 玩家坦克火力等级为Lv2 THEN 系统 SHALL 允许快速连射(同屏最多2颗子弹,射速提升)。
|
||||
6. IF 玩家坦克火力等级为Lv3 THEN 系统 SHALL 允许连发(同屏最多2颗子弹)且子弹具备破钢能力。
|
||||
7. WHEN 玩家坦克被敌方子弹击中或与敌方坦克碰撞 THEN 系统 SHALL 判定玩家坦克被摧毁,扣除一条生命,并在出生点重生(默认3条生命)。
|
||||
8. WHEN 玩家生命数降为0 THEN 系统 SHALL 触发游戏失败流程(可选择广告复活或结算)。
|
||||
|
||||
---
|
||||
|
||||
### 需求 4:敌方坦克AI系统
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望敌方坦克具有不同类型和智能行为,以便获得有挑战性的游戏体验。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 关卡开始时 THEN 系统 SHALL 从地图顶部的预设出生点依次刷新敌方坦克,每关总计约20辆。
|
||||
2. WHEN 敌方坦克刷新时 THEN 系统 SHALL 根据关卡配置生成以下4种类型之一:普通坦克(标准速度/血量)、快速坦克(高速低血量)、重甲坦克(低速需2-4次命中)、精英坦克/BOSS(高血量+智能AI)。
|
||||
3. WHEN 敌方坦克处于巡逻状态 THEN 系统 SHALL 控制其沿随机方向移动并定时发射子弹。
|
||||
4. WHEN 敌方坦克发现通往基地的路径 THEN 系统 SHALL 切换至追击状态,优先向基地方向移动。
|
||||
5. IF 关卡编号 ≥ 10 THEN 敌方坦克AI SHALL 具备"绕路偷家"能力,尝试绕过障碍物包抄基地。
|
||||
6. IF 关卡编号 ≥ 15 THEN 敌方坦克AI SHALL 具备"集火基地"能力,多辆坦克协同攻击基地方向。
|
||||
7. WHEN 敌方坦克AI进行寻路时 THEN 系统 SHALL 采用简单的A*或方向权重算法,确保在微信小游戏环境下性能可控。
|
||||
8. WHEN 玩家子弹与敌方子弹碰撞 THEN 系统 SHALL 使双方子弹同时抵消消失。
|
||||
|
||||
---
|
||||
|
||||
### 需求 5:道具系统
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望在战斗中拾取各种道具来增强自身能力,以便更好地通关。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家击毁特定标记的敌方坦克 THEN 系统 SHALL 在地图随机位置生成一个道具,道具存在时间为15秒(闪烁提示后消失)。
|
||||
2. WHEN 玩家坦克触碰**星星**道具 THEN 系统 SHALL 提升玩家火力等级(Lv1→Lv2→Lv3,已满级则无额外效果)。
|
||||
3. WHEN 玩家坦克触碰**时钟**道具 THEN 系统 SHALL 冻结全屏所有敌方坦克10秒(敌方坦克停止移动和射击)。
|
||||
4. WHEN 玩家坦克触碰**炸弹**道具 THEN 系统 SHALL 立即摧毁当前屏幕上所有可见的敌方坦克。
|
||||
5. WHEN 玩家坦克触碰**钢盔**道具 THEN 系统 SHALL 使玩家坦克进入无敌状态(持续15秒),期间闪烁护盾特效。
|
||||
6. WHEN 玩家坦克触碰**铲子**道具 THEN 系统 SHALL 将基地周围的砖块围墙临时替换为钢铁墙(持续20秒后恢复)。
|
||||
7. WHEN 玩家坦克触碰**坦克(+1)**道具 THEN 系统 SHALL 增加玩家一条生命。
|
||||
8. WHEN 道具掉落时 THEN 系统 SHALL 根据当前关卡编号调整掉落概率(关卡越高,星星掉落率越低,增加挑战性)。
|
||||
|
||||
---
|
||||
|
||||
### 需求 6:基地防守与胜负判定
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望有明确的胜负条件,以便清楚了解每局游戏的目标。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 基地被任意子弹(含己方误伤)击中 THEN 系统 SHALL 判定基地被摧毁,立即触发游戏失败(Game Over)。
|
||||
2. WHEN 玩家击毁本关所有敌方坦克(约20辆)且基地未被摧毁 THEN 系统 SHALL 判定本关胜利,进入结算界面。
|
||||
3. WHEN 玩家生命数降为0且无复活机会 THEN 系统 SHALL 判定游戏失败,进入结算界面。
|
||||
4. WHEN 进入结算界面 THEN 系统 SHALL 展示本局得分(根据击杀数、通关时间、基地存活状态综合计算)、击杀各类型坦克的统计数据。
|
||||
|
||||
---
|
||||
|
||||
### 需求 7:关卡系统与难度曲线
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望游戏关卡由易到难逐步递进,以便获得持续的挑战感和成就感。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家首次进入游戏 THEN 系统 SHALL 从第1关开始,前3关作为教学关(地形开阔、敌人慢速、提示操作方法)。
|
||||
2. WHEN 玩家到达第5关 THEN 系统 SHALL 引入河流地形,考验玩家走位能力。
|
||||
3. WHEN 玩家到达第10关 THEN 系统 SHALL 引入重甲坦克,玩家必须升级至Lv2以上火力才能有效击破。
|
||||
4. WHEN 玩家到达第20关 THEN 系统 SHALL 生成BOSS关(巨型坦克),需配合道具策略击杀。
|
||||
5. WHEN 玩家通过最后一关 THEN 系统 SHALL 循环回到第1关但整体难度提升(敌人速度/数量增加),实现无限关卡循环。
|
||||
6. WHEN 关卡编号增加时 THEN 系统 SHALL 逐步提升敌方AI智能程度(从直线冲锋→绕路偷家→集火基地)。
|
||||
7. WHEN 关卡编号增加时 THEN 系统 SHALL 逐步降低星星道具掉落率,提升游戏挑战性。
|
||||
|
||||
---
|
||||
|
||||
### 需求 8:游戏模式
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望有多种游戏模式可选,以便获得不同的游戏体验。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家在主菜单选择"经典模式" THEN 系统 SHALL 进入无限关卡循环模式,玩家逐关挑战并冲击好友排行榜。
|
||||
2. WHEN 玩家在主菜单选择"无尽模式" THEN 系统 SHALL 进入无限波次敌人模式,比拼最高击杀数(首次需观看广告解锁)。
|
||||
3. WHEN 玩家在主菜单选择"双人对战" THEN 系统 SHALL 通过微信邀请好友进行1v1实时对战(阵地破坏模式),双方各拥有1个基地,率先摧毁对方基地的一方获胜。
|
||||
4. IF 玩家选择双人对战模式 THEN 系统 SHALL 提供简单的房间匹配机制(创建房间/加入房间),通过微信社交关系链邀请好友。
|
||||
5. WHEN 双人对战开始时 THEN 系统 SHALL 生成对称式对战地图,双方各拥有1个基地,分别位于地图两端。
|
||||
6. WHEN 任一方基地被摧毁 THEN 系统 SHALL 判定该方失败,对战立即结束并进入结算界面。对战不设时间限制,唯一的胜利条件为摧毁对方基地。
|
||||
7. WHEN 玩家在双人对战中被击毁 THEN 系统 SHALL 在己方基地附近自动重生(无生命数限制),重生间隔为3秒。
|
||||
8. WHEN 双人对战结算时 THEN 系统 SHALL 展示双方基地HP、击杀数、死亡数、阵地伤害等数据。
|
||||
9. IF 玩家在双人对战中断线 THEN 系统 SHALL 尝试自动重连(最多5次),超时未重连则判定对方获胜。
|
||||
|
||||
---
|
||||
|
||||
### 需求 9:微信社交与排行榜系统
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望能看到微信好友的排名并与他们互动,以便增加游戏的社交乐趣和竞争动力。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家进入排行榜界面 THEN 系统 SHALL 通过微信开放数据域展示好友排名(按最高通关关卡/最高得分排序)。
|
||||
2. WHEN 玩家通关后 THEN 系统 SHALL 自动将得分上传至微信云数据库,更新排行榜数据。
|
||||
3. WHEN 玩家通关后 THEN 系统 SHALL 提供"挑战书"功能,生成包含"我通关了第X关,你敢挑战吗?"文案的分享卡片(带小程序码),可分享到群/朋友圈。
|
||||
4. WHEN 玩家卡关时 THEN 系统 SHALL 提供"助战"功能,分享给好友后好友点击可为玩家发送"炸弹"道具援助。
|
||||
5. WHEN 玩家本局得分超过好友最高分 THEN 系统 SHALL 在结算界面高亮提示"超越了好友XXX"。
|
||||
|
||||
---
|
||||
|
||||
### 需求 10:商业化系统(广告与内购)
|
||||
|
||||
**用户故事:** 作为游戏运营方,我希望通过合理的广告和内购设计实现商业化,同时不影响玩家核心体验。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家死亡且有剩余复活机会 THEN 系统 SHALL 弹出"观看广告复活"选项(激励视频),复活后保留当前火力等级。
|
||||
2. WHEN 关卡结算时 THEN 系统 SHALL 提供"观看广告获得双倍金币/道具"选项(激励视频)。
|
||||
3. WHEN 玩家进入皮肤商店 THEN 系统 SHALL 展示可通过观看广告解锁的特殊皮肤(如"黄金坦克")。
|
||||
4. WHEN 每局游戏结束或玩家退出关卡时 THEN 系统 SHALL 展示插屏广告(频率控制:每3局最多1次)。
|
||||
5. IF 玩家购买"永久去广告"内购项 THEN 系统 SHALL 永久移除所有插屏广告(激励视频保留,因为是玩家主动选择)。
|
||||
6. IF 玩家购买"皮肤包"内购项 THEN 系统 SHALL 解锁对应的坦克皮肤(如"红白机配色"经典皮肤包)。
|
||||
|
||||
---
|
||||
|
||||
### 需求 11:数据持久化与存档系统
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望游戏进度能够自动保存,以便下次打开时继续游戏。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 玩家通过任意关卡 THEN 系统 SHALL 使用 `wx.setStorageSync` 自动保存当前关卡进度、最高分、生命数等本地数据。
|
||||
2. WHEN 玩家重新打开游戏 THEN 系统 SHALL 读取本地存档数据,允许玩家从上次进度继续游戏或重新开始。
|
||||
3. WHEN 玩家得分更新时 THEN 系统 SHALL 将最新得分同步至微信云数据库(用于排行榜)。
|
||||
4. IF 本地存档数据损坏或丢失 THEN 系统 SHALL 从云端恢复玩家的关键进度数据(最高关卡、最高分)。
|
||||
5. WHEN 玩家获得新皮肤或内购项 THEN 系统 SHALL 将购买记录同步至云端,确保换设备后不丢失。
|
||||
|
||||
---
|
||||
|
||||
### 需求 12:UI界面与用户体验
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望游戏界面简洁美观、操作直觉化,以便快速上手并沉浸在游戏中。
|
||||
|
||||
#### 验收标准
|
||||
|
||||
1. WHEN 游戏启动 THEN 系统 SHALL 展示主菜单界面,包含:经典模式、无尽模式、双人对战、排行榜、设置等入口。
|
||||
2. WHEN 进入战斗场景 THEN 系统 SHALL 在屏幕顶部显示HUD信息:当前关卡、剩余敌人数量、玩家生命数、当前火力等级。
|
||||
3. WHEN 玩家暂停游戏 THEN 系统 SHALL 弹出暂停菜单(继续游戏、重新开始、返回主菜单)。
|
||||
4. WHEN 玩家首次进入游戏 THEN 系统 SHALL 提供简短的新手引导(指示虚拟摇杆和发射按钮的用法,约2-3步)。
|
||||
5. WHEN 游戏中出现重要事件(如道具拾取、敌人全灭、BOSS出现) THEN 系统 SHALL 播放对应的音效和简短的视觉反馈。
|
||||
6. WHEN 玩家在设置界面操作 THEN 系统 SHALL 提供音效开关、音乐开关、振动开关等选项。
|
||||
|
||||
---
|
||||
|
||||
### 需求 13:3v3 对战模式
|
||||
|
||||
**用户故事:** 作为一名玩家,我希望能与好友组队进行 3v3 破坏对方阵地的对战,以便获得更具团队协作感和竞技性的游戏体验。
|
||||
|
||||
#### 模式定位
|
||||
|
||||
玩法:3v3 破坏对方阵地。双方各拥有1个基地(阵地),不限时间,率先摧毁对方基地的一方获胜。
|
||||
|
||||
#### 核心流程
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[玩家点击3v3入口] --> B{选择模式}
|
||||
B -->|组队开黑| C[创建队伍]
|
||||
B -->|单人| D[快速匹配]
|
||||
|
||||
C --> E[邀请好友入队]
|
||||
E --> F[队伍满3人/点击匹配]
|
||||
F --> G[系统匹配对手]
|
||||
|
||||
D --> H[加入匹配池]
|
||||
G --> I[6人满房]
|
||||
H --> I
|
||||
I --> J[进入加载页]
|
||||
J --> K[开始对战]
|
||||
```
|
||||
|
||||
#### 验收标准
|
||||
|
||||
##### 好友开黑 — 队伍系统
|
||||
|
||||
1. WHEN 玩家在 3v3 入口选择"组队开黑" THEN 系统 SHALL 创建一个队伍房间,创建者自动成为**队长**。
|
||||
2. WHEN 队长操作队伍时 THEN 系统 SHALL 赋予队长以下权限:邀请好友、踢出队员、开始匹配、解散队伍;队长头像带"队长"标识,操作按钮高亮。
|
||||
3. WHEN 队员加入队伍后 THEN 系统 SHALL 赋予队员以下权限:准备/取消准备、退出队伍;队员界面显示"准备状态",无法操作匹配按钮。
|
||||
4. WHEN 队长点击"邀请好友" THEN 系统 SHALL 调用微信好友列表,生成邀请卡片,卡片内容为"坦克3v3,速来开黑!"。
|
||||
5. WHEN 好友点击邀请卡片 THEN 系统 SHALL 检测卡片中的 `teamId` 参数,将好友加入对应队伍房间(MGOBE Room)。
|
||||
6. IF 队伍人数已满3人 THEN 系统 SHALL 拒绝新成员加入并提示"队伍已满"。
|
||||
|
||||
##### 匹配方案
|
||||
|
||||
7. WHEN 玩家单独点击"快速开始" THEN 系统 SHALL 将玩家加入单人匹配池,按段位/胜率进行匹配,补位至 3v3。
|
||||
8. WHEN 队长点击"开始匹配" THEN 系统 SHALL 将队伍整体加入匹配池,寻找实力相近的对手队伍或散人进行组合。
|
||||
9. IF 匹配超时(超过60秒未凑满6人) THEN 系统 SHALL 自动填充 AI 机器人补位,确保对局可以正常开始。
|
||||
10. WHEN 6人满房(含 AI 填充) THEN 系统 SHALL 进入加载页,所有玩家同步加载对战地图资源。
|
||||
|
||||
##### 对战规则
|
||||
|
||||
11. WHEN 3v3 对战开始时 THEN 系统 SHALL 生成对称式对战地图,双方各拥有1个基地(阵地),分别位于地图两端,地图中央为争夺区域。
|
||||
12. WHEN 任一方基地被摧毁 THEN 系统 SHALL 判定该方失败,对战立即结束并进入结算界面。对战不设时间限制,唯一的胜利条件为摧毁对方基地。
|
||||
13. WHEN 玩家在 3v3 对战中被击毁 THEN 系统 SHALL 在己方基地附近自动重生(无生命数限制),重生间隔为3秒。所有坦克的出生点均位于所在基地附近区域。
|
||||
14. WHEN 3v3 对战结算时 THEN 系统 SHALL 展示双方各玩家的击杀数、死亡数、助攻数、对阵地伤害等数据,并根据表现计算段位积分变化。
|
||||
|
||||
##### 网络与同步
|
||||
|
||||
15. WHEN 3v3 对战进行中 THEN 系统 SHALL 采用帧同步或状态同步方案(基于微信小游戏 MGOBE 或同等方案),确保6人对战的网络延迟可控。
|
||||
16. IF 玩家在对战中断线 THEN 系统 SHALL 保留其位置60秒,期间允许重连恢复对战;超时未重连则由 AI 接管该玩家坦克。
|
||||
|
||||
---
|
||||
|
||||
## 边界情况与技术约束
|
||||
|
||||
### 边界情况
|
||||
1. **网络断开**:排行榜上传失败时,系统应缓存数据并在网络恢复后自动重试。
|
||||
2. **小游戏被后台切走**:系统应自动暂停游戏,返回前台后恢复。
|
||||
3. **广告加载失败**:激励视频加载失败时,应提供备选方案(如直接给予较少奖励或提示稍后重试)。
|
||||
4. **同屏大量对象**:当同屏坦克+子弹数量过多时,应通过对象池和渲染优化保证性能。
|
||||
5. **玩家误伤基地**:玩家自己的子弹也可以摧毁基地围墙和基地本身,需保留此经典机制。
|
||||
|
||||
### 技术约束
|
||||
1. 微信小游戏包体大小限制(首包≤4MB,分包≤20MB),需合理规划资源加载策略。
|
||||
2. 微信小游戏不支持DOM API,所有UI需通过Canvas或Cocos Creator UI系统实现。
|
||||
3. 双人对战需要实时通信,建议使用微信小游戏帧同步或状态同步方案。
|
||||
4. 开放数据域(排行榜)与主域隔离,需通过SharedCanvas方案展示好友排名。
|
||||
|
||||
### 成功标准
|
||||
1. 游戏首包加载时间 ≤ 3秒(4G网络环境)。
|
||||
2. 战斗场景稳定帧率 ≥ 55FPS(中端机型)。
|
||||
3. 单局游戏时长控制在3-5分钟。
|
||||
4. 新手玩家3分钟内理解核心操作。
|
||||
@@ -0,0 +1,151 @@
|
||||
# 实施计划:坦克大作战(微信小游戏版)
|
||||
|
||||
> **技术栈**:纯 JavaScript + 原生 Canvas API(微信小游戏环境),不依赖 Cocos Creator 等重型引擎。
|
||||
> **参考需求文档**:`.codebuddy/plan/tankwar/requirements.md`
|
||||
|
||||
---
|
||||
|
||||
- [x] 1. 搭建微信小游戏项目基础框架与游戏主循环
|
||||
- 创建微信小游戏项目结构(`game.js`、`game.json`、`project.config.json` 等)
|
||||
- 实现 Canvas 初始化、屏幕适配(获取设备宽高,计算游戏区域缩放比例)
|
||||
- 实现游戏主循环(`requestAnimationFrame`),包含 `update(dt)` 和 `render(ctx)` 两阶段
|
||||
- 实现场景管理器(SceneManager),支持主菜单、游戏关卡、结算界面等场景的注册与切换
|
||||
- 实现对象池(ObjectPool)工具类,用于子弹、爆炸特效等高频对象的复用
|
||||
- 实现资源管理器(ResourceManager),使用 `wx.createImage` 预加载图片资源,支持加载进度回调
|
||||
- _需求:1.1、1.2、1.3、1.4_
|
||||
|
||||
- [x] 2. 实现地图系统与地形渲染
|
||||
- 定义地图数据结构(13×21 网格,每格用数字编码表示地形类型:空地/砖块/钢铁/河流/森林/基地)
|
||||
- 编写至少 5 个预设关卡的地图配置数据(JSON 格式),包含教学关、河流关、重甲关等
|
||||
- 实现 MapManager 类,负责从关卡配置加载地图、渲染地形 Tile、管理地形状态(砖块可被摧毁)
|
||||
- 实现各地形类型的碰撞属性:砖块(可破坏/阻挡)、钢铁(Lv3可破/阻挡)、河流(阻挡坦克/子弹穿越)、森林(遮挡层/可通行)
|
||||
- 实现基地区域渲染(老鹰图标 + 砖块围墙),基地被击中即摧毁的判定逻辑
|
||||
- _需求:2.1、2.2、2.3、2.4、2.5、2.6、2.7、6.1_
|
||||
|
||||
- [x] 3. 实现玩家坦克与触控操作系统
|
||||
- 实现 Tank 基类(位置、方向、速度、血量、渲染、碰撞盒等通用属性和方法)
|
||||
- 实现 PlayerTank 子类,包含火力等级(Lv1-Lv3)、生命数、无敌状态、重生逻辑
|
||||
- 实现虚拟摇杆组件(Joystick):监听 `touchstart/touchmove/touchend` 事件,左下角渲染摇杆UI,输出四方向(上/下/左/右)
|
||||
- 实现发射按钮组件(FireButton):右下角渲染按钮UI,点击触发发射,根据火力等级限制同屏子弹数(Lv1=1颗,Lv2/Lv3=2颗)
|
||||
- 实现坦克与地形的碰撞检测(矩形碰撞),阻止坦克进入不可通行区域
|
||||
- _需求:3.1、3.2、3.3、3.4、3.5、3.6、3.7_
|
||||
|
||||
- [x] 4. 实现子弹系统与碰撞检测引擎
|
||||
- 实现 Bullet 类(位置、方向、速度、所属阵营、是否破钢),从对象池获取/回收
|
||||
- 实现碰撞检测管理器(CollisionManager),每帧检测:子弹↔地形、子弹↔坦克、子弹↔子弹、子弹↔基地、坦克↔坦克
|
||||
- 实现子弹击中砖块的破坏逻辑(普通子弹破坏1格砖块,Lv3子弹破坏更大范围)
|
||||
- 实现子弹击中钢铁的逻辑(Lv1/Lv2反弹/消失,Lv3摧毁钢铁)
|
||||
- 实现敌我子弹对撞抵消逻辑
|
||||
- 实现爆炸特效(帧动画),使用对象池管理
|
||||
- _需求:2.2、2.3、3.6、4.8、6.1_
|
||||
|
||||
- [x] 5. 实现敌方坦克AI与刷新系统
|
||||
- 实现 EnemyTank 子类,支持4种类型配置:普通(标准属性)、快速(高速/1HP)、重甲(低速/2-4HP)、精英BOSS(高HP/智能AI)
|
||||
- 实现敌方坦克刷新管理器(SpawnManager):从地图顶部3个出生点轮流刷新,控制同屏最大数量和刷新间隔,每关总计约20辆
|
||||
- 实现基础AI状态机:巡逻状态(随机方向移动+定时射击)→ 追击状态(朝基地方向移动)
|
||||
- 实现进阶AI行为:A*简化寻路(方向权重算法),支持绕路偷家(关卡≥10)和集火基地(关卡≥15)
|
||||
- 实现敌方坦克被击毁的判定、计数和特效
|
||||
- _需求:4.1、4.2、4.3、4.4、4.5、4.6、4.7_
|
||||
|
||||
- [x] 6. 实现道具系统
|
||||
- 实现 PowerUp 类(类型、位置、存在时间、闪烁动画),支持6种道具:星星、时钟、炸弹、钢盔、铲子、坦克+1
|
||||
- 实现道具生成逻辑:击毁特定标记敌方坦克后在随机位置生成道具,15秒后消失
|
||||
- 实现各道具拾取效果:星星(升级火力)、时钟(冻结敌人10秒)、炸弹(清屏)、钢盔(无敌15秒+护盾特效)、铲子(基地围墙变钢铁20秒)、坦克+1(加命)
|
||||
- 实现道具掉落概率配置表,根据关卡编号动态调整(高关卡降低星星概率)
|
||||
- _需求:5.1、5.2、5.3、5.4、5.5、5.6、5.7、5.8_
|
||||
|
||||
- [x] 7. 实现关卡流程、胜负判定与结算系统
|
||||
- 实现 LevelManager 类:管理关卡加载、敌人波次、胜负条件检测、关卡切换
|
||||
- 实现胜利判定(所有敌人被消灭+基地存活)和失败判定(基地被毁或生命归零)
|
||||
- 实现关卡结算界面:展示击杀统计(各类型坦克数量)、得分计算(击杀数×系数 + 时间奖励 + 基地存活奖励)
|
||||
- 实现关卡难度曲线配置:前3关教学→第5关河流→第10关重甲→第20关BOSS,通关后循环并提升难度
|
||||
- 实现玩家死亡→复活/Game Over流程(含广告复活入口预留)
|
||||
- _需求:6.1、6.2、6.3、6.4、7.1、7.2、7.3、7.4、7.5、7.6、7.7、3.8_
|
||||
|
||||
- [x] 8. 实现UI系统(主菜单、HUD、暂停、新手引导)
|
||||
- 实现主菜单场景:游戏标题、经典模式/无尽模式/双人对战/排行榜/设置按钮,纯Canvas绘制
|
||||
- 实现战斗HUD:顶部显示当前关卡、剩余敌人数(坦克小图标)、玩家生命数、火力等级指示
|
||||
- 实现暂停功能:暂停按钮 + 暂停菜单弹窗(继续/重新开始/返回主菜单)
|
||||
- 实现新手引导:首次进入游戏时展示2-3步操作提示(摇杆移动→射击按钮→保护基地)
|
||||
- 实现设置界面:音效开关、音乐开关、振动开关,使用 `wx.setStorageSync` 持久化设置
|
||||
- 实现音效系统:使用 `wx.createInnerAudioContext` 管理射击、爆炸、道具拾取、胜利/失败等音效
|
||||
- _需求:12.1、12.2、12.3、12.4、12.5、12.6、1.1_
|
||||
|
||||
- [x] 9. 实现数据持久化与微信云排行榜
|
||||
- 实现 StorageManager 类:封装 `wx.setStorageSync/getStorageSync`,管理本地存档(当前关卡、最高分、生命数、皮肤、设置项)
|
||||
- 实现通关自动存档和启动时读档恢复逻辑
|
||||
- 实现微信云开发接入:云数据库初始化、得分上传云函数、排行榜数据查询
|
||||
- 实现开放数据域(子域)排行榜:通过 SharedCanvas 展示微信好友排名(按最高关卡/最高得分排序)
|
||||
- 实现分享功能:通关后生成"挑战书"分享卡片(`wx.shareAppMessage`),支持带参数跳转
|
||||
- 实现网络异常处理:上传失败时缓存数据,网络恢复后自动重试
|
||||
- _需求:9.1、9.2、9.3、9.4、9.5、11.1、11.2、11.3、11.4_
|
||||
|
||||
- [x] 10. 实现商业化系统(广告、内购)与游戏模式扩展
|
||||
- 实现广告管理器(AdManager):封装激励视频(`wx.createRewardedVideoAd`)和插屏广告(`wx.createInterstitialAd`)的创建、加载、展示、失败回调
|
||||
- 实现广告触发点:死亡复活(激励视频)、结算双倍奖励(激励视频)、局间插屏(每3局最多1次频控)
|
||||
- 实现广告加载失败的降级方案(提示稍后重试或给予少量奖励)
|
||||
- 实现内购接口预留:永久去广告、皮肤包购买(`wx.requestMidasPayment` 或虚拟支付)
|
||||
- 实现无尽模式:无限波次敌人刷新,记录最高击杀数,首次需观看广告解锁
|
||||
- 实现双人对战模式框架:房间创建/加入UI、微信好友邀请、基于帧同步的实时对战基础通信(可作为后续迭代重点)
|
||||
- 实现小游戏生命周期处理:`wx.onShow/onHide` 自动暂停/恢复,后台切换保护
|
||||
- _需求:8.1、8.2、8.3、8.4、10.1、10.2、10.3、10.4、10.5、10.6、11.5_
|
||||
|
||||
- [ ] 11. 移除时间限制并修正全局常量与服务端胜负逻辑
|
||||
- 在 `GameGlobal.js` 中移除 `TEAM_ROUND_TIME` 常量(或将其设为 0 / Infinity 表示不限时),确保不再作为对战时间限制使用
|
||||
- 修改 `server/index.js` 中 `startTeamGame()` 函数:移除 `gameTimer`(setTimeout 超时结束对战的逻辑),对战不再因时间到期而结束
|
||||
- 修改 `server/index.js` 中 `endTeamGame()` 函数:移除 `timeout` 分支的基地血量比较逻辑,唯一的结束原因为 `base_destroyed`(某方基地被摧毁)
|
||||
- 修改 `server/index.js` 中 `startTeamGame()` 发送的 `gameData`:移除 `roundTime` 字段,或将其设为 0 表示不限时
|
||||
- 确认 `TeamRoom` 类中 `this.roundTime = 300` 不再影响游戏逻辑,可移除或保留为无效值
|
||||
- _需求:13.12_
|
||||
|
||||
- [ ] 12. 修改客户端 TeamGameScene 移除倒计时并适配纯基地摧毁胜负
|
||||
- 修改 `TeamGameScene.js` 中 `enter()` 方法:移除 `_roundTimer` 的初始化和使用
|
||||
- 修改 `TeamGameScene.js` 中 `update()` 方法:移除 `_roundTimer -= dt` 倒计时逻辑及 `_roundTimer <= 0` 的超时判断
|
||||
- 修改 `TeamGameScene.js` 中 HUD 渲染:移除顶部倒计时显示,改为显示对战已进行时间(正计时,仅作参考信息)
|
||||
- 确保 `_handleTeamGameOver` 回调中正确处理 `reason === 'base_destroyed'` 的唯一胜负场景,移除 `timeout` / `draw` 相关的结果处理
|
||||
- 修改 `TeamRoomScene.js` 中 `_startTeamGame()` 传参:不再传递 `roundTime`
|
||||
- _需求:13.12_
|
||||
|
||||
- [ ] 13. 修正 3v3 对战地图为双方各 1 个基地的对称布局
|
||||
- 检查 `LevelData.js` 中 `TEAM_MAPS` 数据:确保每张地图双方各只有 1 个基地(`TERRAIN.BASE`),分别位于地图左右两端
|
||||
- 确保基地周围有砖块围墙保护(`TERRAIN.BASE_WALL`),地图中央为争夺区域
|
||||
- 确保 `teamABase` 和 `teamBBase` 坐标正确指向各自唯一基地位置
|
||||
- 验证 `MapManager` 对 3v3 地图中双基地的渲染和碰撞检测逻辑正确(两个基地分别可被对方子弹击中扣血)
|
||||
- _需求:13.11_
|
||||
|
||||
- [ ] 14. 完善服务端 3v3 房间管理与匹配系统
|
||||
- 检查并修复 `handleCreateTeam`、`handleJoinTeam`、`handleLeaveTeam`、`handleTeamReady`、`handleTeamKick`、`handleTeamDisband` 的边界情况处理
|
||||
- 检查并修复 `handleMatchStart`、`handleMatchCancel`、`handleSoloMatch` 的匹配逻辑,确保队伍匹配和单人匹配正确配对
|
||||
- 确保 `tryMatchTeams()` 中两队配对和散人组队逻辑正确,AI 填充在超时后正常触发
|
||||
- 确保 `handleBaseHit` 中基地扣血和 `base_destroyed` 判定逻辑正确,且是唯一的游戏结束触发点
|
||||
- 验证断线重连流程:`handleTeamPlayerDisconnect` → 60秒超时 → `BOT_TAKEOVER`,以及 `handleReconnect` 恢复逻辑
|
||||
- _需求:13.1、13.2、13.3、13.5、13.6、13.7、13.8、13.9、13.10、13.15、13.16_
|
||||
|
||||
- [ ] 15. 完善客户端 TeamRoomScene 队伍房间交互
|
||||
- 检查并修复 `TeamRoomScene.js` 中组队开黑流程:创建队伍 → 邀请好友 → 队员准备 → 队长开始匹配
|
||||
- 检查并修复快速匹配(单人匹配)流程:点击快速匹配 → 进入匹配池 → 匹配成功/超时AI填充
|
||||
- 确保队长权限按钮(邀请、踢人、开始匹配、解散)和队员按钮(准备/取消、退出)的交互逻辑正确
|
||||
- 确保微信邀请卡片生成(`wx.shareAppMessage`)携带 `teamId` 参数,好友点击后能正确加入队伍
|
||||
- 确保匹配状态UI(匹配中倒计时、取消匹配按钮)正确显示和响应
|
||||
- 确保网络事件监听(`TEAM_STATE`、`TEAM_GAME_START`、`ROOM_ERROR`、`TEAM_DISBAND`)正确处理
|
||||
- _需求:13.1、13.2、13.3、13.4、13.5、13.6、13.7、13.8、13.9、13.10_
|
||||
|
||||
- [ ] 16. 完善 TeamGameScene 对战核心逻辑与 HUD
|
||||
- 确保 6 辆坦克(3v3)的创建、渲染、碰撞检测正确运行,己方子弹不伤害己方坦克
|
||||
- 确保网络同步:本地玩家输入发送、远程玩家状态接收与插值平滑、子弹同步
|
||||
- 确保基地血量系统正确:子弹击中基地 → 发送 `BASE_HIT` → 服务端扣血广播 → 客户端更新血量条
|
||||
- 确保无限重生机制:被击毁后 3 秒在己方出生点重生,重生后 3 秒无敌
|
||||
- 实现 HUD:双方基地血量条(顶部左右对称)、对战已进行时间(正计时)、本方队伍击杀/死亡统计
|
||||
- 实现队友/敌方坦克颜色区分:己方蓝色系、敌方红色系、本地玩家金色高亮
|
||||
- 实现 AI 机器人(`BotTank`)在对战中的行为:匹配填充的 AI 和断线接管的 AI 正常移动和射击
|
||||
- _需求:13.11、13.12、13.13、13.14、13.15_
|
||||
|
||||
- [ ] 17. 实现 TeamResultScene 结算与主菜单入口集成
|
||||
- 完善 `TeamResultScene.js` 结算界面:展示胜负结果(仅"胜利/失败",无平局)、双方各玩家击杀数/死亡数/助攻数/对阵地伤害
|
||||
- 移除结算界面中与时间相关的展示(如"超时平局"等),胜负原因统一为"基地被摧毁"
|
||||
- 实现段位积分变化显示:胜方加分、败方扣分、MVP 额外加分
|
||||
- 实现结算后操作按钮:「再来一局」(返回队伍房间)、「返回主菜单」
|
||||
- 确保 `MenuScene.js` 中「3v3 对战」按钮正确跳转到 `TeamRoomScene`
|
||||
- 确保 `NetworkManager.js` 中 3v3 专用方法(`createTeam`、`joinTeam`、`teamReady`、`startMatch`、`kickPlayer`、`disbandTeam`)正确发送消息
|
||||
- 确保 `game.js` 中 `wx.onShow` 的 `teamId` 检测逻辑正确,从邀请卡片进入游戏后自动加入队伍
|
||||
- _需求:13.4、13.5、13.14、13.16_
|
||||
Reference in New Issue
Block a user