first commit

This commit is contained in:
jakciehan
2026-04-10 22:59:39 +08:00
commit cc2e7b9bb0
89 changed files with 23631 additions and 0 deletions
@@ -0,0 +1,220 @@
# 需求文档:坦克大战 — 极简商业化
## 引言
本文档基于《坦克大战经典游戏 - 极简商业化方案》,提炼可落地的商业化功能需求。核心原则是 **"轻数值、重体验、做减法"**,坚持不破坏经典坦克大战"一发子弹消灭一个敌人"的爽快感。
商业化策略采用 **IAA(激励广告)+ 极简IAP(内购)** 双轨模式:
- **唯一货币**:金币(Gold),砍掉钻石、赛季币等复杂体系
- **核心变现**:复活续关(广告/金币)、局前Buff(金币消耗)、去广告特权(唯一内购)
- **经济闭环**:玩游戏 → 死亡/想变强 → 看广告赚金币 → 购买复活/Buff → 继续游戏
与之前的复杂商业化方案相比,本方案**砍掉**了:钻石/赛季币货币、体力系统、皮肤商店、战斗通行证、月卡、社交裂变、付费引导等重型系统。
---
## 需求
### 需求 1:金币货币系统
**用户故事:** 作为一名玩家,我希望游戏只有一种简单的货币(金币),以便我能清晰地理解如何获取和使用资源,不被复杂的货币体系困扰。
#### 验收标准
##### 1.1 金币获取
1. WHEN 玩家完成一局对战(通关或失败结算) THEN 系统 SHALL 根据对局表现发放基础金币奖励(基础值50金币)。
2. WHEN 玩家在结算界面选择观看广告 THEN 系统 SHALL 将本局金币奖励翻倍(即额外获得与基础奖励等额的金币)。
3. WHEN 玩家在主界面点击"领金币"按钮并观看广告 THEN 系统 SHALL 发放100金币,每日上限3次。
##### 1.2 金币消耗
4. WHEN 玩家在死亡时选择金币复活 THEN 系统 SHALL 扣除200金币。
5. WHEN 玩家在局前购买Buff THEN 系统 SHALL 扣除对应金币(护盾100金币、双倍火力150金币)。
6. IF 玩家金币余额不足以支付消耗 THEN 系统 SHALL 提示余额不足,并引导至广告赚金币或金币包购买。
##### 1.3 金币持久化
7. WHEN 金币余额发生变动 THEN 系统 SHALL 通过 StorageManager 持久化金币数据,并同步至云端。
8. WHEN 玩家换设备登录 THEN 系统 SHALL 从云端恢复金币余额。
9. 系统 SHALL 设置金币上限为999,999,防止数值溢出。
---
### 需求 2:复活续关系统(核心变现点)
**用户故事:** 作为一名玩家,我希望在坦克被击毁时有机会复活继续游戏,以便不浪费已有的关卡进度。
#### 验收标准
##### 2.1 复活选项
1. WHEN 玩家坦克被击毁且生命数降为0 THEN 系统 SHALL 弹出复活选择弹窗,提供两个选项:观看广告复活(免费)、花费200金币复活。
2. WHEN 玩家选择观看广告并完整观看激励视频 THEN 系统 SHALL 立即复活玩家,保留当前关卡进度。
3. WHEN 玩家选择花费金币复活且余额≥200 THEN 系统 SHALL 扣除200金币并立即复活玩家。
4. IF 玩家选择放弃复活 THEN 系统 SHALL 正常进入游戏失败结算流程。
##### 2.2 复活限制
5. WHEN 同一局游戏中玩家已使用过1次复活(无论广告或金币) THEN 系统 SHALL 不再提供复活选项,直接进入失败结算。
6. IF 广告加载失败 THEN 系统 SHALL 仅展示金币复活选项,隐藏广告复活按钮。
---
### 需求 3:局前Buff系统
**用户故事:** 作为一名玩家,我希望在开局前能购买一次性增益道具,以便在困难关卡中获得额外优势。
#### 验收标准
##### 3.1 Buff商店
1. WHEN 玩家在关卡加载前(选关/匹配后、正式开局前) THEN 系统 SHALL 展示局前Buff购买界面。
2. 系统 SHALL 提供以下Buff道具供购买:
- **护盾**(100金币):开局自带一层护盾,可抵挡一次伤害。
- **双倍火力**(150金币):开局10秒内子弹威力翻倍。
3. WHEN 玩家选择购买Buff且金币余额充足 THEN 系统 SHALL 扣除金币并标记该Buff在本局生效。
4. WHEN 玩家选择跳过 THEN 系统 SHALL 正常开始游戏,不施加任何Buff。
##### 3.2 Buff生效
5. WHEN 本局开始且玩家已购买护盾Buff THEN 系统 SHALL 为玩家坦克添加一层护盾效果(视觉+逻辑),受到第一次伤害时消耗护盾而非扣除生命。
6. WHEN 本局开始且玩家已购买双倍火力Buff THEN 系统 SHALL 在开局10秒内将玩家子弹威力设为2倍,10秒后恢复正常。
7. WHEN 本局结束(无论胜负) THEN 系统 SHALL 清除所有Buff效果,Buff不跨局保留。
---
### 需求 4:广告系统
**用户故事:** 作为游戏运营方,我希望在合适的场景嵌入广告,以便在不破坏玩家体验的前提下获得广告收入。
#### 验收标准
##### 4.1 激励视频广告
1. WHEN 关卡加载时 THEN 系统 SHALL 预加载激励视频广告资源,减少玩家等待时间。
2. WHEN 广告播放完毕 THEN 系统 SHALL 在广告结束瞬间立即发放对应奖励。
3. WHEN 同一广告场景在15分钟内已展示过 THEN 系统 SHALL 不重复展示相同场景的广告。
4. IF 广告加载失败 THEN 系统 SHALL 提示"广告暂时不可用",不阻塞玩家正常流程。
##### 4.2 插屏广告
5. WHEN 玩家完成一局游戏退出关卡时 THEN 系统 SHALL 检查是否满足插屏广告展示条件。
6. IF 距离上次插屏广告展示已超过3局 THEN 系统 SHALL 展示一次插屏广告。
7. IF 玩家已购买"去广告特权" THEN 系统 SHALL 永久跳过所有插屏广告。
8. WHEN 插屏广告加载失败 THEN 系统 SHALL 静默跳过,不影响玩家正常流程。
##### 4.3 每日领金币广告
9. WHEN 玩家在主界面点击"领金币"按钮 THEN 系统 SHALL 播放激励视频广告。
10. WHEN 广告播放完毕 THEN 系统 SHALL 发放100金币。
11. WHEN 玩家当日已领取3次 THEN 系统 SHALL 将"领金币"按钮置灰,提示"明日再来"。
##### 4.4 双倍结算广告
12. WHEN 玩家通关进入结算界面 THEN 系统 SHALL 展示"观看广告获得双倍金币"按钮。
13. WHEN 玩家完整观看激励视频 THEN 系统 SHALL 将本局获得的金币翻倍发放。
14. IF 广告加载失败 THEN 系统 SHALL 提示"广告暂时不可用",按正常倍率发放。
---
### 需求 5:去广告特权(唯一内购)
**用户故事:** 作为一名核心玩家,我希望能一次性付费永久去除广告打断,以便获得更流畅的游戏体验。
#### 验收标准
1. WHEN 玩家在设置或商店中购买"去广告特权"(¥18/永久) THEN 系统 SHALL 通过微信支付完成交易。
2. WHEN 购买成功 THEN 系统 SHALL 永久移除所有插屏广告。
3. IF 玩家已购买去广告特权 THEN 系统 SHALL 保留激励视频广告入口(复活广告、双倍结算广告、每日领金币广告),因为这些是玩家主动选择观看以获取奖励。
4. IF 玩家已购买去广告特权且在复活弹窗中 THEN 系统 SHALL 仍然展示"观看广告复活"选项(玩家自愿选择)。
5. WHEN 购买记录 THEN 系统 SHALL 同步至云端,确保换设备后特权不丢失。
6. IF 支付过程中网络中断 THEN 系统 SHALL 在网络恢复后自动查询订单状态,补发未到账的特权。
---
### 需求 6:金币包与新手礼包
**用户故事:** 作为一名不想看广告但愿意付费的玩家,我希望能直接购买金币,以便快速获得复活和Buff所需的资源。
#### 验收标准
##### 6.1 金币充值包
1. WHEN 玩家在商店中购买金币包 THEN 系统 SHALL 按以下规格发放金币:¥6 = 1000金币。
2. WHEN 购买成功 THEN 系统 SHALL 立即将金币添加到玩家账户。
3. WHEN 购买记录 THEN 系统 SHALL 同步至云端。
##### 6.2 新手礼包
4. WHEN 新用户首次进入游戏 THEN 系统 SHALL 在24小时内展示新手礼包购买入口(¥1 = 500金币,相当于送一次复活+一次Buff)。
5. WHEN 新手礼包倒计时结束(24小时) THEN 系统 SHALL 移除新手礼包购买入口,不再展示。
6. WHEN 新手礼包购买成功 THEN 系统 SHALL 立即发放500金币。
##### 6.3 支付安全
7. WHEN 玩家发起内购 THEN 系统 SHALL 通过微信支付(`wx.requestMidasPayment`)完成交易。
8. IF 支付过程中网络中断 THEN 系统 SHALL 在网络恢复后自动查询订单状态,补发未到账商品。
9. WHEN 购买虚拟商品 THEN 系统 SHALL 将购买记录同步至云端,确保换设备后不丢失。
---
### 需求 7:主界面商业化入口
**用户故事:** 作为一名玩家,我希望在主界面能方便地找到商店和领金币入口,以便快速获取资源。
#### 验收标准
1. WHEN 玩家进入主菜单 THEN 系统 SHALL 在界面上展示"领金币"按钮,显示今日剩余领取次数(如"3/3")。
2. WHEN 玩家进入主菜单 THEN 系统 SHALL 展示"商店"按钮,点击后进入商店界面。
3. WHEN 玩家进入商店界面 THEN 系统 SHALL 展示以下内容:
- 当前金币余额
- 去广告特权购买入口(已购买则显示"已拥有")
- 金币充值包购买入口
- 新手礼包入口(仅限新用户24小时内可见)
4. WHEN 玩家金币余额显示 THEN 系统 SHALL 在主界面顶部常驻显示当前金币数量。
---
### 需求 8:合规与安全
**用户故事:** 作为游戏运营方,我希望游戏符合平台合规要求,以便合法运营且风险最低。
#### 验收标准
##### 8.1 基础合规
1. WHEN 系统识别到未成年用户 THEN 系统 SHALL 限制每日广告展示不超过5次。
2. WHEN 未成年用户进行消费 THEN 系统 SHALL 限制月消费上限为¥400,单次消费超过¥50时弹出确认提示。
##### 8.2 反作弊
3. WHEN 系统检测到同一广告源IP短时间内大量请求 THEN 系统 SHALL 触发广告反刷机制。
4. WHEN 系统检测到异常大额充值行为 THEN 系统 SHALL 触发人工审核标记。
---
## 边界情况与技术约束
### 边界情况
1. **广告加载失败**:激励视频加载失败时,复活弹窗仅展示金币选项;结算双倍按钮提示稍后重试。
2. **支付异常**:支付中断后自动查询订单状态并补发商品。
3. **跨设备同步**:金币余额、去广告特权、购买记录均需云端同步。
4. **金币溢出**:金币上限999,999,达到上限后不再发放(提示已满)。
5. **Buff叠加**:护盾和双倍火力可同时购买,互不冲突。
### 技术约束
1. 微信小游戏内购需通过 `wx.requestMidasPayment` 接口完成。
2. 广告SDK使用微信小游戏广告组件(`wx.createRewardedVideoAd``wx.createInterstitialAd`)。
3. 金币数据需服务端校验,防止客户端篡改。
4. 未成年人识别依赖微信平台提供的用户年龄信息接口。
### 成功标准
1. 激励视频广告转化率 ≥ 8%(复活场景)。
2. 去广告特权购买率 ≥ 2%。
3. 广告展示不影响核心游戏体验(玩家满意度 ≥ 4/5)。
4. 所有内购流程零丢单率。
---
## 与旧方案的差异说明
本极简方案相比之前的复杂商业化方案,**砍掉**了以下系统:
- ❌ 钻石货币、赛季币货币(仅保留金币)
- ❌ 体力系统(StaminaManager
- ❌ 皮肤商店系统(SkinManager、SkinData、ShopScene中的皮肤部分)
- ❌ 战斗通行证系统(BattlePassManager、BattlePassData、BattlePassScene
- ❌ 月卡系统
- ❌ 社交裂变系统(ShareManager扩展部分)
- ❌ 付费引导系统(PromotionManager
- ❌ 复杂的合规系统(ComplianceManager大部分功能)
**新增**了以下功能:
- ✅ 局前Buff系统(护盾、双倍火力)
- ✅ 每日领金币广告(主界面入口)
- ✅ 金币复活选项(除广告外的第二复活途径)
- ✅ 金币充值包(¥6=1000金币)
@@ -0,0 +1,128 @@
# 实施计划:坦克大战 — 极简商业化
> **前置说明**:项目中已存在旧版复杂商业化代码(V1.0~V2.5),本计划需要先清理废弃模块,再重构保留模块,最后新建功能。
## 现有代码盘点
### 需要删除的文件(旧方案废弃)
- `js/managers/StaminaManager.js` — 体力系统(砍掉)
- `js/managers/SkinManager.js` — 皮肤管理器(砍掉)
- `js/managers/BattlePassManager.js` — 战斗通行证(砍掉)
- `js/managers/PromotionManager.js` — 付费引导(砍掉)
- `js/managers/ShareManager.js` — 社交裂变扩展(砍掉)
- `js/data/SkinData.js` — 皮肤数据(砍掉)
- `js/data/BattlePassData.js` — 通行证数据(砍掉)
- `js/scenes/BattlePassScene.js` — 通行证场景(砍掉)
### 需要重构的文件(保留但大幅简化)
- `js/managers/CurrencyManager.js` — 简化为仅金币,去掉钻石/赛季币
- `js/managers/PaymentManager.js` — 简化为去广告+金币包+新手礼包
- `js/managers/AdManager.js` — 保留核心逻辑,增加每日领金币广告场景
- `js/managers/ComplianceManager.js` — 简化为基础合规
- `js/scenes/ShopScene.js` — 重写为极简商店(去广告+金币包+新手礼包)
- `js/scenes/GameScene.js` — 调整复活弹窗(增加金币复活选项)、集成Buff生效逻辑
- `js/scenes/ResultScene.js` — 调整结算金币发放逻辑
- `js/scenes/TeamResultScene.js` — 同步调整结算金币发放
- `js/scenes/MenuScene.js` — 调整按钮布局(去掉通行证入口,增加领金币按钮)
### 需要新建的文件
- `js/managers/BuffManager.js` — 局前Buff管理器(新功能)
- `js/scenes/BuffSelectScene.js` — 局前Buff选择界面(新功能)
---
## 任务清单
- [ ] 1. 清理废弃模块与引用
- 删除以下文件:`StaminaManager.js``SkinManager.js``BattlePassManager.js``PromotionManager.js``ShareManager.js``SkinData.js``BattlePassData.js``BattlePassScene.js`
- 清理 `game.js` 中对上述模块的 import 和注册代码
- 清理 `GameGlobal.js` 中废弃的场景常量(BATTLE_PASS、SHOP 相关的旧定义)
- 清理 `MenuScene.js` 中通行证入口按钮的代码
- 清理 `GameScene.js` 中体力检查相关代码
- 清理 `Tank.js` / `PlayerTank.js` 中皮肤渲染相关代码
- 清理 `ResultScene.js` / `TeamResultScene.js` 中通行证任务上报代码
- 清理 `zh.js` / `en.js` 中废弃模块的国际化文案
- _需求:与旧方案的差异说明_
- [ ] 2. 重构 CurrencyManager — 仅金币货币
- 移除钻石(diamond)和赛季币(seasonCoin)相关的所有属性和方法
- 保留金币(gold)的 `add``spend``getBalance` 方法
- 设置金币上限 999,999`add` 时检查溢出
- 确保 `spend` 方法在余额不足时返回失败并触发事件
- 保留 StorageManager 持久化和云端同步逻辑
- _需求:1.1、1.2、1.3_
- [ ] 3. 重构 AdManager — 增加每日领金币广告场景
- 保留现有的激励视频(复活、双倍结算)和插屏广告核心逻辑
- 新增 `AD_SCENE.DAILY_GOLD` 广告场景枚举
- 新增 `showDailyGoldAd()` 方法,播放完毕后触发 `daily_gold_reward` 事件
- 新增每日领取次数追踪(每日上限3次,跨天重置)
- 新增 `getDailyGoldRemaining()` 方法返回今日剩余次数
- 保留15分钟频控和预加载机制
- _需求:4.1、4.2、4.3、4.4_
- [ ] 4. 重构 PaymentManager — 极简内购
- 移除月卡、钻石包、皮肤礼包等商品配置
- 仅保留三个商品:去广告特权(¥18)、金币包(¥6=1000金币)、新手礼包(¥1=500金币)
- 去广告特权购买后设置永久标记,通过 StorageManager 持久化
- 新手礼包增加24小时倒计时逻辑(首次进入游戏开始计时,超时后不可购买)
- 保留微信支付(`wx.requestMidasPayment`)和掉单恢复逻辑
- _需求:5.1~5.6、6.1~6.3_
- [ ] 5. 重构 GameScene — 复活弹窗双选项 + Buff生效
- 修改复活弹窗:从仅"广告复活"改为"广告复活 + 金币复活(200金币)"双选项
- 金币复活调用 CurrencyManager.spend(200),余额不足时按钮置灰
- 保留每局仅限1次复活的限制
- 广告加载失败时隐藏广告按钮,仅展示金币复活
- 集成 BuffManager:开局时检查已购Buff并施加效果(护盾、双倍火力)
- 移除旧的体力检查逻辑(如有)
- _需求:2.1~2.2、3.2_
- [ ] 6. 创建 BuffManager — 局前Buff管理器
- 定义 Buff 类型枚举:`SHIELD`(护盾,100金币)、`DOUBLE_FIRE`(双倍火力,150金币)
- 实现 `purchaseBuff(type)` 方法:检查金币余额 → 扣费 → 标记本局Buff
- 实现 `getActiveBuffs()` 返回当前局已购买的Buff列表
- 实现 `clearBuffs()` 在每局结束时清除所有Buff
- 实现护盾逻辑:为 PlayerTank 添加 `shield` 属性,受击时优先消耗护盾
- 实现双倍火力逻辑:开局10秒内子弹威力×2,到期后恢复
- _需求:3.1、3.2_
- [ ] 7. 创建 BuffSelectScene — 局前Buff选择界面
- 在关卡加载前(GameScene 初始化前)展示Buff选择界面
- 展示两个Buff卡片:护盾(100金币)、双倍火力(150金币),显示当前金币余额
- 点击购买时调用 BuffManager.purchaseBuff(),余额不足时提示并引导
- 提供"跳过"按钮直接进入游戏
- 护盾和双倍火力可同时购买
- 购买完成或跳过后,切换到 GameScene 开始游戏
- _需求:3.1.1~3.1.4、7.4_
- [ ] 8. 重构 ShopScene — 极简商店界面
- 重写商店界面,移除皮肤商店相关内容
- 顶部显示当前金币余额
- 展示三个商品卡片:去广告特权(¥18,已购显示"已拥有")、金币包(¥6=1000金币)、新手礼包(¥1=500金币,24小时倒计时)
- 点击购买调用 PaymentManager 对应方法
- 新手礼包超过24小时后自动隐藏
- _需求:5.1~5.2、6.1~6.2、7.3_
- [ ] 9. 重构 MenuScene — 主界面商业化入口
- 移除通行证入口按钮
- 新增"领金币"按钮,显示今日剩余次数(如"🪙 领金币 3/3"),点击调用 AdManager.showDailyGoldAd()
- 当日次数用完后按钮置灰,显示"明日再来"
- 保留"商店"按钮入口
- 顶部常驻显示当前金币数量
- 调整按钮布局确保所有按钮可见
- _需求:7.1~7.4、4.3_
- [ ] 10. 重构 ResultScene / TeamResultScene — 结算金币发放
- 结算时计算基础金币奖励(基础值50,可根据表现浮动)
- 展示"观看广告双倍金币"按钮,观看后翻倍发放
- 调用 CurrencyManager.add() 发放金币
- 移除通行证任务进度上报代码
- 保留插屏广告展示逻辑(每3局一次,去广告特权跳过)
- _需求:1.1.1~1.1.2、4.4、4.2_
- [ ] 11. 简化 ComplianceManager + 注册管理器 + 国际化
- 简化 ComplianceManager:仅保留未成年人广告次数限制(每日≤5次)和消费限制(月≤¥400)
-`game.js` 中注册 BuffManager,移除废弃管理器的注册
- 更新 `zh.js` / `en.js`:添加局前Buff、领金币、极简商店相关文案,移除废弃文案
- _需求:8.1~8.2_
@@ -0,0 +1,273 @@
# 商业化需求文档:坦克大作战
## 引言
本文档基于《坦克大作战》微信小游戏商业化方案,提炼出可落地的商业化功能需求。商业化总策略采用 **"IAA(激励广告)+ IAP(内购)+ 社交裂变"** 三轨并行模式,以**非强制性、高转化**为核心原则,确保免费玩家体验不受损害,同时激励付费转化。
商业化功能按版本分阶段交付:
- **V1.0 基础版**:激励视频广告(复活、双倍结算)、插屏广告
- **V1.5 内购版**:钻石充值、去广告特权、基础皮肤商店
- **V2.0 赛季版**:战斗通行证、赛季任务、段位系统
- **V2.5 社交版**:分享裂变体系、战队系统、社交皮肤
---
## 需求
### 需求 1:激励视频广告系统
**用户故事:** 作为游戏运营方,我希望在关键游戏节点嵌入激励视频广告,以便在不破坏玩家体验的前提下获得广告收入。
#### 验收标准
##### 1.1 复活续关广告
1. WHEN 玩家在关卡中死亡且生命数降为0 THEN 系统 SHALL 弹出"观看广告复活"选项,展示激励视频广告入口。
2. WHEN 玩家选择观看广告并完整观看激励视频 THEN 系统 SHALL 立即复活玩家,保留当前火力等级,在出生点重生。
3. IF 玩家选择不观看广告 THEN 系统 SHALL 正常进入游戏失败结算流程。
4. WHEN 同一关卡中玩家已使用过1次广告复活 THEN 系统 SHALL 不再提供复活广告选项(每关最多复活1次)。
##### 1.2 双倍结算广告
5. WHEN 玩家通关进入结算界面 THEN 系统 SHALL 展示"观看广告获得双倍奖励"按钮。
6. WHEN 玩家完整观看激励视频 THEN 系统 SHALL 将本局获得的金币和经验值翻倍发放。
7. IF 广告加载失败 THEN 系统 SHALL 提示"广告暂时不可用,请稍后重试",并按正常倍率发放奖励。
##### 1.3 宝箱加速广告
8. WHEN 玩家获得稀有宝箱且宝箱处于冷却倒计时中(4小时) THEN 系统 SHALL 展示"观看广告立即开启"按钮。
9. WHEN 玩家完整观看激励视频 THEN 系统 SHALL 跳过冷却时间,立即打开宝箱并发放奖励。
##### 1.4 体力恢复广告
10. WHEN 玩家体力耗尽 THEN 系统 SHALL 展示"观看广告恢复体力"按钮。
11. WHEN 玩家完整观看激励视频 THEN 系统 SHALL 恢复5点体力。
12. WHEN 玩家当日已通过广告恢复体力达5次 THEN 系统 SHALL 隐藏该广告入口,提示"今日广告恢复次数已用完"。
##### 1.5 免费礼包广告
13. WHEN 玩家进入每日签到或活动页面 THEN 系统 SHALL 展示"观看广告领取免费礼包"入口。
14. WHEN 玩家完整观看激励视频 THEN 系统 SHALL 发放随机道具包(内容根据配置表随机)。
##### 1.6 广告体验优化
15. WHEN 关卡加载时 THEN 系统 SHALL 预加载激励视频广告资源,减少玩家等待时间。
16. WHEN 同一广告场景在15分钟内已展示过 THEN 系统 SHALL 不重复展示相同场景的广告。
17. WHEN 广告播放完毕 THEN 系统 SHALL 在广告结束瞬间立即发放奖励,建立正反馈。
---
### 需求 2:插屏广告
**用户故事:** 作为游戏运营方,我希望在自然间歇点展示插屏广告,以便补充广告收入。
#### 验收标准
1. WHEN 玩家完成一局游戏(胜利或失败)退出关卡时 THEN 系统 SHALL 检查是否满足插屏广告展示条件。
2. IF 距离上次插屏广告展示已超过3局 THEN 系统 SHALL 展示一次插屏广告。
3. IF 玩家已购买"去广告特权" THEN 系统 SHALL 永久跳过所有插屏广告展示。
4. WHEN 插屏广告加载失败 THEN 系统 SHALL 静默跳过,不影响玩家正常流程。
---
### 需求 3:货币体系
**用户故事:** 作为一名玩家,我希望游戏有清晰的货币体系,以便了解如何获取和使用游戏内资源。
#### 验收标准
##### 3.1 金币系统
1. WHEN 玩家完成对局 THEN 系统 SHALL 根据击杀数、通关时间等计算并发放金币奖励。
2. WHEN 玩家完成每日任务 THEN 系统 SHALL 发放对应的金币奖励。
3. WHEN 玩家消耗金币 THEN 系统 SHALL 支持以下消耗场景:升级坦克属性、购买基础道具。
4. WHEN 系统展示金币相关信息 THEN 系统 SHALL 按照 100金币 ≈ ¥0.1 的价值锚定进行经济平衡。
##### 3.2 钻石系统
5. WHEN 玩家通过充值获得钻石 THEN 系统 SHALL 按照购买的钻石包规格发放对应数量的钻石。
6. WHEN 玩家通过高级通行证或活动获得钻石 THEN 系统 SHALL 发放对应数量的钻石。
7. WHEN 玩家消耗钻石 THEN 系统 SHALL 支持以下消耗场景:购买皮肤、购买稀有道具、补充体力。
8. WHEN 系统展示钻石相关信息 THEN 系统 SHALL 按照 1钻石 ≈ ¥0.1 的价值锚定进行经济平衡。
##### 3.3 赛季币系统
9. WHEN 玩家完成赛季任务或达到段位奖励节点 THEN 系统 SHALL 发放赛季币。
10. WHEN 玩家消耗赛季币 THEN 系统 SHALL 支持兑换往季限定皮肤。
11. WHEN 赛季结束 THEN 系统 SHALL 保留玩家的赛季币余额,不清零(可跨赛季使用)。
---
### 需求 4:应用内购买(IAP)系统
**用户故事:** 作为一名玩家,我希望能通过内购获得增值服务和虚拟商品,以便提升游戏体验。
#### 验收标准
##### 4.1 去广告特权
1. WHEN 玩家在商店中购买"去广告特权"(¥30/永久) THEN 系统 SHALL 永久移除所有插屏广告。
2. IF 玩家已购买去广告特权 THEN 系统 SHALL 保留激励视频广告入口(因为是玩家主动选择观看以获取奖励)。
3. IF 玩家已购买去广告特权 THEN 系统 SHALL 在原插屏广告触发点直接跳过,无任何等待。
##### 4.2 月卡
4. WHEN 玩家购买月卡(¥12/月) THEN 系统 SHALL 立即发放月卡权益:专属头像框解锁。
5. WHEN 月卡有效期内玩家每日登录 THEN 系统 SHALL 发放100钻石的每日领取奖励。
6. WHEN 月卡到期 THEN 系统 SHALL 停止发放每日钻石,收回专属头像框(或标记为过期状态)。
7. IF 玩家开启自动续费 THEN 系统 SHALL 在到期前自动续费,前3天支持无条件退款。
##### 4.3 钻石充值包
8. WHEN 玩家购买钻石包 THEN 系统 SHALL 按以下规格发放钻石:¥6/60钻、¥30/360钻、¥68/880钻。
9. WHEN 玩家首次充值任意金额 THEN 系统 SHALL 额外赠送等值钻石(首充双倍)。
10. WHEN 玩家连续7天每日充值 THEN 系统 SHALL 在第7天额外赠送稀有皮肤奖励。
##### 4.4 皮肤礼包
11. WHEN 玩家购买皮肤礼包(¥18-68 THEN 系统 SHALL 解锁对应的限定坦克皮肤及配套技能特效。
12. WHEN 赛季更新或节日活动期间 THEN 系统 SHALL 上架对应主题的限定皮肤礼包。
##### 4.5 新手礼包
13. WHEN 新用户首次进入游戏 THEN 系统 SHALL 在24小时内展示新手礼包购买入口(¥1,价值¥30道具组合)。
14. WHEN 新手礼包倒计时结束(24小时) THEN 系统 SHALL 移除新手礼包购买入口,不再展示。
##### 4.6 支付与安全
15. WHEN 玩家发起内购 THEN 系统 SHALL 通过微信支付完成交易,交易成功后立即发放商品。
16. IF 支付过程中网络中断 THEN 系统 SHALL 在网络恢复后自动查询订单状态,补发未到账的商品。
17. WHEN 玩家购买的虚拟商品 THEN 系统 SHALL 将购买记录同步至云端,确保换设备后不丢失。
---
### 需求 5:战斗通行证(Battle Pass)系统
**用户故事:** 作为一名玩家,我希望通过完成任务解锁赛季奖励,以便获得持续的游戏目标和丰厚的回报。
#### 验收标准
##### 5.1 赛季基础设计
1. WHEN 新赛季开始 THEN 系统 SHALL 重置通行证等级为1级,赛季时长为28天(4周)。
2. WHEN 赛季进行中 THEN 系统 SHALL 为所有玩家提供免费通行证(20级),包含基础奖励(金币、普通皮肤)。
3. WHEN 玩家购买高级通行证(¥18/赛季) THEN 系统 SHALL 解锁40级奖励轨道,包含:3款限定坦克皮肤、专属头像框、聊天气泡、双倍任务经验加成、赛季结算额外30%金币。
4. WHEN 玩家获得通行证经验 THEN 系统 SHALL 更新通行证等级进度条,达到新等级时自动发放对应奖励。
##### 5.2 任务体系
5. WHEN 每日刷新时 THEN 系统 SHALL 为免费玩家生成3个每日任务(100经验/个),为高级通行证玩家额外生成2个每日任务。
6. WHEN 每周刷新时 THEN 系统 SHALL 为免费玩家生成5个每周任务(500经验/个),为高级通行证玩家额外生成3个每周任务。
7. WHEN 赛季开始时 THEN 系统 SHALL 生成10个赛季成就(1000经验/个),免费版和高级版无差异。
8. WHEN 玩家完成任务 THEN 系统 SHALL 立即发放对应经验值,并更新通行证进度。
##### 5.3 转化策略
9. WHEN 免费玩家通行证等级达到10级 THEN 系统 SHALL 展示高级通行证的前10级奖励预览(已解锁但需购买高级版才能领取)。
10. WHEN 赛季剩余时间不足3天 THEN 系统 SHALL 展示高级通行证限时8折优惠。
11. WHEN 玩家将通行证分享给3位好友 THEN 系统 SHALL 发放5折优惠券(可用于购买高级通行证)。
---
### 需求 6:社交裂变与分享变现
**用户故事:** 作为游戏运营方,我希望通过社交分享激励体系降低获客成本,以便利用微信社交链实现用户增长。
#### 验收标准
##### 6.1 分享激励
1. WHEN 玩家每日首次分享游戏 THEN 系统 SHALL 发放50金币奖励。
2. WHEN 玩家成功邀请新用户(新用户需完成新手引导) THEN 系统 SHALL 发放200金币奖励给邀请者,每日上限5人。
3. WHEN 被邀请的新用户完成新手引导 THEN 系统 SHALL 发放双倍经验卡(3天有效期)给新用户。
4. WHEN 玩家分享战绩 THEN 系统 SHALL 以概率发放稀有道具奖励,每日上限3次。
5. WHEN 玩家与好友组队完成3局对战(每局时长>2分钟) THEN 系统 SHALL 发放100钻石给双方。
##### 6.2 防作弊机制
6. WHEN 系统判定分享奖励时 THEN 系统 SHALL 进行 IP + 设备指纹去重,同一设备/IP不重复计算。
7. WHEN 系统判定邀请新用户奖励时 THEN 系统 SHALL 验证新用户已完成新手引导,未完成则不发放邀请者奖励。
##### 6.3 裂变活动
8. WHEN 运营配置"老带新活动"时 THEN 系统 SHALL 支持:邀请3位新用户送永久限定皮肤。
9. WHEN 运营配置"战队招募活动"时 THEN 系统 SHALL 支持:创建战队并招募10人,队长得500钻石。
10. WHEN 运营配置"节日助力活动"时 THEN 系统 SHALL 支持:集齐5种道具可兑换大奖,道具需好友互赠。
---
### 需求 7:皮肤商店系统
**用户故事:** 作为一名玩家,我希望能购买和装备不同的坦克皮肤,以便展示个性和获得视觉享受。
#### 验收标准
1. WHEN 玩家进入皮肤商店 THEN 系统 SHALL 展示所有可购买的坦克皮肤,按分类展示:基础皮肤(金币购买)、高级皮肤(钻石购买)、限定皮肤(活动/赛季获取)。
2. WHEN 玩家购买皮肤 THEN 系统 SHALL 扣除对应货币并解锁皮肤,皮肤永久拥有。
3. WHEN 玩家装备皮肤 THEN 系统 SHALL 在所有游戏模式中展示该皮肤外观。
4. WHEN 皮肤为限定类型(赛季限定/节日限定) THEN 系统 SHALL 在限定期结束后下架,已购买的玩家永久保留。
5. WHEN 玩家查看皮肤详情 THEN 系统 SHALL 展示皮肤预览、价格、获取途径等信息。
---
### 需求 8:体力系统
**用户故事:** 作为游戏运营方,我希望通过体力系统控制玩家游戏节奏,以便创造付费点并提升玩家留存。
#### 验收标准
1. WHEN 玩家开始一局经典模式或无尽模式 THEN 系统 SHALL 消耗1点体力。
2. WHEN 玩家体力不足 THEN 系统 SHALL 阻止进入关卡,并展示体力恢复选项(等待自然恢复/观看广告/钻石购买)。
3. WHEN 体力未满 THEN 系统 SHALL 每6分钟自动恢复1点体力,体力上限为20点。
4. WHEN 玩家使用钻石购买体力 THEN 系统 SHALL 立即恢复满体力(每日钻石购买上限3次,价格递增:5/10/20钻石)。
5. WHEN 玩家进行双人对战或3v3对战 THEN 系统 SHALL 不消耗体力(PvP模式免体力)。
---
### 需求 9:付费节奏与引导
**用户故事:** 作为游戏运营方,我希望根据玩家生命周期阶段推送合适的付费引导,以便提高付费转化率。
#### 验收标准
##### 9.1 新手期(1-3天)
1. WHEN 新用户首次进入游戏 THEN 系统 SHALL 在24小时内展示1元新手礼包弹窗(最多展示3次)。
2. WHEN 新用户首次遇到插屏广告 THEN 系统 SHALL 展示"去广告特权"推荐入口。
##### 9.2 成长期(4-14天)
3. WHEN 玩家累计登录达4天 THEN 系统 SHALL 在商店页面高亮展示月卡推荐。
4. WHEN 玩家累计登录达7天 THEN 系统 SHALL 推送钻石充值促销活动(限时加赠20%)。
##### 9.3 成熟期(15天+
5. WHEN 玩家累计登录达15天且赛季进行中 THEN 系统 SHALL 推送战斗通行证购买引导。
6. WHEN 新赛季开始 THEN 系统 SHALL 向成熟期玩家推送限量皮肤预告。
---
### 需求 10:未成年人保护与合规
**用户故事:** 作为游戏运营方,我希望游戏符合未成年人保护法规和平台合规要求,以便合法合规运营。
#### 验收标准
##### 10.1 未成年人保护
1. WHEN 系统识别到未成年用户 THEN 系统 SHALL 在22:00-8:00期间禁止登录游戏。
2. WHEN 未成年用户进行消费 THEN 系统 SHALL 限制月消费上限为¥400,单次消费超过¥50时弹出确认提示。
3. WHEN 未成年用户观看广告 THEN 系统 SHALL 限制每日广告展示不超过5次。
##### 10.2 概率公示
4. WHEN 游戏中存在随机奖励机制(宝箱、抽奖等) THEN 系统 SHALL 在对应界面明确公示所有物品的掉落概率。
##### 10.3 退款与数据隐私
5. WHEN 玩家申请退款 THEN 系统 SHALL 符合微信小游戏退款规范,支持合理退款请求。
6. WHEN 游戏收集用户数据 THEN 系统 SHALL 明确告知数据收集范围,并提供关闭选项。
##### 10.4 反作弊
7. WHEN 系统检测到同一广告源IP短时间内大量请求 THEN 系统 SHALL 触发广告反刷机制,限制该IP的广告展示。
8. WHEN 系统检测到异常大额充值行为 THEN 系统 SHALL 触发人工审核流程。
9. WHEN 系统检测到对局数据异常(如不可能的击杀数/速度) THEN 系统 SHALL 标记该账号并进行封禁处理。
---
## 边界情况与技术约束
### 边界情况
1. **广告加载失败**:激励视频加载失败时,应提供备选方案(提示稍后重试),不阻塞玩家正常流程。
2. **支付异常**:支付过程中网络中断时,需在网络恢复后自动查询订单状态并补发商品。
3. **跨设备同步**:玩家换设备登录时,所有购买记录和货币余额需从云端恢复。
4. **赛季切换**:赛季结束时,未领取的通行证奖励需给予一定的缓冲期(如3天)供玩家领取。
5. **月卡续费失败**:自动续费失败时,需通知玩家并保留3天的权益缓冲期。
6. **货币溢出**:金币/钻石数量需设置合理上限,防止数值溢出。
### 技术约束
1. 微信小游戏内购需通过微信支付接口(`wx.requestMidasPayment`)完成,需接入米大师虚拟支付。
2. 广告SDK需使用微信小游戏广告组件(`wx.createRewardedVideoAd``wx.createInterstitialAd`)。
3. 所有货币和商品数据需服务端校验,防止客户端篡改。
4. 通行证和赛季数据需服务端管理赛季时间和奖励配置。
5. 未成年人识别依赖微信平台提供的用户年龄信息接口。
### 成功标准
1. 激励视频广告转化率 ≥ 8%(复活场景)。
2. 付费率 ≥ 3%ARPPU ≥ ¥50。
3. 高级通行证购买率 ≥ 5%。
4. 广告展示不影响核心游戏体验(玩家满意度调查 ≥ 4/5)。
5. 所有内购流程零丢单率(支付成功但未发货的情况为0)。
+234
View File
@@ -0,0 +1,234 @@
# 实施计划:坦克大作战商业化
> 基于 [requirements.md](./requirements.md) 商业化需求文档,按版本阶段拆解为可执行的编码任务。
---
## V1.0 基础版 — 激励广告 + 插屏广告
- [ ] 1. 扩展 AdManager,实现场景化广告触发与频控机制
- [ ] 1.1 在 `js/managers/AdManager.js` 中新增广告场景枚举(REVIVE、DOUBLE_REWARD、CHEST_SPEED、STAMINA、FREE_GIFT),为每个场景维护独立的冷却计时器(15分钟内不重复展示同一场景广告)
- 新增 `_sceneCooldowns` Map 和 `canShowScene(sceneType)` 方法
- 新增 `showRewardedVideoForScene(sceneType, callback)` 方法,内部调用 `canShowScene` 检查后再调用 `showRewardedVideo`
- 新增每日广告次数计数(体力恢复场景每日上限5次),使用 StorageManager 持久化当日计数
- _需求:1.6 广告体验优化(验收标准15、16、17)、1.4 体力恢复广告(验收标准12)_
- [ ] 1.2 在 `js/managers/AdManager.js` 中实现广告预加载机制
- 新增 `preloadRewardedVideo()` 方法,在关卡加载时提前调用
- 在 GameScene 和 TeamGameScene 的初始化阶段调用预加载
- _需求:1.6 广告体验优化(验收标准15)_
- [ ] 1.3 优化插屏广告频控逻辑
- 将现有的 `_gamesPlayed` 计数改为基于"距上次展示的局数"判断(每3局展示一次)
- 确保 `_adFreeEnabled` 标志正确跳过所有插屏广告
- 插屏广告加载失败时静默跳过,不阻塞流程
- _需求:2 插屏广告(验收标准1、2、3、4)_
- [ ] 2. 实现复活续关广告功能
- [ ] 2.1 在 `js/scenes/GameScene.js` 的玩家死亡流程中集成复活广告
- 在玩家生命数降为0时,弹出"观看广告复活"弹窗(而非直接进入失败结算)
- 新增 `_showReviveAdDialog()` 方法,展示选择界面(观看广告 / 放弃)
- 新增 `_reviveAdUsed` 标志,确保每关最多使用1次复活
- 观看完成后调用 `_revivePlayer()` 方法:保留火力等级,在出生点重生,恢复1条生命
- 选择放弃或广告不可用时,正常进入失败结算
- _需求:1.1 复活续关广告(验收标准1、2、3、4)_
- [ ] 2.2 在 `js/scenes/TeamGameScene.js` 中同步实现 PvP 模式的复活广告(如适用)
- 根据 PvP 模式规则决定是否支持复活广告(可配置开关)
- _需求:1.1 复活续关广告(验收标准1)_
- [ ] 3. 实现双倍结算广告功能
- [ ] 3.1 在 `js/scenes/ResultScene.js` 的结算界面中添加"双倍奖励"按钮
- 在结算界面新增"观看广告获得双倍奖励"按钮
- 调用 `AdManager.showRewardedVideoForScene('DOUBLE_REWARD', callback)`
- 观看完成后将金币和经验值翻倍显示并发放
- 广告加载失败时提示"广告暂时不可用",按正常倍率发放
- _需求:1.2 双倍结算广告(验收标准5、6、7)_
- [ ] 3.2 在 `js/scenes/TeamResultScene.js` 中同步实现 PvP 结算的双倍奖励广告
- _需求:1.2 双倍结算广告(验收标准5、6、7)_
- [ ] 4. 在结算流程中集成插屏广告触发
- 在 ResultScene 和 TeamResultScene 退出关卡时调用 `AdManager.showInterstitial()`
- 确保去广告特权用户不展示
- _需求:2 插屏广告(验收标准1、2、3)_
---
## V1.5 内购版 — 货币体系 + 支付 + 皮肤商店
- [ ] 5. 实现货币系统(CurrencyManager
- [ ] 5.1 新建 `js/managers/CurrencyManager.js`,实现金币和钻石的管理
- 实现 `getGold()` / `addGold(amount)` / `spendGold(amount)` 方法
- 实现 `getDiamonds()` / `addDiamonds(amount)` / `spendDiamonds(amount)` 方法
- 所有货币变动通过 EventBus 发送事件(`currency:gold:changed``currency:diamonds:changed`),供 UI 监听更新
- 使用 StorageManager 持久化货币数据,并纳入云同步数据
- 设置货币上限防止溢出(金币上限999999,钻石上限99999
- _需求:3.1 金币系统(验收标准1、2、3)、3.2 钻石系统(验收标准5、6、7)_
- [ ] 5.2 在 `js/base/GameGlobal.js` 中注册 CurrencyManager 实例
- 在全局初始化流程中创建并挂载 `GameGlobal.currencyManager`
- _需求:3.1、3.2_
- [ ] 5.3 在 ResultScene / TeamResultScene 的结算逻辑中集成金币发放
- 根据击杀数、通关时间等计算金币奖励并调用 `CurrencyManager.addGold()`
- _需求:3.1 金币系统(验收标准1)_
- [ ] 6. 实现体力系统(StaminaManager
- [ ] 6.1 新建 `js/managers/StaminaManager.js`,实现体力管理
- 实现 `getStamina()` / `consumeStamina()` / `recoverStamina(amount)` 方法
- 实现自然恢复逻辑:每6分钟恢复1点,上限20点,使用定时器 + 离线时间差计算
- 实现钻石购买体力:每日上限3次,价格递增(5/10/20钻石)
- 实现广告恢复体力:每次恢复5点,每日上限5次
- 通过 EventBus 发送 `stamina:changed` 事件
- 使用 StorageManager 持久化体力值和上次恢复时间戳
- _需求:8 体力系统(验收标准1、2、3、4、5)、1.4 体力恢复广告(验收标准10、11、12)_
- [ ] 6.2 在 GameScene 开始关卡前检查体力
- 进入经典模式/无尽模式前调用 `StaminaManager.consumeStamina()`
- 体力不足时弹出恢复选项弹窗(等待/广告/钻石)
- PvP 模式(TeamGameScene)不消耗体力
- _需求:8 体力系统(验收标准1、2、5)_
- [ ] 7. 实现支付模块(PaymentManager
- [ ] 7.1 新建 `js/managers/PaymentManager.js`,封装微信支付接口
- 封装 `wx.requestMidasPayment` 调用,实现 `purchase(productId, callback)` 方法
- 实现订单状态查询和补发逻辑(网络中断后自动重试)
- 实现商品配置表:去广告特权(¥30)、月卡(¥12)、钻石包(¥6/¥30/¥68)、新手礼包(¥1)、皮肤礼包(¥18-68)、高级通行证(¥18)
- 购买成功后通过 EventBus 发送 `purchase:completed` 事件
- 将购买记录同步至 StorageManager 和云端
- _需求:4.6 支付与安全(验收标准15、16、17)_
- [ ] 7.2 实现去广告特权购买逻辑
- 购买成功后调用 `AdManager.enableAdFree()`
- 保留激励视频入口,仅移除插屏广告
- _需求:4.1 去广告特权(验收标准1、2、3)_
- [ ] 7.3 实现钻石充值包购买逻辑
- 按规格发放钻石(60/360/880),首充双倍
- 使用 StorageManager 记录首充状态
- _需求:4.3 钻石充值包(验收标准8、9)_
- [ ] 7.4 实现新手礼包逻辑
- 新用户首次进入游戏后24小时内展示购买入口
- 倒计时结束后自动移除入口
- _需求:4.5 新手礼包(验收标准13、14)_
- [ ] 8. 实现皮肤系统与商店场景
- [ ] 8.1 新建 `js/data/SkinData.js`,定义皮肤配置数据
- 定义皮肤分类(基础/高级/限定)、价格(金币/钻石)、获取途径、皮肤资源映射
- _需求:7 皮肤商店系统(验收标准1、5)_
- [ ] 8.2 新建 `js/managers/SkinManager.js`,实现皮肤解锁与装备管理
- 实现 `getOwnedSkins()` / `unlockSkin(skinId)` / `equipSkin(skinId)` / `getCurrentSkin()` 方法
- 使用 StorageManager 持久化已解锁皮肤和当前装备
- 纳入云同步数据
- _需求:7 皮肤商店系统(验收标准2、3、4)_
- [ ] 8.3 新建 `js/scenes/ShopScene.js`,实现商店界面
- 展示皮肤列表(分类标签页:基础/高级/限定)
- 展示皮肤预览、价格、购买/装备按钮
- 集成 CurrencyManager 扣款和 SkinManager 解锁
- 展示去广告特权、钻石充值包等 IAP 商品入口
- _需求:7 皮肤商店系统(验收标准1、2、5)、4.1、4.3_
- [ ] 8.4 在 `js/scenes/MenuScene.js` 中添加商店入口按钮
- 点击后通过 SceneManager 跳转到 ShopScene
- _需求:7 皮肤商店系统_
- [ ] 8.5 在 Tank 渲染逻辑中集成皮肤系统
- 修改 `js/entities/Tank.js``PlayerTank.js`,根据 `SkinManager.getCurrentSkin()` 加载对应皮肤资源
- _需求:7 皮肤商店系统(验收标准3)_
---
## V2.0 赛季版 — 战斗通行证 + 任务体系
- [ ] 9. 实现战斗通行证系统(BattlePassManager
- [ ] 9.1 新建 `js/data/BattlePassData.js`,定义赛季配置
- 定义赛季时长(28天)、等级数(免费20级/高级40级)、每级奖励内容
- 定义每日任务池、每周任务池、赛季成就列表及对应经验值
- _需求:5.1 赛季基础设计(验收标准1、2、3)、5.2 任务体系(验收标准5、6、7)_
- [ ] 9.2 新建 `js/managers/BattlePassManager.js`,实现通行证核心逻辑
- 实现赛季状态管理:当前赛季ID、开始/结束时间、玩家等级、经验值
- 实现 `addExp(amount)` / `getLevel()` / `claimReward(level)` 方法
- 实现免费/高级通行证奖励轨道区分
- 实现任务生成与完成追踪(每日3+2任务、每周5+3任务、赛季10成就)
- 赛季结束时保留赛季币余额,提供3天奖励领取缓冲期
- 使用 StorageManager 持久化赛季进度
- _需求:5.1(验收标准1、2、3、4)、5.2(验收标准5、6、7、8)_
- [ ] 9.3 新建 `js/scenes/BattlePassScene.js`,实现通行证界面
- 展示等级进度条、免费/高级奖励轨道
- 展示每日任务、每周任务、赛季成就列表及完成状态
- 高级通行证购买入口(集成 PaymentManager
- 免费玩家达到10级时展示高级版奖励预览
- 赛季剩余不足3天时展示8折优惠
- _需求:5.1(验收标准2、3、4)、5.3 转化策略(验收标准9、10)_
- [ ] 9.4 在 MenuScene 中添加通行证入口,在 GameScene/TeamGameScene 结算时触发任务进度更新
- 对局结束后检查并更新任务完成状态(如"击杀N个敌人"、"通关N次"等)
- _需求:5.2 任务体系(验收标准8)_
- [ ] 10. 实现月卡系统
- [ ] 10.1 在 `js/managers/PaymentManager.js` 中新增月卡购买与状态管理
- 实现月卡有效期检查、每日登录领取100钻石、专属头像框解锁/过期
- 使用 StorageManager 记录月卡购买时间和每日领取状态
- _需求:4.2 月卡(验收标准4、5、6)_
- [ ] 10.2 在游戏启动流程中检查月卡状态并弹出每日领取弹窗
- _需求:4.2 月卡(验收标准5)_
---
## V2.5 社交版 — 分享裂变 + 付费引导 + 合规
- [ ] 11. 扩展 ShareManager,实现分享激励体系
- [ ] 11.1 在 `js/managers/ShareManager.js` 中新增分享奖励逻辑
- 每日首次分享发放50金币(通过 CurrencyManager
- 分享战绩概率发放稀有道具,每日上限3次
- 使用 StorageManager 记录每日分享次数和奖励领取状态
- _需求:6.1 分享激励(验收标准1、4)_
- [ ] 11.2 实现邀请新用户奖励机制
- 新用户完成新手引导后,向邀请者发放200金币(每日上限5人)
- 新用户获得双倍经验卡(3天有效期)
- 实现 IP + 设备指纹去重防作弊(服务端校验)
- _需求:6.1 分享激励(验收标准2、3)、6.2 防作弊机制(验收标准6、7)_
- [ ] 12. 实现付费节奏引导系统
- [ ] 12.1 新建 `js/managers/PromotionManager.js`,实现生命周期付费引导
- 根据玩家累计登录天数判断所处阶段(新手期/成长期/成熟期)
- 新手期(1-3天):展示新手礼包弹窗(最多3次)、去广告特权推荐
- 成长期(4-14天):高亮月卡推荐、钻石充值促销(限时加赠20%)
- 成熟期(15天+):推送通行证购买引导、限量皮肤预告
- 使用 StorageManager 记录弹窗展示次数和登录天数
- _需求:9.1(验收标准1、2)、9.2(验收标准3、4)、9.3(验收标准5、6)_
- [ ] 12.2 在 `game.js` 启动流程和 MenuScene 中集成 PromotionManager 的引导触发
- 登录时检查阶段并展示对应引导弹窗
- _需求:9 付费节奏与引导_
- [ ] 13. 实现未成年人保护与合规机制
- [ ] 13.1 新建 `js/managers/ComplianceManager.js`,实现合规检查
- 实现未成年人识别(调用微信平台用户年龄信息接口)
- 实现游戏时间限制:22:00-8:00禁止未成年人登录
- 实现消费限制:月消费上限¥400,单次>¥50弹出确认
- 实现广告展示限制:未成年人每日广告不超过5次
- _需求:10.1 未成年人保护(验收标准1、2、3)_
- [ ] 13.2 在宝箱/抽奖等随机奖励界面添加概率公示
- 在对应 UI 中明确展示所有物品的掉落概率
- _需求:10.2 概率公示(验收标准4)_
- [ ] 13.3 在服务端 `server/index.js` 中新增反作弊检测逻辑
- 广告反刷:同一IP短时间大量请求时限制广告展示
- 异常充值检测:大额充值触发人工审核标记
- 对局数据校验:异常击杀数/速度标记封禁
- _需求:10.4 反作弊(验收标准7、8、9)_
- [ ] 14. 国际化支持:为所有商业化 UI 文案添加 i18n 翻译
-`js/i18n/zh.js``js/i18n/en.js` 中新增商店、通行证、体力、货币、弹窗等所有商业化相关的翻译键值
- 确保所有新增场景和弹窗使用 `I18n.t()` 获取文案
- _需求:全部商业化需求的 UI 文案_
+277
View File
@@ -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 提供音效开关、音乐开关、振动开关等选项。
---
### 需求 133v3 对战模式
**用户故事:** 作为一名玩家,我希望能与好友组队进行 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分钟内理解核心操作。
+151
View File
@@ -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_
@@ -0,0 +1,260 @@
# 需求文档:UI文案国际化(i18n)
## 引言
《坦克探险》微信小游戏需要支持中英文双语UI。根据用户所在区域自动展示对应语言的文案,中文地区显示中文,其他地区显示英文。
---
## 技术方案
### 1. i18n 模块结构
`js/i18n/` 目录下创建以下文件:
- **`I18n.js`** — 核心管理器,负责语言检测和文案获取
- **`zh.js`** — 中文语言包
- **`en.js`** — 英文语言包
### 2. 语言检测
通过微信 `wx.getSystemInfoSync().language` 自动检测:
- `zh_CN``zh_TW``zh_HK` 等以 `zh` 开头 → 使用中文
- 其他 → 使用英文(默认 fallback)
### 3. 使用方式
各场景文件通过 `const { t } = require('../i18n/I18n');` 引入翻译函数:
- 简单文案:`t('menu.title')``'坦克探险'` / `'Tank Adventure'`
- 带参数模板:`t('pvp.hp', { count: 3 })``'生命 x3'` / `'HP x3'`
### 4. Key 命名规范
按场景分组,使用点号分隔:
- `menu.*` — 主菜单
- `room.*` — 双人对战房间
- `teamRoom.*` — 3v3团队房间
- `pvp.*` — 双人对战游戏
- `team.*` — 3v3团队游戏
- `pvpResult.*` — 双人对战结算
- `teamResult.*` — 3v3团队结算
- `game.*` — 经典模式
- `common.*` — 通用文案
---
## 需求
### 需求 1:创建 i18n 核心模块
**用户故事:** 作为开发者,我需要一个 i18n 模块来管理多语言文案,支持自动语言检测和带参数的文案模板。
#### 验收标准
1. 创建 `js/i18n/I18n.js`,提供 `t(key, params)` 函数
2. 创建 `js/i18n/zh.js`,包含所有中文文案
3. 创建 `js/i18n/en.js`,包含所有英文文案
4. 通过 `wx.getSystemInfoSync().language` 自动检测语言
5. 支持 `{variable}` 占位符插值
6. 缺失 key 时 fallback 到英文,仍缺失则返回 key 本身
---
### 需求 2:主菜单场景(MenuScenei18n 化
#### 验收标准
| Key | 中文 | 英文 |
|-----|------|------|
| `menu.title` | 坦克探险 | Tank Adventure |
| `menu.subtitle` | 经典坦克对战 | TANK WAR |
| `menu.classic` | 经典模式 | Classic |
| `menu.endless` | 无尽模式 | Endless |
| `menu.pvp` | 双人对战 | PVP |
| `menu.team3v3` | 3v3 对战 | 3v3 Battle |
| `menu.ranking` | 排行榜 | Ranking |
| `menu.settings` | 设置 | Settings |
---
### 需求 3:双人对战房间场景(RoomScenei18n 化
#### 验收标准
| Key | 中文 | 英文 |
|-----|------|------|
| `room.title` | 双人对战 | PVP Battle |
| `room.idleHint` | 创建房间或输入房间号加入 | Create a room or join with a code |
| `room.create` | 创建房间 | Create Room |
| `room.join` | 加入房间 | Join Room |
| `room.connecting` | 连接中{dots} | Connecting{dots} |
| `room.roomCode` | 房间号: | Room Code: |
| `room.waiting` | 等待对手加入{dots} | Waiting for opponent{dots} |
| `room.shareHint` | 将房间号分享给好友 | Share the room code with your friend |
| `room.inputCode` | 输入房间号: | Enter Room Code: |
| `room.opponentFound` | 对手已找到! | Opponent found! |
| `room.starting` | 即将开始... | Game starting... |
| `room.tapBack` | 点击任意位置返回 | Tap anywhere to go back |
| `common.back` | ← 返回 | ← Back |
| `common.joinBtn` | 加入 | Join |
| `common.cannotConnect` | 无法连接服务器 | Cannot connect to server |
| `common.connectFailed` | 连接失败 | Connection failed |
| `common.disconnected` | 与服务器断开连接 | Disconnected from server |
---
### 需求 43v3 团队房间场景(TeamRoomScenei18n 化
#### 验收标准
| Key | 中文 | 英文 |
|-----|------|------|
| `teamRoom.title` | 3v3 团队对战 | 3v3 Team Battle |
| `teamRoom.chooseMode` | 选择游戏方式 | Choose how to play |
| `teamRoom.createTeam` | 🎮 组队开黑 | 🎮 Create Team |
| `teamRoom.soloMatch` | ⚡ 快速匹配 | ⚡ Quick Match |
| `teamRoom.teamId` | 队伍:{id} | Team: {id} |
| `teamRoom.leader` | 队长 | Leader |
| `teamRoom.ready` | ✓ 已准备 | ✓ Ready |
| `teamRoom.notReady` | 未准备 | Not Ready |
| `teamRoom.emptySlot` | 空位 | Empty |
| `teamRoom.invite` | 📨 邀请好友 | 📨 Invite |
| `teamRoom.startMatch` | 🔍 开始匹配 | 🔍 Start Match |
| `teamRoom.disband` | 解散队伍 | Disband |
| `teamRoom.readyBtn` | ✓ 准备 | ✓ Ready |
| `teamRoom.cancelReady` | 取消准备 | Cancel Ready |
| `teamRoom.leaveTeam` | 退出队伍 | Leave Team |
| `teamRoom.matching` | 匹配中{dots} | Matching{dots} |
| `teamRoom.waitTime` | 已等待 {seconds} 秒 | Waited {seconds}s |
| `teamRoom.cancelMatch` | 取消匹配 | Cancel Match |
| `teamRoom.matchFound` | 对手已找到! | Match found! |
| `teamRoom.enterBattle` | 即将进入战斗... | Entering battle... |
| `teamRoom.tapBack` | 点击任意位置返回 | Tap anywhere to go back |
| `teamRoom.shareTitle` | 坦克3v3,速来开黑! | Tank 3v3, join the battle! |
| `common.kicked` | 你已被踢出队伍 | You have been kicked from the team |
---
### 需求 5:双人对战游戏场景(PvpGameScenei18n 化
#### 验收标准
| Key | 中文 | 英文 |
|-----|------|------|
| `pvp.playerLabel` | P{slot} (我方) | P{slot} (You) |
| `pvp.hp` | 生命 x{count} | HP x{count} |
| `pvp.kills` | 击杀:{count} | Kills: {count} |
| `common.paused` | 暂停 | PAUSED |
| `common.tapContinue` | 点击继续 | Tap to continue |
| `pvp.youWin` | 你赢了! | YOU WIN! |
| `pvp.draw` | 平局 | DRAW |
| `pvp.youLose` | 你输了 | YOU LOSE |
---
### 需求 63v3 团队对战游戏场景(TeamGameScenei18n 化
#### 验收标准
| Key | 中文 | 英文 |
|-----|------|------|
| `team.teamA` | A队 | Team A |
| `team.teamB` | B队 | Team B |
| `team.myTeam` | 我方:{team}队 | You: {team} Team |
| `team.killDeath` | 杀:{kills} 亡:{deaths} | K:{kills} D:{deaths} |
| `team.respawn` | {seconds}秒后重生 | Respawning in {seconds}s |
| `team.victory` | 胜利! | VICTORY! |
| `team.defeat` | 失败 | DEFEAT |
| `team.baseHpSummary` | A队:{hpA} 生命 \| B队:{hpB} 生命 | Team A: {hpA} HP \| Team B: {hpB} HP |
| `team.disconnectTitle` | ⚠ 连接断开 | ⚠ Connection Lost |
| `team.reconnecting` | 重连中{dots} ({attempts}/{max}) | Reconnecting{dots} ({attempts}/{max}) |
| `team.reconnectHint` | 请稍候,您的坦克将由AI代管 | Please wait, your tank will be controlled by AI |
---
### 需求 7:双人对战结算场景(PvpResultScenei18n 化
#### 验收标准
| Key | 中文 | 英文 |
|-----|------|------|
| `pvpResult.title` | 对战结果 | MATCH RESULT |
| `pvpResult.victory` | 🏆 胜利! | 🏆 VICTORY! |
| `pvpResult.draw` | ⚔️ 平局 | ⚔️ DRAW |
| `pvpResult.defeat` | 💀 失败 | 💀 DEFEAT |
| `pvpResult.kills` | 击杀 | Kills |
| `pvpResult.lives` | 生命 | Lives |
| `pvpResult.timeRemaining` | 剩余时间:{time} | Time remaining: {time} |
| `pvpResult.rematch` | 再来一局 | Rematch |
| `pvpResult.backMenu` | 返回菜单 | Back to Menu |
---
### 需求 83v3 团队结算场景(TeamResultScenei18n 化
#### 验收标准
| Key | 中文 | 英文 |
|-----|------|------|
| `teamResult.title` | 3v3 对战结果 | 3v3 MATCH RESULT |
| `teamResult.victory` | 🏆 胜利! | 🏆 VICTORY! |
| `teamResult.defeat` | 💀 失败 | 💀 DEFEAT |
| `teamResult.teamAHp` | A队:{hp} 生命 | Team A: {hp} HP |
| `teamResult.teamBHp` | B队:{hp} 生命 | Team B: {hp} HP |
| `teamResult.baseDestroyed` | 基地被摧毁 | Base Destroyed |
| `teamResult.disconnectedReason` | 断线 | Disconnected |
| `teamResult.teamAHeader` | A队 | Team A |
| `teamResult.teamBHeader` | B队 | Team B |
| `teamResult.myTeamSuffix` | (我方) | (You) |
| `teamResult.player` | 玩家 | Player |
| `teamResult.k` | 杀 | K |
| `teamResult.d` | 亡 | D |
| `teamResult.a` | 助 | A |
| `teamResult.dmg` | 伤害 | DMG |
| `teamResult.bot` | 🤖 机器人 | 🤖 Bot |
| `teamResult.duration` | 对战时长:{time} | Match duration: {time} |
| `teamResult.mvp` | ⭐ MVP{name}{kills} 击杀) | ⭐ MVP: {name} ({kills} kills) |
| `teamResult.rankUp` | 📈 积分 +{points} | 📈 Rank +{points} |
| `teamResult.mvpBonus` | MVP加成 +5 | (MVP bonus +5) |
| `teamResult.rankDown` | 📉 积分 -{points} | 📉 Rank -{points} |
| `teamResult.rematch` | 再来一局 | Rematch |
| `teamResult.backMenu` | 返回菜单 | Back to Menu |
---
### 需求 9:经典模式游戏场景(GameScenei18n 化
#### 验收标准
| Key | 中文 | 英文 |
|-----|------|------|
| `game.level` | 第 {level} 关 | Level {level} |
| `game.hp` | 生命 x{count} | HP x{count} |
| `game.fireLevel` | LV{level} | LV{level} |
| `game.enemies` | 敌人: {count} | Enemies: {count} |
| `game.score` | {score}分 | {score}pts |
| `game.gameOver` | 游戏结束 | GAME OVER |
| `game.stageClear` | 关卡通过! | STAGE CLEAR! |
---
## 边界情况与技术约束
### 边界情况
1. **中文字体渲染**Canvas 中使用 `'Arial'` 字体渲染中文时,微信小游戏环境下系统会自动 fallback 到系统中文字体,无需额外处理。
2. **文案长度变化**:中英文文案长度不同,替换后需确认UI布局不会溢出或错位。
3. **`GameScene` 中的字符串比较**`text === '游戏结束'` 改为 `text === t('game.gameOver')`,确保逻辑不受语言影响。
4. **错误消息来源**:部分错误消息可能来自服务端(如 `data.message`),本次仅替换客户端硬编码的文案。
### 技术约束
1. 所有文案替换涉及 `js/scenes/` 目录下的场景文件和新建的 `js/i18n/` 模块。
2. 替换操作不应影响游戏逻辑,仅修改展示层的字符串。
3. 不需要在设置页面增加语言切换选项,完全依赖微信系统语言自动检测。
### 成功标准
1. 中文区域用户看到全中文UI,非中文区域用户看到全英文UI。
2. 替换后游戏功能正常,无因文案修改导致的逻辑错误。
3. 文案在各场景中布局合理,无溢出或错位现象。
@@ -0,0 +1,75 @@
# 实施计划:UI英文文案统一替换为中文
- [ ] 1. MenuScene 主菜单英文文案中文化
- 将副标题 `'TANK WAR'` 替换为 `'经典坦克对战'`
- 检查替换后文本居中是否正常,必要时调整绘制坐标
- _需求:1.1_
- [ ] 2. RoomScene 双人对战房间英文文案中文化
- 替换空闲状态提示 `'Create a room or join with a code'``'创建房间或输入房间号加入'`
- 替换连接状态 `'Connecting...'``'连接中...'`
- 替换等待状态 `'Room Code:'``'房间号:'``'Waiting for opponent...'``'等待对手加入...'``'Share the room code with your friend'``'将房间号分享给好友'`
- 替换输入状态 `'Enter Room Code:'``'输入房间号:'`
- 替换倒计时状态 `'Opponent found!'``'对手已找到!'``'Game starting...'``'即将开始...'`
- 替换错误状态 `'Tap anywhere to go back'``'点击任意位置返回'`
- 替换错误消息 `'Cannot connect to server'``'无法连接服务器'``'Connection failed'``'连接失败'``'Disconnected from server'``'与服务器断开连接'`
- _需求:2.1 ~ 2.12_
- [ ] 3. TeamRoomScene 3v3团队房间英文文案中文化
- 替换模式选择提示 `'Choose how to play'``'选择游戏方式'`
- 替换队伍ID显示 `'Team: xxx'``'队伍:xxx'`
- 替换错误消息 `'Cannot connect to server'``'无法连接服务器'``'You have been kicked from the team'``'你已被踢出队伍'``'Connection failed'``'连接失败'``'Disconnected from server'``'与服务器断开连接'`
- _需求:3.1 ~ 3.6_
- [ ] 4. PvpGameScene 双人对战游戏场景英文文案中文化
- 替换暂停覆盖层 `'PAUSED'``'暂停'``'Tap to continue'``'点击继续'`
- 替换游戏结束覆盖层 `'YOU WIN!'``'你赢了!'``'DRAW'``'平局'``'YOU LOSE'``'你输了'`
- 替换HUD玩家标识 `'P1 (You)'` / `'P2 (You)'``'P1 (我方)'` / `'P2 (我方)'`
- 替换HUD生命值 `'HP'``'生命'`
- 替换HUD击杀数 `'Kills:'``'击杀:'`
- _需求:4.1 ~ 4.8_
- [ ] 5. TeamGameScene 3v3团队对战游戏场景英文文案中文化
- 替换暂停覆盖层 `'PAUSED'``'暂停'``'Tap to continue'``'点击继续'`
- 替换游戏结束覆盖层 `'VICTORY!'``'胜利!'``'DEFEAT'``'失败'`
- 替换游戏结束基地HP显示 `'Team A: x HP | Team B: x HP'``'A队:x 生命 | B队:x 生命'`
- 替换HUD队伍标签 `'Team A'``'A队'``'Team B'``'B队'`
- 替换HUD玩家所属队伍 `'You: Team A'``'我方:A队'`
- 替换HUD队伍统计 `'K:x D:x'``'杀:x 亡:x'`
- 替换重生倒计时 `'Respawning in Xs'``'X秒后重生'`
- _需求:5.1 ~ 5.9_
- [ ] 6. PvpResultScene 双人对战结算场景英文文案中文化
- 替换结算标题 `'MATCH RESULT'``'对战结果'`
- 替换胜负结果 `'🏆 VICTORY!'``'🏆 胜利!'``'⚔️ DRAW'``'⚔️ 平局'``'💀 DEFEAT'``'💀 失败'`
- 替换玩家标识 `'P1 (You)'` / `'P2 (You)'``'P1 (我方)'` / `'P2 (我方)'`
- 替换统计表头 `'Kills'``'击杀'``'Lives'``'生命'`
- 替换剩余时间 `'Time remaining:'``'剩余时间:'`
- _需求:6.1 ~ 6.7_
- [ ] 7. TeamResultScene 3v3团队结算场景英文文案中文化
- 替换结算标题 `'3v3 MATCH RESULT'``'3v3 对战结果'`
- 替换胜负结果 `'🏆 VICTORY!'``'🏆 胜利!'``'💀 DEFEAT'``'💀 失败'`
- 替换基地HP `'Team A: x HP'``'A队:x 生命'``'Team B: x HP'``'B队:x 生命'`
- 替换胜负原因 `'Base Destroyed'``'基地被摧毁'``'Disconnected'``'断线'`
- 替换统计表头 `'Team A (You)'` / `'Team B (You)'``'A队 (我方)'` / `'B队 (我方)'`
- 替换列标题 `'Player'``'玩家'``'K'``'杀'``'D'``'亡'``'A'``'助'``'DMG'``'伤害'`
- 替换对战时长 `'Match duration:'``'对战时长:'`
- 替换MVP信息 `'⭐ MVP: xxx (x kills)'``'⭐ MVPxxxx 击杀)'`
- 替换段位积分 `'📈 Rank +x'``'📈 积分 +x'``'(MVP bonus +5)'``'MVP加成 +5'``'📉 Rank -x'``'📉 积分 -x'`
- 替换Bot名称 `'Bot'``'机器人'`
- _需求:7.1 ~ 7.11_
- [ ] 8. GameScene 经典模式游戏场景英文文案中文化
- 替换HUD生命值 `'HP'``'生命'`
- 替换游戏结束文案 `'GAME OVER'``'游戏结束'``'STAGE CLEAR'``'关卡通过'`(如存在)
- **注意**:同步修改代码中 `text === 'GAME OVER'` 等字符串比较逻辑,改为 `text === '游戏结束'`
- 火力等级 `'LV'` 为通用缩写,可保留不改
- _需求:8.1 ~ 8.3_
- [ ] 9. 全局UI布局验证与字体适配
- 检查所有场景中 Canvas 字体设置,确认中文渲染正常(如 `'Arial'` 字体对中文的支持)
- 验证中文文案替换后各场景的文本居中、按钮宽度、布局间距是否正常
- 对文案长度变化较大的位置(如 `'Share the room code with your friend'``'将房间号分享给好友'`)重点检查是否溢出
- 确保模板字符串中的动态变量插值逻辑未被破坏
- _需求:边界情况 1、2、3、5_