first commit
This commit is contained in:
@@ -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)。
|
||||
@@ -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 文案_
|
||||
@@ -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_
|
||||
@@ -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:主菜单场景(MenuScene)i18n 化
|
||||
|
||||
#### 验收标准
|
||||
|
||||
| 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:双人对战房间场景(RoomScene)i18n 化
|
||||
|
||||
#### 验收标准
|
||||
|
||||
| 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 |
|
||||
|
||||
---
|
||||
|
||||
### 需求 4:3v3 团队房间场景(TeamRoomScene)i18n 化
|
||||
|
||||
#### 验收标准
|
||||
|
||||
| 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:双人对战游戏场景(PvpGameScene)i18n 化
|
||||
|
||||
#### 验收标准
|
||||
|
||||
| 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 |
|
||||
|
||||
---
|
||||
|
||||
### 需求 6:3v3 团队对战游戏场景(TeamGameScene)i18n 化
|
||||
|
||||
#### 验收标准
|
||||
|
||||
| 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:双人对战结算场景(PvpResultScene)i18n 化
|
||||
|
||||
#### 验收标准
|
||||
|
||||
| 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 |
|
||||
|
||||
---
|
||||
|
||||
### 需求 8:3v3 团队结算场景(TeamResultScene)i18n 化
|
||||
|
||||
#### 验收标准
|
||||
|
||||
| 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:经典模式游戏场景(GameScene)i18n 化
|
||||
|
||||
#### 验收标准
|
||||
|
||||
| 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)'` → `'⭐ MVP:xxx(x 击杀)'`
|
||||
- 替换段位积分 `'📈 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_
|
||||
Reference in New Issue
Block a user