refactor(game): 移除已弃用的事件常量
- 删除 UpdateHero 和 UpdateFightHero 事件 - 移除 MISSION_UPDATE 事件常量 - 优化游戏事件枚举定义
This commit is contained in:
363
.qoder/repowiki/zh/content/奖励系统/奖励UI交互/MissionComp事件处理机制.md
Normal file
363
.qoder/repowiki/zh/content/奖励系统/奖励UI交互/MissionComp事件处理机制.md
Normal file
@@ -0,0 +1,363 @@
|
||||
# MissionComp事件处理机制
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts)
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构概览](#项目结构概览)
|
||||
3. [核心组件分析](#核心组件分析)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [事件处理流程](#事件处理流程)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
MissionComp.ts是游戏战斗系统的核心控制器,负责管理整个任务生命周期中的事件监听、处理和游戏状态管理。该组件通过事件驱动的方式协调各个子系统的运作,包括战斗准备、怪物生成、英雄死亡检测、战斗结束处理等功能。
|
||||
|
||||
## 项目结构概览
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "游戏地图模块"
|
||||
MissionComp[MissionComp<br/>任务控制器]
|
||||
MissionMonComp[MissionMonComp<br/>怪物控制器]
|
||||
VictoryComp[VictoryComp<br/>胜利界面]
|
||||
end
|
||||
subgraph "英雄系统"
|
||||
HeroViewComp[HeroViewComp<br/>英雄视图组件]
|
||||
HeroConComp[HeroConComp<br/>英雄控制组件]
|
||||
end
|
||||
subgraph "技能系统"
|
||||
AtkConCom[AtkConCom<br/>攻击控制组件]
|
||||
SkillViewCom[SkillViewCom<br/>技能视图组件]
|
||||
end
|
||||
subgraph "事件系统"
|
||||
GameEvent[GameEvent<br/>事件枚举]
|
||||
MessageCenter[消息中心]
|
||||
end
|
||||
MissionComp --> GameEvent
|
||||
MissionComp --> MessageCenter
|
||||
MissionMonComp --> GameEvent
|
||||
HeroViewComp --> GameEvent
|
||||
AtkConCom --> GameEvent
|
||||
MessageCenter --> MissionComp
|
||||
MessageCenter --> MissionMonComp
|
||||
MessageCenter --> HeroViewComp
|
||||
MessageCenter --> VictoryComp
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L151)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L1-L70)
|
||||
|
||||
## 核心组件分析
|
||||
|
||||
MissionComp作为游戏战斗系统的核心控制器,主要负责以下功能:
|
||||
|
||||
### 主要职责
|
||||
- **事件监听管理**:注册并处理各种游戏事件
|
||||
- **战斗状态控制**:管理战斗开始、进行、结束的状态转换
|
||||
- **资源清理**:战斗结束后清理游戏实体和组件
|
||||
- **数据初始化**:每局游戏开始时初始化相关数据
|
||||
|
||||
### 关键属性
|
||||
- `rewards`:掉落物品奖励数组
|
||||
- `game_data`:游戏统计数据(经验、金币、钻石)
|
||||
- `node`:Cocos节点引用
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L15-L30)
|
||||
|
||||
## 架构概览
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as 玩家
|
||||
participant MissionComp as MissionComp
|
||||
participant MissionMonComp as MissionMonComp
|
||||
participant HeroViewComp as HeroViewComp
|
||||
participant VictoryComp as VictoryComp
|
||||
participant ECS as ECS系统
|
||||
Player->>MissionComp : 启动任务
|
||||
MissionComp->>MissionComp : data_init()
|
||||
MissionComp->>MissionComp : mission_start()
|
||||
MissionComp->>MissionMonComp : GameEvent.FightReady
|
||||
MissionMonComp->>MissionMonComp : 刷怪
|
||||
MissionComp->>MissionComp : to_fight()
|
||||
MissionComp->>MissionComp : GameEvent.FightStart
|
||||
loop 战斗进行中
|
||||
HeroViewComp->>MissionComp : GameEvent.HeroDead
|
||||
MissionComp->>MissionComp : do_hero_dead()
|
||||
HeroViewComp->>MissionComp : GameEvent.MonDead
|
||||
MissionComp->>MissionComp : do_mon_dead()
|
||||
end
|
||||
MissionComp->>MissionComp : fight_end()
|
||||
MissionComp->>ECS : cleanComponents()
|
||||
MissionComp->>VictoryComp : 打开胜利界面
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L151)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L34-L80)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### onLoad方法中的事件注册
|
||||
|
||||
MissionComp在onLoad方法中注册了多个关键事件监听器:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MissionComp {
|
||||
+onLoad() void
|
||||
+do_mon_dead(event, data) void
|
||||
+do_hero_dead(event, data) void
|
||||
+fight_end() void
|
||||
+mission_start() Promise~void~
|
||||
+data_init() void
|
||||
-cleanComponents() void
|
||||
}
|
||||
class GameEvent {
|
||||
<<enumeration>>
|
||||
MissionStart
|
||||
FightEnd
|
||||
HeroDead
|
||||
MonDead
|
||||
FightReady
|
||||
FightStart
|
||||
MissionEnd
|
||||
}
|
||||
MissionComp --> GameEvent : 监听事件
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L25-L32)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L10-L60)
|
||||
|
||||
#### 事件监听器详解
|
||||
|
||||
1. **MissionStart事件**:任务开始事件
|
||||
- 触发时机:任务初始化时
|
||||
- 处理逻辑:发送FightReady事件,激活节点,初始化数据
|
||||
|
||||
2. **MonDead事件**:怪物死亡事件
|
||||
- 触发时机:怪物被击败时
|
||||
- 处理逻辑:减少怪物计数
|
||||
|
||||
3. **HeroDead事件**:英雄死亡事件
|
||||
- 触发时机:英雄生命值归零时
|
||||
- 处理逻辑:减少英雄计数,判断游戏失败
|
||||
|
||||
4. **FightEnd事件**:战斗结束事件
|
||||
- 触发时机:战斗结束时
|
||||
- 处理逻辑:延迟清理游戏实体
|
||||
|
||||
5. **MissionEnd事件**:任务结束事件
|
||||
- 触发时机:任务完成或失败时
|
||||
- 处理逻辑:隐藏任务节点
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L25-L32)
|
||||
|
||||
### fight_end方法的延迟清理机制
|
||||
|
||||
fight_end方法实现了战斗结束后的延迟清理逻辑:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([战斗结束]) --> Delay["延迟0.5秒"]
|
||||
Delay --> StopGame["停止游戏播放<br/>smc.mission.play=false"]
|
||||
StopGame --> StopPause["停止暂停<br/>smc.mission.pause=false"]
|
||||
StopPause --> CleanComponents["调用cleanComponents()"]
|
||||
CleanComponents --> QueryHeroes["查询所有HeroViewComp组件"]
|
||||
QueryHeroes --> RemoveHero["移除HeroViewComp组件"]
|
||||
RemoveHero --> DestroyHero["销毁英雄实体"]
|
||||
DestroyHero --> QueryAtk["查询所有AtkConCom组件"]
|
||||
QueryAtk --> RemoveAtk["移除AtkConCom组件"]
|
||||
RemoveAtk --> DestroyAtk["销毁攻击实体"]
|
||||
DestroyAtk --> QuerySkill["查询所有SkillViewCom组件"]
|
||||
QuerySkill --> RemoveSkill["移除SkillViewCom组件"]
|
||||
RemoveSkill --> DestroySkill["销毁技能实体"]
|
||||
DestroySkill --> End([清理完成])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L108-L116)
|
||||
|
||||
#### cleanComponents方法实现细节
|
||||
|
||||
cleanComponents方法通过ECS查询系统清理不同类型的游戏实体:
|
||||
|
||||
- **英雄实体清理**:查询所有带有HeroViewComp组件的实体
|
||||
- **攻击实体清理**:查询所有带有AtkConCom组件的实体
|
||||
- **技能实体清理**:查询所有带有SkillViewCom组件的实体
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L125-L130)
|
||||
|
||||
### do_hero_dead方法的游戏失败判定
|
||||
|
||||
do_hero_dead方法实现了英雄死亡时的游戏失败判定逻辑:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
HeroDead[英雄死亡事件] --> ReduceCount["减少英雄计数<br/>smc.vmdata.mission_data.hero_num--"]
|
||||
ReduceCount --> CheckCount{"英雄计数 <= 0?"}
|
||||
CheckCount --> |否| Continue[继续战斗]
|
||||
CheckCount --> |是| DispatchEnd["分发FightEnd事件<br/>GameEvent.FightEnd"]
|
||||
DispatchEnd --> OpenVictory["打开胜利界面<br/>UIID.Victory"]
|
||||
OpenVictory --> SetParams["设置参数:<br/>victory=false<br/>rewards=this.rewards<br/>game_data=this.game_data"]
|
||||
SetParams --> End[游戏失败]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L54-L62)
|
||||
|
||||
当所有英雄都死亡时,系统会:
|
||||
1. 分发FightEnd事件,携带victory=false参数
|
||||
2. 打开Victory界面,显示失败状态
|
||||
3. 传递奖励数组和游戏统计数据
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L54-L62)
|
||||
|
||||
### data_init方法的数据初始化过程
|
||||
|
||||
data_init方法负责每局游戏开始时的初始化工作:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始初始化]) --> SetPlay["设置游戏状态<br/>smc.mission.play = true"]
|
||||
SetPlay --> SetFight["设置战斗状态<br/>smc.vmdata.mission_data.in_fight=false"]
|
||||
SetFight --> SetTime["设置战斗时间<br/>smc.vmdata.mission_data.fight_time=0"]
|
||||
SetTime --> SetLevel["设置关卡<br/>smc.vmdata.mission_data.level=0"]
|
||||
SetLevel --> InitRewards["初始化奖励数组<br/>this.rewards=[]"]
|
||||
InitRewards --> Log["记录初始化日志"]
|
||||
Log --> End([初始化完成])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L118-L124)
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L118-L124)
|
||||
|
||||
## 事件处理流程
|
||||
|
||||
### 完整的事件派发与监听流程
|
||||
|
||||
以下是游戏战斗系统中典型的事件处理流程:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as 用户界面
|
||||
participant MissionComp as MissionComp
|
||||
participant MessageCenter as 消息中心
|
||||
participant MissionMonComp as MissionMonComp
|
||||
participant HeroViewComp as HeroViewComp
|
||||
participant ECS as ECS系统
|
||||
UI->>MissionComp : 点击开始战斗
|
||||
MissionComp->>MessageCenter : GameEvent.MissionStart
|
||||
MessageCenter->>MissionComp : 接收事件
|
||||
MissionComp->>MessageCenter : GameEvent.FightReady
|
||||
MessageCenter->>MissionMonComp : 接收事件
|
||||
MissionMonComp->>MissionMonComp : 刷怪逻辑
|
||||
MissionMonComp->>MessageCenter : GameEvent.FightStart
|
||||
MessageCenter->>MissionComp : 接收事件
|
||||
loop 战斗过程中
|
||||
HeroViewComp->>MessageCenter : GameEvent.MonDead
|
||||
MessageCenter->>MissionComp : 接收事件
|
||||
MissionComp->>MissionComp : do_mon_dead()
|
||||
HeroViewComp->>MessageCenter : GameEvent.HeroDead
|
||||
MessageCenter->>MissionComp : 接收事件
|
||||
MissionComp->>MissionComp : do_hero_dead()
|
||||
alt 英雄全部死亡
|
||||
MissionComp->>MessageCenter : GameEvent.FightEnd
|
||||
MissionComp->>UI : 打开胜利界面
|
||||
end
|
||||
end
|
||||
MissionComp->>MessageCenter : GameEvent.FightEnd
|
||||
MessageCenter->>MissionComp : 接收事件
|
||||
MissionComp->>MissionComp : fight_end()
|
||||
MissionComp->>ECS : cleanComponents()
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L151)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L34-L80)
|
||||
|
||||
### 参数传递机制
|
||||
|
||||
事件系统采用参数化设计,支持不同类型的参数传递:
|
||||
|
||||
| 事件类型 | 参数结构 | 用途 |
|
||||
|---------|---------|------|
|
||||
| GameEvent.FightEnd | `{victory: boolean}` | 标识战斗结果 |
|
||||
| GameEvent.MissionStart | 无参数 | 启动新任务 |
|
||||
| GameEvent.MonDead | `data: {monsterId: number}` | 怪物死亡信息 |
|
||||
| GameEvent.HeroDead | `data: {heroId: number}` | 英雄死亡信息 |
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L54-L62)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L48-L52)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 事件监听器优化
|
||||
|
||||
1. **事件去重**:确保相同事件不会重复注册
|
||||
2. **内存管理**:及时清理不再使用的事件监听器
|
||||
3. **异步处理**:战斗结束清理采用延迟执行避免阻塞
|
||||
|
||||
### ECS组件清理策略
|
||||
|
||||
cleanComponents方法采用批量查询和清理策略:
|
||||
- 使用ECS查询系统高效定位目标组件
|
||||
- 批量移除和销毁相关实体
|
||||
- 避免逐个遍历导致的性能问题
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 1. 事件未正确触发
|
||||
**症状**:某些事件监听器没有响应
|
||||
**原因**:事件名称拼写错误或事件未正确注册
|
||||
**解决**:检查GameEvent枚举定义和事件监听器注册
|
||||
|
||||
#### 2. 战斗结束后残留实体
|
||||
**症状**:战斗结束后仍有未清理的游戏实体
|
||||
**原因**:cleanComponents方法未能匹配到所有组件
|
||||
**解决**:检查组件标签是否正确,确保所有实体都包含相应组件
|
||||
|
||||
#### 3. 英雄死亡判定错误
|
||||
**症状**:英雄死亡后游戏未正确判定失败
|
||||
**原因**:do_hero_dead方法逻辑错误或事件传递中断
|
||||
**解决**:验证英雄计数逻辑和事件分发机制
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L54-L62)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L125-L130)
|
||||
|
||||
## 结论
|
||||
|
||||
MissionComp.ts作为游戏战斗系统的核心控制器,通过精心设计的事件驱动架构实现了高效的战斗管理。其主要优势包括:
|
||||
|
||||
1. **模块化设计**:清晰的职责分离,便于维护和扩展
|
||||
2. **事件驱动**:松耦合的组件通信机制
|
||||
3. **资源管理**:完善的清理机制确保内存安全
|
||||
4. **状态控制**:精确的游戏状态管理
|
||||
|
||||
该设计模式为游戏开发提供了可复用的战斗系统框架,能够适应不同类型的战斗场景需求。通过合理的事件管理和组件清理,确保了游戏运行的稳定性和性能表现。
|
||||
380
.qoder/repowiki/zh/content/奖励系统/奖励UI交互/基地组件状态同步.md
Normal file
380
.qoder/repowiki/zh/content/奖励系统/奖励UI交互/基地组件状态同步.md
Normal file
@@ -0,0 +1,380 @@
|
||||
# 基地组件状态同步
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [CardController.ts](file://assets/script/game/map/CardController.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构概览](#项目结构概览)
|
||||
3. [核心组件分析](#核心组件分析)
|
||||
4. [架构设计](#架构设计)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [事件驱动机制](#事件驱动机制)
|
||||
7. [微信小游戏适配](#微信小游戏适配)
|
||||
8. [组件间协作流程](#组件间协作流程)
|
||||
9. [性能考虑](#性能考虑)
|
||||
10. [总结](#总结)
|
||||
|
||||
## 简介
|
||||
|
||||
MissionHomeComp是游戏中的基地状态视图控制器,负责管理基地界面的状态切换和UI更新。该组件在MissionEnd事件触发时激活基地节点,并通过home_active方法完成界面状态的恢复。同时,它还提供了微信小游戏环境检测、按钮交互接口预留等功能,确保游戏能够在不同平台环境下正常运行。
|
||||
|
||||
## 项目结构概览
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "游戏地图模块"
|
||||
MissionHomeComp["MissionHomeComp<br/>基地视图控制器"]
|
||||
MissionComp["MissionComp<br/>任务控制器"]
|
||||
CardController["CardController<br/>卡片控制器"]
|
||||
end
|
||||
subgraph "事件系统"
|
||||
GameEvent["GameEvent<br/>游戏事件定义"]
|
||||
EventDispatcher["事件分发器"]
|
||||
end
|
||||
subgraph "单例模块"
|
||||
SingletonModule["SingletonModuleComp<br/>全局状态管理"]
|
||||
end
|
||||
MissionHomeComp --> GameEvent
|
||||
MissionComp --> GameEvent
|
||||
MissionHomeComp --> SingletonModule
|
||||
MissionComp --> SingletonModule
|
||||
CardController --> MissionHomeComp
|
||||
EventDispatcher --> MissionHomeComp
|
||||
EventDispatcher --> MissionComp
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts#L1-L53)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L151)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L1-L70)
|
||||
|
||||
## 核心组件分析
|
||||
|
||||
### MissionHomeComp组件特性
|
||||
|
||||
MissionHomeComp继承自CCComp基类,采用ECS架构模式,具有以下核心特性:
|
||||
|
||||
- **事件监听机制**:通过on方法监听MissionEnd事件
|
||||
- **状态管理**:提供home_active方法管理基地界面状态
|
||||
- **环境适配**:包含isWxClient方法检测微信环境
|
||||
- **扩展接口**:预留btn_func方法用于按钮交互扩展
|
||||
|
||||
### MissionComp组件职责
|
||||
|
||||
MissionComp负责整个战斗流程的控制,包括:
|
||||
- 战斗开始、结束的生命周期管理
|
||||
- 英雄死亡、怪物死亡的事件处理
|
||||
- 奖励发放和数据初始化
|
||||
- 组件清理和资源回收
|
||||
|
||||
**章节来源**
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts#L11-L53)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L17-L151)
|
||||
|
||||
## 架构设计
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MissionHomeComp {
|
||||
+onLoad() void
|
||||
+start() void
|
||||
+mission_end() void
|
||||
+home_active() void
|
||||
+uodate_data() void
|
||||
+isWxClient() boolean
|
||||
+btn_func(e, data) void
|
||||
+reset() void
|
||||
}
|
||||
class MissionComp {
|
||||
+onLoad() void
|
||||
+update(dt) void
|
||||
+mission_start() void
|
||||
+mission_end() void
|
||||
+fight_end() void
|
||||
+do_mon_dead(event, data) void
|
||||
+do_hero_dead(event, data) void
|
||||
+cleanComponents() void
|
||||
+reset() void
|
||||
}
|
||||
class SingletonModuleComp {
|
||||
+mission object
|
||||
+vmdata object
|
||||
+isWxClient() boolean
|
||||
+updateGold(gold) boolean
|
||||
+addHero(hero_uuid) boolean
|
||||
}
|
||||
class GameEvent {
|
||||
<<enumeration>>
|
||||
MissionEnd
|
||||
FightEnd
|
||||
MissionStart
|
||||
HeroDead
|
||||
MonDead
|
||||
}
|
||||
MissionHomeComp --> GameEvent : 监听
|
||||
MissionComp --> GameEvent : 触发
|
||||
MissionHomeComp --> SingletonModuleComp : 使用
|
||||
MissionComp --> SingletonModuleComp : 使用
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts#L13-L53)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L17-L151)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L25-L195)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### MissionHomeComp核心方法解析
|
||||
|
||||
#### mission_end方法 - 事件响应入口
|
||||
|
||||
当MissionEnd事件触发时,mission_end方法被调用,这是基地状态恢复的关键入口点。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MissionComp as "MissionComp"
|
||||
participant GameEvent as "GameEvent"
|
||||
participant MissionHomeComp as "MissionHomeComp"
|
||||
participant UI as "UI界面"
|
||||
MissionComp->>GameEvent : 触发MissionEnd事件
|
||||
GameEvent->>MissionHomeComp : 分发事件到mission_end
|
||||
MissionHomeComp->>MissionHomeComp : 调用home_active()
|
||||
MissionHomeComp->>MissionHomeComp : 调用uodate_data()
|
||||
MissionHomeComp->>UI : 设置node.active=true
|
||||
UI-->>MissionHomeComp : 界面激活完成
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts#L26-L32)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L114-L120)
|
||||
|
||||
#### home_active方法 - 状态激活逻辑
|
||||
|
||||
home_active方法是基地界面激活的核心逻辑,包含两个关键步骤:
|
||||
|
||||
1. **数据更新**:调用uodate_data()方法(当前为空,但设计意图明确)
|
||||
2. **界面激活**:设置节点可见性
|
||||
|
||||
#### uodate_data方法 - 设计意图分析
|
||||
|
||||
虽然当前实现为空,但从命名和设计模式来看,uodate_data方法预期用于:
|
||||
- 同步基地生命值信息
|
||||
- 更新防御状态数据
|
||||
- 刷新基地资源显示
|
||||
- 更新英雄驻守状态
|
||||
|
||||
这种设计遵循了MVVM模式的思想,为未来的数据绑定和自动更新做好准备。
|
||||
|
||||
#### isWxClient方法 - 平台检测机制
|
||||
|
||||
```typescript
|
||||
isWxClient(){
|
||||
return typeof wx !== 'undefined' && typeof (wx as any).getSystemInfoSync === 'function';
|
||||
}
|
||||
```
|
||||
|
||||
该方法通过检查wx对象的存在性和特定方法来判断是否运行在微信环境中,为微信小游戏特性提供支持。
|
||||
|
||||
#### btn_func方法 - 交互接口预留
|
||||
|
||||
btn_func方法作为按钮交互的预留接口,为未来扩展按钮功能提供便利:
|
||||
- 参数e:事件名称或类型标识
|
||||
- 参数data:附加数据对象
|
||||
- 设计目的:支持按钮点击、触摸等交互事件
|
||||
|
||||
**章节来源**
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts#L26-L53)
|
||||
|
||||
### MissionComp战斗流程管理
|
||||
|
||||
#### 事件监听机制
|
||||
|
||||
MissionComp通过on方法注册多个事件监听器:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([游戏启动]) --> MissionStart["监听MissionStart事件"]
|
||||
MissionStart --> FightReady["监听FightReady事件"]
|
||||
FightReady --> FightStart["监听FightStart事件"]
|
||||
FightStart --> MonDead["监听MonDead事件"]
|
||||
MonDead --> HeroDead["监听HeroDead事件"]
|
||||
HeroDead --> FightEnd["监听FightEnd事件"]
|
||||
FightEnd --> MissionEnd["监听MissionEnd事件"]
|
||||
MissionEnd --> MissionEndLogic["执行mission_end逻辑"]
|
||||
MissionEndLogic --> CleanComponents["清理组件"]
|
||||
CleanComponents --> End([流程结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L28-L36)
|
||||
|
||||
#### 战斗状态管理
|
||||
|
||||
MissionComp维护复杂的战斗状态,包括:
|
||||
- `smc.mission.play`:战斗是否进行中
|
||||
- `smc.mission.pause`:战斗是否暂停
|
||||
- `smc.mission.in_fight`:是否处于战斗状态
|
||||
- `smc.vmdata.mission_data`:战斗数据统计
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L28-L151)
|
||||
|
||||
## 事件驱动机制
|
||||
|
||||
### 事件流分析
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as "玩家"
|
||||
participant MissionComp as "MissionComp"
|
||||
participant GameEvent as "GameEvent"
|
||||
participant MissionHomeComp as "MissionHomeComp"
|
||||
participant UI as "UI界面"
|
||||
Player->>MissionComp : 开始战斗
|
||||
MissionComp->>GameEvent : 触发MissionStart
|
||||
GameEvent->>MissionComp : 分发事件
|
||||
MissionComp->>MissionComp : mission_start()
|
||||
MissionComp->>UI : 显示战斗界面
|
||||
Note over MissionComp : 战斗进行中...
|
||||
Player->>MissionComp : 英雄死亡
|
||||
MissionComp->>GameEvent : 触发HeroDead
|
||||
GameEvent->>MissionComp : 分发事件
|
||||
MissionComp->>MissionComp : do_hero_dead()
|
||||
MissionComp->>GameEvent : 触发FightEnd
|
||||
GameEvent->>MissionComp : 分发事件
|
||||
MissionComp->>MissionComp : fight_end()
|
||||
MissionComp->>GameEvent : 触发MissionEnd
|
||||
GameEvent->>MissionHomeComp : 分发事件
|
||||
MissionHomeComp->>MissionHomeComp : mission_end()
|
||||
MissionHomeComp->>MissionHomeComp : home_active()
|
||||
MissionHomeComp->>UI : 激活基地界面
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L120)
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts#L26-L32)
|
||||
|
||||
### GameEvent枚举定义
|
||||
|
||||
GameEvent枚举定义了游戏中的所有事件类型,其中MissionEnd事件是基地状态恢复的关键触发点。
|
||||
|
||||
**章节来源**
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L1-L70)
|
||||
|
||||
## 微信小游戏适配
|
||||
|
||||
### 平台检测机制
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([应用启动]) --> CheckWx["检查wx对象存在性"]
|
||||
CheckWx --> HasWx{"wx对象存在?"}
|
||||
HasWx --> |否| WebPlatform["Web平台"]
|
||||
HasWx --> |是| CheckMethod["检查getSystemInfoSync方法"]
|
||||
CheckMethod --> HasMethod{"方法存在?"}
|
||||
HasMethod --> |否| OtherPlatform["其他平台"]
|
||||
HasMethod --> |是| WeChatPlatform["微信平台"]
|
||||
WebPlatform --> DisableFeatures["禁用微信特性"]
|
||||
OtherPlatform --> DisableFeatures
|
||||
WeChatPlatform --> EnableFeatures["启用微信特性"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L58-L62)
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts#L40-L42)
|
||||
|
||||
### 数据同步机制
|
||||
|
||||
isWxClient方法不仅用于环境检测,还为后续的数据同步功能提供基础。当检测到微信环境时,系统会启用云端数据同步功能。
|
||||
|
||||
**章节来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L58-L195)
|
||||
|
||||
## 组件间协作流程
|
||||
|
||||
### 基地状态恢复完整流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
BattleEnd([战斗结束]) --> MissionEndEvent["触发MissionEnd事件"]
|
||||
MissionEndEvent --> MissionHomeComp["MissionHomeComp接收事件"]
|
||||
MissionHomeComp --> MissionEndMethod["调用mission_end方法"]
|
||||
MissionEndMethod --> HomeActive["调用home_active方法"]
|
||||
HomeActive --> UpdateData["调用uodate_data方法"]
|
||||
UpdateData --> ActivateNode["设置node.active=true"]
|
||||
ActivateNode --> ShowUI["显示基地界面"]
|
||||
ShowUI --> CheckWx{"检查微信环境"}
|
||||
CheckWx --> |是| SyncData["同步云端数据"]
|
||||
CheckWx --> |否| Complete["流程完成"]
|
||||
SyncData --> Complete
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts#L26-L35)
|
||||
- [CardController.ts](file://assets/script/game/map/CardController.ts#L32-L35)
|
||||
|
||||
### CardController集成
|
||||
|
||||
CardController作为页面控制器,负责在战斗界面和基地界面之间切换:
|
||||
|
||||
```typescript
|
||||
page_init(){
|
||||
this.node.getChildByName("mission_home").active=true;
|
||||
this.node.getChildByName("mission").active=false;
|
||||
}
|
||||
```
|
||||
|
||||
这种设计实现了清晰的界面分离,确保用户能够直观地从战斗状态过渡到基地状态。
|
||||
|
||||
**章节来源**
|
||||
- [CardController.ts](file://assets/script/game/map/CardController.ts#L32-L35)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 内存管理策略
|
||||
|
||||
MissionHomeComp实现了reset方法来处理组件销毁和内存释放:
|
||||
|
||||
```typescript
|
||||
reset() {
|
||||
this.node.destroy();
|
||||
}
|
||||
```
|
||||
|
||||
这种方法确保了组件在不需要时能够及时释放资源,避免内存泄漏。
|
||||
|
||||
### 事件监听优化
|
||||
|
||||
通过精确的事件监听机制,避免了不必要的回调调用,提高了整体性能。
|
||||
|
||||
### 状态同步优化
|
||||
|
||||
uodate_data方法的预留设计允许未来实现增量更新,减少不必要的UI刷新操作。
|
||||
|
||||
## 总结
|
||||
|
||||
MissionHomeComp作为基地状态的视图控制器,在游戏架构中扮演着重要角色。它通过事件驱动机制实现了从战斗到基地状态的平滑过渡,同时为未来的功能扩展预留了充足的空间。
|
||||
|
||||
### 主要特点
|
||||
|
||||
1. **事件驱动架构**:通过MissionEnd事件触发基地状态恢复
|
||||
2. **状态管理清晰**:home_active方法封装了界面激活逻辑
|
||||
3. **平台适配完善**:isWxClient方法支持微信小游戏特性
|
||||
4. **扩展性强**:btn_func方法预留了按钮交互接口
|
||||
5. **性能优化**:合理的内存管理和事件监听机制
|
||||
|
||||
### 设计优势
|
||||
|
||||
- **模块化设计**:MissionHomeComp独立于具体业务逻辑
|
||||
- **可测试性**:清晰的方法边界便于单元测试
|
||||
- **可维护性**:预留的扩展接口降低了未来修改的成本
|
||||
- **跨平台兼容**:完善的平台检测机制确保多环境支持
|
||||
|
||||
这种设计模式体现了现代游戏开发中关注分离、可扩展性和平台兼容性的最佳实践,为构建高质量的游戏应用奠定了坚实基础。
|
||||
423
.qoder/repowiki/zh/content/奖励系统/奖励UI交互/奖励UI交互.md
Normal file
423
.qoder/repowiki/zh/content/奖励系统/奖励UI交互/奖励UI交互.md
Normal file
@@ -0,0 +1,423 @@
|
||||
# 奖励UI交互
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [系统概述](#系统概述)
|
||||
2. [核心组件架构](#核心组件架构)
|
||||
3. [事件驱动机制](#事件驱动机制)
|
||||
4. [奖励触发条件](#奖励触发条件)
|
||||
5. [UI界面展示](#ui界面展示)
|
||||
6. [数据绑定与状态管理](#数据绑定与状态管理)
|
||||
7. [界面过渡动画](#界面过渡动画)
|
||||
8. [用户交互反馈](#用户交互反馈)
|
||||
9. [系统集成流程](#系统集成流程)
|
||||
10. [故障排除指南](#故障排除指南)
|
||||
|
||||
## 系统概述
|
||||
|
||||
奖励系统UI交互是游戏战斗胜利后的重要组成部分,负责在玩家完成战斗后展示奖励选项、经验值、金币和钻石等资源。系统采用事件驱动架构,通过MissionComp作为核心控制器,协调各个子组件完成完整的奖励展示流程。
|
||||
|
||||
### 系统特点
|
||||
- **事件驱动**:基于GameEvent机制的松耦合设计
|
||||
- **数据驱动**:使用MVVM模式实现数据绑定
|
||||
- **状态管理**:通过SingletonModuleComp统一管理游戏状态
|
||||
- **动画流畅**:支持平滑的界面过渡效果
|
||||
|
||||
## 核心组件架构
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MissionComp {
|
||||
+rewards : any[]
|
||||
+game_data : any
|
||||
+onLoad() void
|
||||
+do_hero_dead(event, data) void
|
||||
+fight_end() void
|
||||
+mission_start() void
|
||||
+to_fight() void
|
||||
}
|
||||
class VictoryComp {
|
||||
+reward_lv : number
|
||||
+reward_num : number
|
||||
+rewards : any[]
|
||||
+game_data : any
|
||||
+onAdded(args) void
|
||||
+victory_end() void
|
||||
+restart() void
|
||||
+double_reward() void
|
||||
}
|
||||
class MissionHeroCompComp {
|
||||
+Friend_is_dead : boolean
|
||||
+current_hero_uuid : number
|
||||
+heros : any[]
|
||||
+onLoad() void
|
||||
+fight_ready() void
|
||||
+addHero(uuid, is_zhaohuan) void
|
||||
}
|
||||
class MissionMonCompComp {
|
||||
+monsterQueue : Array
|
||||
+spawnInterval : number
|
||||
+spawnCount : number
|
||||
+onLoad() void
|
||||
+fight_ready() void
|
||||
+generateMonstersFromStageConfig(configs) void
|
||||
}
|
||||
class MissionHomeComp {
|
||||
+onLoad() void
|
||||
+home_active() void
|
||||
+mission_end() void
|
||||
}
|
||||
class SingletonModuleComp {
|
||||
+mission : any
|
||||
+vmdata : any
|
||||
+guides : any[]
|
||||
+data : any
|
||||
}
|
||||
MissionComp --> VictoryComp : "触发FightEnd事件"
|
||||
MissionComp --> SingletonModuleComp : "更新游戏状态"
|
||||
VictoryComp --> SingletonModuleComp : "读取游戏数据"
|
||||
MissionHeroCompComp --> SingletonModuleComp : "监控英雄状态"
|
||||
MissionMonCompComp --> SingletonModuleComp : "监控怪物状态"
|
||||
MissionHomeComp --> SingletonModuleComp : "监控关卡状态"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L15-L151)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L15-L75)
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L12-L81)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L15-L240)
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts#L12-L54)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L25-L195)
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L151)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L1-L75)
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L1-L81)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts#L1-L54)
|
||||
|
||||
## 事件驱动机制
|
||||
|
||||
### 核心事件流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as 玩家
|
||||
participant MissionComp as MissionComp
|
||||
participant GameEvent as GameEvent
|
||||
participant VictoryComp as VictoryComp
|
||||
participant GUI as GUI系统
|
||||
participant SM as SingletonModule
|
||||
Player->>MissionComp : 战斗结束
|
||||
MissionComp->>GameEvent : dispatchEvent(FightEnd)
|
||||
GameEvent->>MissionComp : 监听FightEnd事件
|
||||
MissionComp->>SM : 更新游戏状态
|
||||
MissionComp->>GUI : oops.gui.open(UIID.Victory)
|
||||
GUI->>VictoryComp : 创建胜利界面
|
||||
VictoryComp->>VictoryComp : onAdded(args)
|
||||
VictoryComp->>VictoryComp : 展示奖励数据
|
||||
VictoryComp->>Player : 显示奖励选项
|
||||
Note over Player,SM : 奖励界面完全加载并显示
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L32-L35)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L40-L41)
|
||||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts#L12-L13)
|
||||
|
||||
### 事件监听与响应
|
||||
|
||||
系统通过事件总线机制实现组件间的解耦通信:
|
||||
|
||||
1. **FightEnd事件触发**:当所有英雄死亡时,MissionComp检测到战斗结束状态
|
||||
2. **状态更新**:更新SingletonModuleComp中的游戏状态
|
||||
3. **界面打开**:通过GUI系统打开胜利界面
|
||||
4. **数据传递**:将rewards和game_data参数传递给Victory界面
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L55-L65)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L40-L41)
|
||||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts#L12-L13)
|
||||
|
||||
## 奖励触发条件
|
||||
|
||||
### 英雄死亡触发机制
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([战斗开始]) --> Monitor[监控英雄状态]
|
||||
Monitor --> CheckHero{检查英雄数量}
|
||||
CheckHero --> |英雄存活| Continue[继续战斗]
|
||||
CheckHero --> |英雄死亡| Decrement[减少英雄数量]
|
||||
Decrement --> CheckAllDead{所有英雄死亡?}
|
||||
CheckAllDead --> |否| Continue
|
||||
CheckAllDead --> |是| TriggerFightEnd[触发FightEnd事件]
|
||||
TriggerFightEnd --> OpenVictory[打开胜利界面]
|
||||
OpenVictory --> PassData[传递奖励数据]
|
||||
PassData --> End([流程结束])
|
||||
Continue --> Monitor
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L55-L65)
|
||||
|
||||
### 怪物击杀触发机制
|
||||
|
||||
系统通过MissionMonComp监控怪物状态,每击杀一只怪物会:
|
||||
- 更新怪物数量计数器
|
||||
- 触发相应的事件通知
|
||||
- 记录战斗统计数据
|
||||
|
||||
### 基地保护触发机制
|
||||
|
||||
MissionHomeComp负责监控基地状态,当基地受到威胁时:
|
||||
- 更新基地保护状态
|
||||
- 触发防御机制
|
||||
- 记录基地受损情况
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L47-L52)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L47-L52)
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts#L25-L35)
|
||||
|
||||
## UI界面展示
|
||||
|
||||
### 胜利界面结构
|
||||
|
||||
VictoryComp负责展示战斗胜利后的奖励界面,包含以下核心元素:
|
||||
|
||||
| 组件名称 | 功能描述 | 数据绑定 |
|
||||
|---------|---------|---------|
|
||||
| title.victory | 胜利标题显示 | 自动激活 |
|
||||
| btns.next | 下一步按钮 | 延迟0.2秒激活 |
|
||||
| reward_lv | 奖励等级 | 动态计算 |
|
||||
| reward_num | 奖励数量 | 固定值2 |
|
||||
| game_data.exp | 经验值奖励 | 从MissionComp传递 |
|
||||
| game_data.gold | 金币奖励 | 从MissionComp传递 |
|
||||
| game_data.diamond | 钻石奖励 | 从MissionComp传递 |
|
||||
|
||||
### 界面初始化流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Load[VictoryComp加载] --> ReceiveArgs[接收参数]
|
||||
ReceiveArgs --> CheckGameData{检查game_data}
|
||||
CheckGameData --> |存在| AssignData[分配游戏数据]
|
||||
CheckGameData --> |不存在| UseDefault[使用默认数据]
|
||||
AssignData --> ShowTitle[显示胜利标题]
|
||||
UseDefault --> ShowTitle
|
||||
ShowTitle --> HideButton[隐藏下一步按钮]
|
||||
HideButton --> DelayShow[延迟0.2秒显示按钮]
|
||||
DelayShow --> Ready[界面准备就绪]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L28-L42)
|
||||
|
||||
**章节来源**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L15-L75)
|
||||
|
||||
## 数据绑定与状态管理
|
||||
|
||||
### MVVM数据流
|
||||
|
||||
系统采用MVVM架构实现数据绑定:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "数据层"
|
||||
VMData[vmdata对象]
|
||||
GameData[game_data]
|
||||
Rewards[rewards数组]
|
||||
end
|
||||
subgraph "视图层"
|
||||
VictoryUI[胜利界面UI]
|
||||
HeroStats[英雄统计]
|
||||
RewardDisplay[奖励展示]
|
||||
end
|
||||
subgraph "控制层"
|
||||
VictoryComp[VictoryComp组件]
|
||||
SingletonModule[SingletonModuleComp]
|
||||
end
|
||||
VMData --> VictoryComp
|
||||
GameData --> VictoryComp
|
||||
Rewards --> VictoryComp
|
||||
VictoryComp --> VictoryUI
|
||||
VictoryComp --> HeroStats
|
||||
VictoryComp --> RewardDisplay
|
||||
SingletonModule --> VMData
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L18-L25)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L45-L65)
|
||||
|
||||
### 状态同步机制
|
||||
|
||||
SingletonModuleComp作为全局状态管理中心,维护以下关键状态:
|
||||
|
||||
| 状态字段 | 类型 | 描述 | 更新时机 |
|
||||
|---------|------|------|---------|
|
||||
| mission.status | number | 游戏状态(0:未开始, 1:进行中, 2:胜利, 3:失败) | 战斗开始/结束时 |
|
||||
| mission.play | boolean | 游戏是否在播放 | 战斗开始/结束时 |
|
||||
| mission.pause | boolean | 游戏是否暂停 | 暂停/恢复时 |
|
||||
| vmdata.mission_data.mon_num | number | 怪物数量 | 怪物生成/死亡时 |
|
||||
| vmdata.mission_data.hero_num | number | 英雄数量 | 英雄生成/死亡时 |
|
||||
| vmdata.mission_data.fight_time | number | 战斗时间 | 每帧更新 |
|
||||
|
||||
**章节来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L25-L45)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L130-L140)
|
||||
|
||||
## 界面过渡动画
|
||||
|
||||
### 打开动画流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant GUI as GUI系统
|
||||
participant VictoryComp as VictoryComp
|
||||
participant UI as UI节点
|
||||
participant Player as 玩家
|
||||
GUI->>VictoryComp : open(UIID.Victory)
|
||||
VictoryComp->>VictoryComp : onAdded(args)
|
||||
VictoryComp->>UI : 设置初始状态
|
||||
UI->>Player : 隐藏胜利标题
|
||||
UI->>Player : 隐藏下一步按钮
|
||||
VictoryComp->>VictoryComp : scheduleOnce(0.2秒)
|
||||
VictoryComp->>UI : 显示下一步按钮
|
||||
UI->>Player : 平滑显示界面
|
||||
Note over Player : 界面完全加载并显示
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L28-L42)
|
||||
|
||||
### 关闭动画流程
|
||||
|
||||
界面关闭时的清理流程:
|
||||
1. 调用victory_end()方法
|
||||
2. 清理游戏数据
|
||||
3. 分发MissionEnd事件
|
||||
4. 通过GUI系统移除界面节点
|
||||
|
||||
**章节来源**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L44-L50)
|
||||
|
||||
## 用户交互反馈
|
||||
|
||||
### 按钮交互机制
|
||||
|
||||
胜利界面提供多种用户交互选项:
|
||||
|
||||
| 按钮功能 | 触发事件 | 动作描述 |
|
||||
|---------|---------|---------|
|
||||
| next按钮 | 点击 | 调用victory_end() |
|
||||
| restart按钮 | 点击 | 调用restart() |
|
||||
| double_reward按钮 | 点击 | 调用double_reward() |
|
||||
| watch_ad按钮 | 点击 | 调用watch_ad() |
|
||||
|
||||
### 交互状态管理
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> Loading : 界面加载
|
||||
Loading --> Ready : 0.2秒后激活按钮
|
||||
Ready --> Restart : 点击重启
|
||||
Ready --> Next : 点击下一步
|
||||
Ready --> Double : 点击双倍奖励
|
||||
Ready --> Ad : 点击观看广告
|
||||
Restart --> [*] : 重新开始
|
||||
Next --> [*] : 结束战斗
|
||||
Double --> [*] : 双倍奖励
|
||||
Ad --> [*] : 广告奖励
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L44-L65)
|
||||
|
||||
**章节来源**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L44-L75)
|
||||
|
||||
## 系统集成流程
|
||||
|
||||
### 完整奖励流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([战斗开始]) --> FightLoop[战斗循环]
|
||||
FightLoop --> CheckConditions{检查胜利条件}
|
||||
CheckConditions --> |英雄存活| ContinueFight[继续战斗]
|
||||
CheckConditions --> |英雄死亡| TriggerFightEnd[触发FightEnd]
|
||||
TriggerFightEnd --> UpdateState[更新游戏状态]
|
||||
UpdateState --> OpenVictory[打开胜利界面]
|
||||
OpenVictory --> BindData[绑定奖励数据]
|
||||
BindData --> ShowRewards[展示奖励选项]
|
||||
ShowRewards --> WaitInput[等待用户输入]
|
||||
WaitInput --> ProcessChoice{用户选择}
|
||||
ProcessChoice --> |继续| NextLevel[下一关卡]
|
||||
ProcessChoice --> |重新开始| Restart[重新开始]
|
||||
ProcessChoice --> |双倍奖励| DoubleReward[双倍奖励]
|
||||
ProcessChoice --> |观看广告| WatchAd[观看广告]
|
||||
NextLevel --> Start
|
||||
Restart --> Start
|
||||
DoubleReward --> Start
|
||||
WatchAd --> Start
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L55-L65)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L44-L75)
|
||||
|
||||
### 错误处理机制
|
||||
|
||||
系统包含完善的错误处理机制:
|
||||
- **网络错误**:通过GUI系统显示错误提示
|
||||
- **数据同步错误**:自动回滚操作并提示用户
|
||||
- **界面加载错误**:提供重试机制
|
||||
- **事件监听错误**:记录日志并尝试恢复
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L151)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L1-L75)
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
| 问题描述 | 可能原因 | 解决方案 |
|
||||
|---------|---------|---------|
|
||||
| 胜利界面无法打开 | UIID配置错误 | 检查GameUIConfig.ts中的UIID.Victory配置 |
|
||||
| 奖励数据不显示 | 数据绑定失败 | 验证SingletonModuleComp中的vmdata结构 |
|
||||
| 事件监听失效 | 组件未正确注册 | 检查@ecs.register装饰器的使用 |
|
||||
| 界面动画异常 | 节点状态错误 | 确保节点的active状态正确管理 |
|
||||
| 数据同步失败 | 网络连接问题 | 实现重试机制并提供用户提示 |
|
||||
|
||||
### 性能优化建议
|
||||
|
||||
1. **事件监听优化**:及时移除不需要的事件监听器
|
||||
2. **内存管理**:确保组件正确销毁避免内存泄漏
|
||||
3. **数据缓存**:合理使用SingletonModuleComp进行数据缓存
|
||||
4. **异步加载**:使用async/await模式处理异步操作
|
||||
|
||||
### 调试技巧
|
||||
|
||||
- 使用console.log记录关键事件的触发
|
||||
- 监控SingletonModuleComp的状态变化
|
||||
- 检查GUI系统的open和remove调用
|
||||
- 验证数据绑定的路径正确性
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L140-L151)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L100-L150)
|
||||
399
.qoder/repowiki/zh/content/奖励系统/奖励UI交互/怪物生成与波次控制.md
Normal file
399
.qoder/repowiki/zh/content/奖励系统/奖励UI交互/怪物生成与波次控制.md
Normal file
@@ -0,0 +1,399 @@
|
||||
# 怪物生成与波次控制
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [概述](#概述)
|
||||
2. [系统架构](#系统架构)
|
||||
3. [核心组件分析](#核心组件分析)
|
||||
4. [怪物生成机制](#怪物生成机制)
|
||||
5. [波次控制逻辑](#波次控制逻辑)
|
||||
6. [随机事件系统](#随机事件系统)
|
||||
7. [状态机图示](#状态机图示)
|
||||
8. [性能优化考虑](#性能优化考虑)
|
||||
9. [故障排除指南](#故障排除指南)
|
||||
10. [总结](#总结)
|
||||
|
||||
## 概述
|
||||
|
||||
MissionMonCompComp是游戏肉鸽模式中负责怪物生成与波次控制的核心组件。它实现了基于关卡配置的动态怪物生成系统,支持不同类型的怪物(普通、精英、Boss),并采用波次节奏控制机制,每5只怪物后暂停5秒形成波次节奏。
|
||||
|
||||
该系统通过RogueConfig提供配置驱动的怪物生成策略,支持怪物强度随关卡递增,同时集成了随机事件系统,为游戏体验增加不确定性。
|
||||
|
||||
## 系统架构
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "怪物生成系统"
|
||||
A[MissionMonCompComp] --> B[RogueConfig]
|
||||
A --> C[Monster Queue]
|
||||
A --> D[Timer System]
|
||||
A --> E[Random Event System]
|
||||
end
|
||||
subgraph "配置层"
|
||||
B --> F[Stage Config Rules]
|
||||
B --> G[Monster Type Config]
|
||||
B --> H[Event Config]
|
||||
end
|
||||
subgraph "实体层"
|
||||
I[Monster Entity] --> J[MonModelComp]
|
||||
I --> K[BattleMoveComp]
|
||||
I --> L[TalComp]
|
||||
end
|
||||
A --> I
|
||||
C --> M[Spawn Queue Management]
|
||||
D --> N[Wave Timing Control]
|
||||
E --> O[Event Processing]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L311)
|
||||
|
||||
## 核心组件分析
|
||||
|
||||
### MissionMonCompComp 主控制器
|
||||
|
||||
MissionMonCompComp作为主要的怪物生成控制器,维护以下关键状态:
|
||||
|
||||
| 状态变量 | 类型 | 描述 |
|
||||
|---------|------|------|
|
||||
| monsterQueue | Array | 怪物生成队列,存储待生成的怪物配置 |
|
||||
| isSpawning | boolean | 是否正在生成怪物的状态标志 |
|
||||
| spawnInterval | number | 单个怪物生成间隔(默认0.1秒) |
|
||||
| spawnTimer | number | 生成计时器,累积时间用于控制生成节奏 |
|
||||
| spawnCount | number | 已生成怪物计数器 |
|
||||
| pauseInterval | number | 波次暂停间隔(默认5秒) |
|
||||
| isPausing | boolean | 是否处于波次暂停状态 |
|
||||
| currentEvent | EventType | 当前关卡的随机事件类型 |
|
||||
| eventProcessed | boolean | 随机事件是否已处理的标志 |
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L18-L35)
|
||||
|
||||
### RogueConfig 配置系统
|
||||
|
||||
RogueConfig提供了完整的配置驱动怪物生成框架:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class RogueConfig {
|
||||
+MonsterType NORMAL
|
||||
+MonsterType ELITE
|
||||
+MonsterType BOSS
|
||||
+StageType NORMAL
|
||||
+StageType ELITE
|
||||
+StageType BOSS
|
||||
+StageType EVENT
|
||||
+EventType TREASURE
|
||||
+EventType TRAP
|
||||
+EventType BUFF
|
||||
+EventType DEBUFF
|
||||
+getStageType(stageNumber, level) StageType
|
||||
+getStageMonsterConfigs(stageNumber, level) Array
|
||||
+calculateMonsterCount(stageNumber, baseCount, minCount, maxCount) number
|
||||
+calculateMonsterStrengthMultiplier(stageNumber, level) number
|
||||
+getRandomEvent() EventType
|
||||
}
|
||||
class StageConfigRules {
|
||||
+NORMAL Monsters
|
||||
+ELITE Monsters
|
||||
+BOSS Monsters
|
||||
+EVENT Monsters
|
||||
}
|
||||
class EventConfig {
|
||||
+TREASURE Probability
|
||||
+TRAP Probability
|
||||
+BUFF Probability
|
||||
+DEBUFF Probability
|
||||
}
|
||||
RogueConfig --> StageConfigRules
|
||||
RogueConfig --> EventConfig
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L25-L132)
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L311)
|
||||
|
||||
## 怪物生成机制
|
||||
|
||||
### do_mon_wave 方法 - 波次初始化
|
||||
|
||||
do_mon_wave方法是波次生成的入口点,负责初始化所有相关状态并启动怪物生成流程:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[do_mon_wave 开始] --> B[重置生成状态]
|
||||
B --> C[获取当前关卡信息]
|
||||
C --> D[确定关卡类型]
|
||||
D --> E{是否为事件关卡?}
|
||||
E --> |是| F[生成随机事件]
|
||||
E --> |否| G[清除事件状态]
|
||||
F --> H[获取怪物配置]
|
||||
G --> H
|
||||
H --> I[生成怪物队列]
|
||||
I --> J[开始波次生成]
|
||||
B --> B1[spawnCount = 0]
|
||||
B --> B2[isPausing = false]
|
||||
B --> B3[spawnTimer = 0]
|
||||
B --> B4[eventProcessed = false]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L85-L115)
|
||||
|
||||
### generateMonstersFromStageConfig 方法 - 队列生成
|
||||
|
||||
generateMonstersFromStageConfig方法负责解析怪物配置并构建生成队列:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MC as MissionMonComp
|
||||
participant RC as RogueConfig
|
||||
participant MQ as MonsterQueue
|
||||
MC->>RC : getStageMonsterConfigs(stage, level)
|
||||
RC->>RC : generateStageConfig(stage, level)
|
||||
RC->>RC : calculateMonsterStrengthMultiplier(stage, level)
|
||||
loop 每个怪物类型
|
||||
RC->>RC : getMonsterUUIDsByType(type)
|
||||
RC->>RC : 随机选择UUID
|
||||
RC-->>MC : 返回怪物配置
|
||||
end
|
||||
MC->>MC : generateMonstersFromStageConfig(configs)
|
||||
loop 每个怪物配置
|
||||
MC->>MC : 计算位置索引
|
||||
MC->>MQ : addToStageSpawnQueue()
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L147-L185)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L265-L295)
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L147-L185)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L265-L295)
|
||||
|
||||
### 怪物配置结构
|
||||
|
||||
每个怪物配置包含以下关键信息:
|
||||
|
||||
| 字段 | 类型 | 描述 |
|
||||
|------|------|------|
|
||||
| uuid | number | 怪物唯一标识符,对应HeroInfo中的怪物UUID |
|
||||
| position | number | 怪物生成位置索引(0-4) |
|
||||
| type | MonsterType | 怪物类型(NORMAL/ELITE/BOSS) |
|
||||
| level | number | 怪物等级,默认为1 |
|
||||
| strengthMultiplier | number | 强度倍率,随关卡递增 |
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L186-L205)
|
||||
|
||||
## 波次控制逻辑
|
||||
|
||||
### 定时器系统 - update 方法
|
||||
|
||||
update方法实现了精确的波次控制逻辑,每帧更新计时器并管理生成节奏:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[update(dt)] --> B{游戏是否进行中?}
|
||||
B --> |否| C[退出更新]
|
||||
B --> |是| D{有随机事件?}
|
||||
D --> |是且未处理| E[processRandomEvent]
|
||||
D --> |否或已处理| F{有怪物队列?}
|
||||
E --> F
|
||||
F --> |否| C
|
||||
F --> |是| G[累加spawnTimer]
|
||||
G --> H{是否暂停状态?}
|
||||
H --> |是| I{暂停时间到?}
|
||||
I --> |否| C
|
||||
I --> |是| J[结束暂停,重置状态]
|
||||
H --> |否| K{生成时间到?}
|
||||
K --> |否| C
|
||||
K --> |是| L[spawnNextMonster]
|
||||
L --> M{达到5只?}
|
||||
M --> |否| N[重置计时器]
|
||||
M --> |是| O[进入暂停状态]
|
||||
J --> P[继续生成]
|
||||
N --> P
|
||||
O --> Q[暂停5秒]
|
||||
P --> C
|
||||
Q --> C
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L55-L85)
|
||||
|
||||
### 波次节奏控制
|
||||
|
||||
波次控制采用"5+5"模式:
|
||||
- **生成阶段**:每0.1秒生成一只怪物,连续生成5只
|
||||
- **暂停阶段**:生成5只后暂停5秒,然后恢复生成
|
||||
- **计数器**:spawnCount跟踪已生成怪物数量
|
||||
- **状态标志**:isPausing控制暂停状态
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L55-L85)
|
||||
|
||||
### spawnNextMonster 方法 - 怪物实例化
|
||||
|
||||
spawnNextMonster方法从队列中取出怪物配置并创建实体:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MC as MissionMonComp
|
||||
participant ECS as ECS系统
|
||||
participant M as Monster实体
|
||||
participant SM as Scene Manager
|
||||
MC->>MC : 从队列移除第一个怪物
|
||||
MC->>ECS : 获取Monster实体
|
||||
MC->>M : load(position, scale, uuid, isBoss, isCall, strengthMultiplier)
|
||||
M->>SM : 创建怪物节点
|
||||
M->>M : 设置位置和缩放
|
||||
M->>M : 加载怪物资源
|
||||
M->>M : 初始化战斗参数
|
||||
M->>SM : 添加到场景层
|
||||
MC->>MC : 增加spawnCount
|
||||
MC->>MC : 更新怪物计数显示
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L190-L215)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L35-L60)
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L190-L215)
|
||||
|
||||
## 随机事件系统
|
||||
|
||||
### 事件类型与概率
|
||||
|
||||
随机事件系统提供四种不同类型的事件,每种事件都有对应的触发概率:
|
||||
|
||||
| 事件类型 | 概率 | 效果 | 处理方式 |
|
||||
|----------|------|------|----------|
|
||||
| TREASURE | 30% | 增加50金币奖励 | 直接修改游戏数据 |
|
||||
| TRAP | 25% | 对玩家造成伤害 | 需要实现具体伤害逻辑 |
|
||||
| BUFF | 25% | 给玩家临时增益效果 | 需要实现增益系统 |
|
||||
| DEBUFF | 20% | 给玩家临时减益效果 | 需要实现减益系统 |
|
||||
|
||||
### processRandomEvent 方法
|
||||
|
||||
processRandomEvent方法根据当前事件类型执行相应的处理逻辑:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[processRandomEvent] --> B{检查currentEvent}
|
||||
B --> |null| C[无事件,退出]
|
||||
B --> |有效事件| D{switch currentEvent}
|
||||
D --> |TREASURE| E[增加50金币]
|
||||
D --> |TRAP| F[造成伤害逻辑]
|
||||
D --> |BUFF| G[增加临时增益]
|
||||
D --> |DEBUFF| H[增加临时减益]
|
||||
E --> I[标记事件已处理]
|
||||
F --> I
|
||||
G --> I
|
||||
H --> I
|
||||
I --> J[eventProcessed = true]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L117-L145)
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L117-L145)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L105-L132)
|
||||
|
||||
## 状态机图示
|
||||
|
||||
### 怪物生成状态机
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 波次准备
|
||||
波次准备 --> 事件检测 : do_mon_wave()
|
||||
事件检测 --> 事件处理 : 是事件关卡
|
||||
事件检测 --> 怪物生成 : 非事件关卡
|
||||
事件处理 --> 怪物生成 : 事件已处理
|
||||
怪物生成 --> 怪物实例化 : 队列非空
|
||||
怪物实例化 --> 怪物实例化 : 生成间隔到达
|
||||
怪物实例化 --> 波次暂停 : 达到5只
|
||||
波次暂停 --> 怪物实例化 : 暂停结束
|
||||
怪物实例化 --> 波次完成 : 队列为空
|
||||
波次完成 --> [*]
|
||||
```
|
||||
|
||||
### 波次节奏状态机
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 生成中
|
||||
生成中 --> 生成中 : spawnTimer < spawnInterval
|
||||
生成中 --> 怪物实例化 : spawnTimer >= spawnInterval
|
||||
怪物实例化 --> 生成中 : spawnCount < 5
|
||||
怪物实例化 --> 波次暂停 : spawnCount >= 5
|
||||
波次暂停 --> 波次暂停 : pauseTimer < pauseInterval
|
||||
波次暂停 --> 生成中 : pauseTimer >= pauseInterval
|
||||
```
|
||||
|
||||
## 性能优化考虑
|
||||
|
||||
### 内存管理
|
||||
|
||||
1. **实体池化**:Monster实体通过ecs.getEntity获取,避免频繁创建销毁
|
||||
2. **队列管理**:使用shift/pop操作保持队列紧凑
|
||||
3. **资源加载**:怪物资源预加载,减少运行时开销
|
||||
|
||||
### 计算优化
|
||||
|
||||
1. **配置缓存**:RogueConfig中的计算结果可适当缓存
|
||||
2. **随机数优化**:Math.random()调用频率控制在合理范围内
|
||||
3. **事件概率计算**:使用累积概率算法提高效率
|
||||
|
||||
### 渲染优化
|
||||
|
||||
1. **批量渲染**:怪物生成采用批量处理机制
|
||||
2. **层级管理**:怪物添加到专门的EntityLayer
|
||||
3. **碰撞体延迟启用**:避免过早启用碰撞体影响性能
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
| 问题 | 症状 | 可能原因 | 解决方案 |
|
||||
|------|------|----------|----------|
|
||||
| 怪物不生成 | 队列为空但游戏仍在进行 | 配置错误或事件阻塞 | 检查RogueConfig配置和事件处理 |
|
||||
| 波次节奏异常 | 怪物生成过快或过慢 | 时间计算错误 | 验证update方法中的计时逻辑 |
|
||||
| 事件不触发 | 事件关卡没有随机事件 | 概率计算错误 | 检查getRandomEvent函数 |
|
||||
| 怪物位置错误 | 怪物出现在错误位置 | 位置索引计算错误 | 验证position计算逻辑 |
|
||||
|
||||
### 调试技巧
|
||||
|
||||
1. **日志记录**:启用console.log语句跟踪关键状态变化
|
||||
2. **断点调试**:在关键方法设置断点观察变量值
|
||||
3. **状态监控**:实时监控monsterQueue长度和计时器状态
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L147-L185)
|
||||
|
||||
## 总结
|
||||
|
||||
MissionMonCompComp实现了一个功能完整且灵活的怪物生成与波次控制系统。该系统具有以下特点:
|
||||
|
||||
1. **配置驱动**:通过RogueConfig实现完全可配置的怪物生成策略
|
||||
2. **波次节奏**:采用"5+5"模式确保游戏体验的平衡性
|
||||
3. **随机事件**:集成随机事件系统增加游戏不确定性
|
||||
4. **性能优化**:采用实体池化和批量处理优化性能
|
||||
5. **扩展性强**:模块化设计便于功能扩展和维护
|
||||
|
||||
该系统为游戏肉鸽模式提供了坚实的怪物生成基础,支持复杂的关卡设计和多样化的游戏体验。通过合理的配置和适当的调整,可以满足不同类型游戏的需求。
|
||||
505
.qoder/repowiki/zh/content/奖励系统/奖励UI交互/英雄管理组件交互.md
Normal file
505
.qoder/repowiki/zh/content/奖励系统/奖励UI交互/英雄管理组件交互.md
Normal file
@@ -0,0 +1,505 @@
|
||||
# 英雄管理组件交互
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构概览](#项目结构概览)
|
||||
3. [核心组件分析](#核心组件分析)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [英雄生命周期管理](#英雄生命周期管理)
|
||||
7. [事件处理机制](#事件处理机制)
|
||||
8. [数据绑定关系](#数据绑定关系)
|
||||
9. [时序图示例](#时序图示例)
|
||||
10. [性能考虑](#性能考虑)
|
||||
11. [故障排除指南](#故障排除指南)
|
||||
12. [总结](#总结)
|
||||
|
||||
## 简介
|
||||
|
||||
MissionHeroCompComp类是游戏战斗系统中负责管理英雄生命周期的核心组件。它通过ECS架构模式,实现了英雄的初始化、召唤、战斗管理和清理等完整生命周期流程。该组件与SingletonModuleComp单例、GameEvent事件系统以及Hero实体组件紧密协作,形成了一个完整的英雄管理系统。
|
||||
|
||||
## 项目结构概览
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "战斗系统架构"
|
||||
MissionHeroComp[MissionHeroCompComp<br/>英雄管理组件]
|
||||
SingletonModule[SingletonModuleComp<br/>单例模块]
|
||||
HeroEntity[Hero实体]
|
||||
GameEvents[GameEvent事件系统]
|
||||
end
|
||||
subgraph "英雄组件体系"
|
||||
HeroView[HeroViewComp<br/>英雄视图组件]
|
||||
BattleMove[BattleMoveComp<br/>战斗移动组件]
|
||||
HeroModel[HeroModelComp<br/>英雄模型组件]
|
||||
end
|
||||
subgraph "配置数据层"
|
||||
HeroSet[heroSet配置]
|
||||
GameConfig[GameEvent配置]
|
||||
SMData[SMC数据]
|
||||
end
|
||||
MissionHeroComp --> SingletonModule
|
||||
MissionHeroComp --> HeroEntity
|
||||
MissionHeroComp --> GameEvents
|
||||
HeroEntity --> HeroView
|
||||
HeroEntity --> BattleMove
|
||||
HeroEntity --> HeroModel
|
||||
SingletonModule --> SMData
|
||||
GameEvents --> GameConfig
|
||||
HeroEntity --> HeroSet
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L1-L81)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L195)
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L15-L101)
|
||||
|
||||
## 核心组件分析
|
||||
|
||||
### MissionHeroCompComp类结构
|
||||
|
||||
MissionHeroCompComp继承自CCComp基类,注册为ECS系统中的MissionHero组件。该类维护以下核心状态:
|
||||
|
||||
- **timer**: 定时器组件,用于控制英雄召唤间隔
|
||||
- **Friend_is_dead**: 标记友方英雄是否死亡
|
||||
- **current_hero_uuid**: 当前英雄的唯一标识符
|
||||
- **current_hero_num**: 当前英雄数量
|
||||
- **heros**: 英雄数组,存储所有战斗中的英雄信息
|
||||
|
||||
**章节来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L11-L18)
|
||||
|
||||
## 架构概览
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MissionHeroCompComp {
|
||||
+Timer timer
|
||||
+boolean Friend_is_dead
|
||||
+number current_hero_uuid
|
||||
+number current_hero_num
|
||||
+any[] heros
|
||||
+onLoad() void
|
||||
+clear_heros() void
|
||||
+fight_ready() void
|
||||
+zhao_huan(event, args) void
|
||||
+addHero(uuid, is_zhaohuan) void
|
||||
+reset() void
|
||||
}
|
||||
class SingletonModuleComp {
|
||||
+number fight_hero
|
||||
+any heros
|
||||
+any vmdata
|
||||
+updateFihgtHero(heroId) void
|
||||
+addHero(hero_uuid) void
|
||||
}
|
||||
class Hero {
|
||||
+HeroModelComp HeroModel
|
||||
+HeroViewComp HeroView
|
||||
+BattleMoveComp BattleMove
|
||||
+load(pos, scale, uuid, fight_pos) void
|
||||
+hero_init(uuid, node) HeroViewComp
|
||||
}
|
||||
class GameEvent {
|
||||
<<enumeration>>
|
||||
FightReady
|
||||
Zhaohuan
|
||||
FightEnd
|
||||
}
|
||||
MissionHeroCompComp --> SingletonModuleComp : "使用"
|
||||
MissionHeroCompComp --> Hero : "创建"
|
||||
MissionHeroCompComp --> GameEvent : "监听"
|
||||
SingletonModuleComp --> Hero : "配置"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L11-L81)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L20-L50)
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L15-L101)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### fight_ready方法实现
|
||||
|
||||
fight_ready方法是战斗准备阶段的核心入口点,负责初始化战斗环境中的英雄配置。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as "玩家"
|
||||
participant MissionHero as "MissionHeroCompComp"
|
||||
participant SMC as "SingletonModuleComp"
|
||||
participant Hero as "Hero实体"
|
||||
participant ECS as "ECS系统"
|
||||
Player->>MissionHero : 战斗准备开始
|
||||
MissionHero->>SMC : 获取战斗英雄配置
|
||||
SMC-->>MissionHero : 返回fight_hero配置
|
||||
MissionHero->>MissionHero : 设置hero_num=0
|
||||
MissionHero->>MissionHero : 调用addHero(fight_hero, false)
|
||||
MissionHero->>ECS : 获取Hero实体
|
||||
ECS-->>MissionHero : 返回Hero实例
|
||||
MissionHero->>Hero : load(position, scale, uuid)
|
||||
Hero->>Hero : 初始化英雄属性
|
||||
Hero->>Hero : 设置战斗位置
|
||||
Hero-->>Player : 英雄出现在战场
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L32-L42)
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L30-L60)
|
||||
|
||||
该方法执行以下关键步骤:
|
||||
|
||||
1. **状态重置**: 将`smc.vmdata.mission_data.hero_num`设置为0,清空当前英雄计数
|
||||
2. **英雄加载**: 调用`addHero(smc.fight_hero, false)`加载玩家选择的英雄
|
||||
3. **配置应用**: 使用SMC单例中的fight_hero配置作为英雄标识
|
||||
|
||||
**章节来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L32-L42)
|
||||
|
||||
### addHero方法实现
|
||||
|
||||
addHero方法是英雄加载的核心逻辑,负责通过ECS系统获取Hero实体并调用其load方法。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始addHero]) --> GetHero["获取Hero实体<br/>ecs.getEntity<Hero>(Hero)"]
|
||||
GetHero --> SetParams["设置参数<br/>hero_pos=0<br/>scale=1"]
|
||||
SetParams --> GetPos["获取英雄位置<br/>HeroPos[hero_pos].pos"]
|
||||
GetPos --> LoadHero["调用hero.load()<br/>加载英雄实体"]
|
||||
LoadHero --> InitProps["初始化英雄属性<br/>调用hero_init()"]
|
||||
InitProps --> SetDirection["设置移动方向<br/>根据英雄类型"]
|
||||
SetDirection --> UpdateCount["更新英雄计数<br/>smc.vmdata.mission_data.hero_num++"]
|
||||
UpdateCount --> End([结束])
|
||||
LoadHero --> ErrorHandler["错误处理"]
|
||||
ErrorHandler --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L64-L70)
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L30-L60)
|
||||
|
||||
addHero方法的具体实现细节:
|
||||
|
||||
1. **实体获取**: 使用`ecs.getEntity<Hero>(Hero)`从ECS系统中获取Hero实体
|
||||
2. **参数设置**: 固定英雄位置索引为0,缩放比例为1
|
||||
3. **位置计算**: 从HeroPos配置中获取英雄的战斗位置
|
||||
4. **英雄加载**: 调用hero.load()方法完成英雄实体的初始化和渲染
|
||||
|
||||
**章节来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L64-L70)
|
||||
|
||||
### zhao_huan事件处理
|
||||
|
||||
zhao_huan方法响应召唤指令事件,实现实时英雄召唤功能。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant UI as "用户界面"
|
||||
participant MissionHero as "MissionHeroCompComp"
|
||||
participant EventSys as "事件系统"
|
||||
participant Hero as "Hero实体"
|
||||
UI->>EventSys : 发送Zhaohuan事件
|
||||
EventSys->>MissionHero : 触发zhao_huan回调
|
||||
MissionHero->>MissionHero : addHero(args.uuid, false)
|
||||
MissionHero->>Hero : 创建新英雄实例
|
||||
Hero-->>UI : 新英雄出现在战场
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L50-L52)
|
||||
|
||||
该方法的特点:
|
||||
- **实时响应**: 接收召唤事件参数中的英雄UUID
|
||||
- **即时召唤**: 直接调用addHero方法加载新英雄
|
||||
- **非召唤模式**: 第二个参数为false,表示这不是召唤模式的英雄
|
||||
|
||||
**章节来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L50-L52)
|
||||
|
||||
### clear_heros方法
|
||||
|
||||
clear_heros方法在战斗结束时执行英雄清理逻辑,确保战斗环境的正确重置。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([战斗结束]) --> ClearMethod["调用clear_heros()"]
|
||||
ClearMethod --> LogCheck{"检查日志输出"}
|
||||
LogCheck --> |启用| LogMessage["打印清理消息"]
|
||||
LogCheck --> |禁用| SkipLog["跳过日志"]
|
||||
LogMessage --> End([清理完成])
|
||||
SkipLog --> End
|
||||
Note1["目前方法体为空<br/>预留扩展空间"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L28-L30)
|
||||
|
||||
当前实现特点:
|
||||
- **空方法体**: 目前方法体为空,但预留了扩展空间
|
||||
- **日志占位**: 包含注释掉的日志输出语句
|
||||
- **扩展性**: 为未来的清理逻辑提供了接口
|
||||
|
||||
**章节来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L28-L30)
|
||||
|
||||
## 英雄生命周期管理
|
||||
|
||||
### 英雄创建流程
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 初始化
|
||||
初始化 --> 配置加载 : fight_ready事件
|
||||
配置加载 --> 实体获取 : ecs.getEntity<Hero>()
|
||||
实体获取 --> 位置设置 : HeroPos配置
|
||||
位置设置 --> 属性初始化 : hero_init()
|
||||
属性初始化 --> 移动设置 : BattleMove配置
|
||||
移动设置 --> 计数更新 : hero_num++
|
||||
计数更新 --> 战场就绪 : 英雄出现在战场
|
||||
战场就绪 --> 战斗中 : 开始战斗
|
||||
战斗中 --> 死亡检测 : 英雄死亡
|
||||
死亡检测 --> 清理处理 : 英雄移除
|
||||
清理处理 --> [*]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L30-L80)
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L64-L70)
|
||||
|
||||
### 英雄属性系统
|
||||
|
||||
HeroViewComp组件负责管理英雄的所有属性和状态:
|
||||
|
||||
| 属性类别 | 属性名称 | 描述 | 类型 |
|
||||
|---------|---------|------|------|
|
||||
| 基础属性 | base_hp/base_mp | 基础生命值/魔法值 | number |
|
||||
| 核心属性 | hp/mp | 当前生命值/魔法值 | number |
|
||||
| 攻击属性 | base_ap/base_map | 基础物理攻击/魔法攻击 | number |
|
||||
| 防御属性 | base_def/mdef | 基础物理防御/魔法防御 | number |
|
||||
| 移动属性 | base_speed/base_dis | 基础移动速度/攻击距离 | number |
|
||||
| BUFF系统 | BUFFS/BUFFS_TEMP | 持久/临时BUFF数组 | Record |
|
||||
|
||||
**章节来源**
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L72-L120)
|
||||
|
||||
## 事件处理机制
|
||||
|
||||
### 事件监听配置
|
||||
|
||||
MissionHeroCompComp通过on方法注册三个关键事件的处理器:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "事件监听"
|
||||
FightReady[FightReady<br/>战斗准备]
|
||||
Zhaohuan[Zhaohuan<br/>英雄召唤]
|
||||
FightEnd[FightEnd<br/>战斗结束]
|
||||
end
|
||||
subgraph "处理方法"
|
||||
FRHandler[fight_ready]
|
||||
ZHHandler[zhao_huan]
|
||||
FERHandler[clear_heros]
|
||||
end
|
||||
FightReady --> FRHandler
|
||||
Zhaohuan --> ZHHandler
|
||||
FightEnd --> FERHandler
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L19-L23)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L15-L25)
|
||||
|
||||
### 事件触发时机
|
||||
|
||||
| 事件名称 | 触发时机 | 处理内容 |
|
||||
|---------|---------|---------|
|
||||
| FightReady | 战斗开始前 | 初始化战斗英雄配置 |
|
||||
| Zhaohuan | 英雄召唤时 | 动态添加新英雄 |
|
||||
| FightEnd | 战斗结束后 | 清理战斗环境 |
|
||||
|
||||
**章节来源**
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L15-L25)
|
||||
|
||||
## 数据绑定关系
|
||||
|
||||
### SMC单例中的英雄数据
|
||||
|
||||
SingletonModuleComp通过vmdata属性系统实现与UI层的数据绑定:
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
SingletonModuleComp {
|
||||
number fight_hero
|
||||
any heros
|
||||
any monsters
|
||||
object vmdata
|
||||
}
|
||||
VMData {
|
||||
boolean game_over
|
||||
boolean game_pause
|
||||
object mission_data
|
||||
number gold
|
||||
}
|
||||
MissionData {
|
||||
number mon_num
|
||||
number hero_num
|
||||
number wave_time_num
|
||||
boolean in_fight
|
||||
number fight_time
|
||||
number level
|
||||
number max_mission
|
||||
number coin
|
||||
}
|
||||
SingletonModuleComp ||--|| VMData : "包含"
|
||||
VMData ||--|| MissionData : "包含"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L40-L60)
|
||||
|
||||
### 数据流映射
|
||||
|
||||
| 数据源 | 目标组件 | 绑定方式 | 更新时机 |
|
||||
|-------|---------|---------|---------|
|
||||
| smc.fight_hero | MissionHeroCompComp | 直接访问 | 战斗准备时 |
|
||||
| smc.heros | UI界面 | MVVM绑定 | 英雄解锁时 |
|
||||
| smc.vmdata.mission_data.hero_num | 战斗计数器 | 自动更新 | 英雄加载时 |
|
||||
| smc.vmdata.gold | 金币显示 | MVVM绑定 | 金币变化时 |
|
||||
|
||||
**章节来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L40-L60)
|
||||
|
||||
## 时序图示例
|
||||
|
||||
### 完整英雄加载时序
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as "玩家"
|
||||
participant UI as "UI界面"
|
||||
participant SMC as "SMC单例"
|
||||
participant MissionHero as "MissionHeroComp"
|
||||
participant ECS as "ECS系统"
|
||||
participant Hero as "Hero实体"
|
||||
participant BattleMove as "BattleMove组件"
|
||||
Note over Player,BattleMove : 战斗准备阶段
|
||||
Player->>UI : 选择战斗英雄
|
||||
UI->>SMC : updateFihgtHero(5001)
|
||||
SMC->>SMC : 更新fight_hero配置
|
||||
Player->>MissionHero : 触发FightReady事件
|
||||
MissionHero->>SMC : 获取smc.fight_hero
|
||||
SMC-->>MissionHero : 返回英雄UUID 5001
|
||||
MissionHero->>MissionHero : 设置hero_num=0
|
||||
Note over Player,BattleMove : 英雄加载阶段
|
||||
MissionHero->>ECS : ecs.getEntity<Hero>(Hero)
|
||||
ECS-->>MissionHero : 返回Hero实例
|
||||
MissionHero->>Hero : load(v3(-240,100,0), 1, 5001)
|
||||
Hero->>Hero : 初始化英雄属性
|
||||
Hero->>Hero : 设置战斗位置
|
||||
Hero->>BattleMove : 配置移动方向
|
||||
BattleMove-->>Hero : 设置targetX=0
|
||||
Hero->>SMC : 更新hero_num++
|
||||
SMC-->>Player : 英雄出现在战场
|
||||
Note over Player,BattleMove : 战斗进行阶段
|
||||
Player->>MissionHero : 触发Zhaohuan事件
|
||||
MissionHero->>ECS : 再次获取Hero实体
|
||||
ECS-->>MissionHero : 返回新的Hero实例
|
||||
MissionHero->>Hero : load(v3(0,100,0), 1, 新英雄UUID)
|
||||
Hero-->>Player : 新英雄加入战斗
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L32-L70)
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L30-L80)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L120-L140)
|
||||
|
||||
### 英雄召唤时序
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as "玩家"
|
||||
participant UI as "UI界面"
|
||||
participant MissionHero as "MissionHeroComp"
|
||||
participant EventSys as "事件系统"
|
||||
participant ECS as "ECS系统"
|
||||
participant Hero as "Hero实体"
|
||||
Player->>UI : 点击召唤按钮
|
||||
UI->>EventSys : dispatchEvent(Zhaohuan, {uuid : 5002})
|
||||
EventSys->>MissionHero : 触发zhao_huan事件
|
||||
MissionHero->>MissionHero : addHero(5002, false)
|
||||
MissionHero->>ECS : ecs.getEntity<Hero>(Hero)
|
||||
ECS-->>MissionHero : 返回Hero实例
|
||||
MissionHero->>Hero : load(v3(0,100,0), 1, 5002)
|
||||
Hero->>Hero : 初始化新英雄属性
|
||||
Hero->>Hero : 设置战斗位置
|
||||
Hero-->>Player : 新英雄出现在战场
|
||||
Note over Player,Hero : 英雄加入战斗
|
||||
Hero->>Hero : 开始参与战斗
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L50-L52)
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L30-L60)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### ECS架构优势
|
||||
|
||||
1. **组件化设计**: Hero实体采用ECS架构,避免了传统继承层次的复杂性
|
||||
2. **内存优化**: 通过组件池复用Hero实体,减少内存分配开销
|
||||
3. **系统解耦**: 各组件职责单一,便于维护和扩展
|
||||
|
||||
### 事件处理优化
|
||||
|
||||
1. **事件监听**: 使用事件系统解耦组件间的直接依赖
|
||||
2. **延迟处理**: 通过定时器控制英雄召唤间隔
|
||||
3. **状态管理**: 通过SMC单例集中管理全局状态
|
||||
|
||||
### 渲染性能
|
||||
|
||||
1. **批量操作**: 批量处理英雄位置和属性更新
|
||||
2. **组件缓存**: 缓存HeroViewComp等常用组件引用
|
||||
3. **条件渲染**: 根据战斗状态动态启用/禁用组件
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
| 问题类型 | 症状描述 | 可能原因 | 解决方案 |
|
||||
|---------|---------|---------|---------|
|
||||
| 英雄不出现 | 战斗开始后没有英雄 | fight_hero配置错误 | 检查smc.fight_hero设置 |
|
||||
| 英雄位置错误 | 英雄出现在错误位置 | HeroPos配置问题 | 验证HeroPos数组配置 |
|
||||
| 英雄属性异常 | 英雄属性显示错误 | HeroInfo配置缺失 | 检查HeroInfo中的英雄数据 |
|
||||
| 事件不响应 | Zhaohuan事件无效 | 事件监听未注册 | 确认on方法调用 |
|
||||
|
||||
### 调试技巧
|
||||
|
||||
1. **日志输出**: 启用注释掉的日志语句进行调试
|
||||
2. **断点调试**: 在关键方法设置断点观察变量状态
|
||||
3. **状态检查**: 通过浏览器开发者工具检查SMC状态
|
||||
|
||||
**章节来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L32-L70)
|
||||
|
||||
## 总结
|
||||
|
||||
MissionHeroCompComp类通过精心设计的ECS架构和事件驱动机制,实现了完整的英雄生命周期管理。该系统具有以下核心优势:
|
||||
|
||||
1. **模块化设计**: 清晰的职责分离和组件化架构
|
||||
2. **事件驱动**: 基于事件系统的松耦合设计
|
||||
3. **数据绑定**: 与UI层的无缝数据同步
|
||||
4. **扩展性强**: 预留的扩展点支持未来功能增强
|
||||
5. **性能优化**: 通过ECS架构实现高效的组件管理
|
||||
|
||||
该英雄管理系统为游戏战斗提供了稳定可靠的基础框架,支持动态英雄召唤、战斗状态管理和资源回收等功能,是整个战斗系统的重要组成部分。
|
||||
167
.qoder/repowiki/zh/content/奖励系统/奖励机制/奖励UI集成.md
Normal file
167
.qoder/repowiki/zh/content/奖励系统/奖励机制/奖励UI集成.md
Normal file
@@ -0,0 +1,167 @@
|
||||
# 奖励UI集成
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [Design.md](file://assets/script/Design.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文档详细说明了MissionComp组件如何与胜利界面(Victory)进行集成,重点分析了oops.gui.open(UIID.Victory)调用时传递rewards和game_data参数的具体实现。文档解释了胜利界面如何解析这些数据并渲染三选一奖励选项,描述了从战斗结束到奖励界面展示的完整用户流程,包括延迟调度(scheduleOnce)的时间控制策略。同时提供了UI数据绑定错误的诊断方法,并给出了自定义奖励展示效果的扩展建议。
|
||||
|
||||
## 项目结构
|
||||
项目结构显示了游戏的核心脚本位于assets/script/game目录下,其中map子目录包含了MissionComp和VictoryComp等关键组件。这些组件通过ECS架构进行组织,实现了战斗逻辑与UI展示的分离。资源文件和配置文件分别存放在resources和config目录中,形成了清晰的模块化结构。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "Assets"
|
||||
subgraph "Script"
|
||||
subgraph "Game"
|
||||
subgraph "Map"
|
||||
MissionComp --> VictoryComp
|
||||
MissionComp --> TopComp
|
||||
MissionComp --> GuideSetpComp
|
||||
end
|
||||
subgraph "Common"
|
||||
SingletonModuleComp --> GameEvent
|
||||
SingletonModuleComp --> GameUIConfig
|
||||
end
|
||||
end
|
||||
end
|
||||
subgraph "Resources"
|
||||
subgraph "Config"
|
||||
NetCodeJson --> MapJson
|
||||
end
|
||||
LanguageJson --> ZhJson
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
|
||||
## 核心组件
|
||||
核心组件包括MissionComp和VictoryComp,分别负责战斗逻辑管理和胜利界面展示。MissionComp组件通过事件系统监听战斗状态变化,在战斗结束后触发胜利界面的打开,并传递奖励数据。VictoryComp组件接收这些数据并在onAdded方法中进行处理,实现奖励选项的动态渲染。
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L17-L150)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L13-L74)
|
||||
|
||||
## 架构概述
|
||||
系统采用ECS(实体-组件-系统)架构模式,通过事件驱动机制实现组件间的通信。战斗逻辑与UI展示完全分离,MissionComp作为战斗逻辑控制器,负责管理战斗状态和奖励生成;VictoryComp作为UI控制器,负责解析和展示奖励数据。这种架构设计提高了代码的可维护性和可扩展性。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[MissionComp] --> |dispatchEvent| B[GameEvent.FightEnd]
|
||||
B --> C[VictoryComp]
|
||||
C --> |open UIID.Victory| D[奖励界面]
|
||||
D --> |用户选择| E[奖励应用]
|
||||
E --> |dispatchEvent| F[GameEvent.MissionEnd]
|
||||
F --> G[游戏状态更新]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L116)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L13-L74)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### MissionComp分析
|
||||
MissionComp组件是战斗逻辑的核心控制器,负责管理整个战斗流程。当英雄死亡或战斗结束时,该组件会触发相应的事件处理函数,并通过oops.gui.open方法打开胜利界面。
|
||||
|
||||
#### 战斗结束流程
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MissionComp as MissionComp
|
||||
participant VictoryComp as VictoryComp
|
||||
participant OopsGUI as oops.gui
|
||||
MissionComp->>MissionComp : do_hero_dead()
|
||||
MissionComp->>MissionComp : check hero_num <= 0
|
||||
MissionComp->>MissionComp : dispatchEvent(FightEnd)
|
||||
MissionComp->>OopsGUI : open(UIID.Victory, args)
|
||||
OopsGUI->>VictoryComp : instantiate victory prefab
|
||||
VictoryComp->>VictoryComp : onAdded(args)
|
||||
VictoryComp->>VictoryComp : parse rewards and game_data
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L32-L70)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L13-L74)
|
||||
|
||||
### VictoryComp分析
|
||||
VictoryComp组件负责胜利界面的展示和交互处理。该组件通过onAdded方法接收来自MissionComp的数据参数,并在界面上渲染相应的奖励选项。
|
||||
|
||||
#### 数据传递与解析
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([UI打开]) --> OnAdded["onAdded(args)"]
|
||||
OnAdded --> CheckArgs{"args存在?"}
|
||||
CheckArgs --> |是| ParseGameData["解析game_data"]
|
||||
ParseGameData --> UpdateUI["更新UI元素"]
|
||||
UpdateUI --> ScheduleNext["scheduleOnce显示next按钮"]
|
||||
ScheduleNext --> End([界面就绪])
|
||||
CheckArgs --> |否| DefaultValues["使用默认值"]
|
||||
DefaultValues --> UpdateUI
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L13-L37)
|
||||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts#L9-L22)
|
||||
|
||||
## 依赖分析
|
||||
组件间的依赖关系清晰明确,MissionComp依赖于GameEvent和UIID枚举来触发界面切换,VictoryComp依赖于SingletonModuleComp来访问全局游戏数据。这种依赖关系通过import语句在代码中显式声明,确保了模块间的松耦合。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[MissionComp] --> B[GameEvent]
|
||||
A --> C[UIID]
|
||||
A --> D[SingletonModuleComp]
|
||||
E[VictoryComp] --> F[GameEvent]
|
||||
E --> G[SingletonModuleComp]
|
||||
E --> H[ItemComp]
|
||||
D --> I[vmdata]
|
||||
G --> I
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L33)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L37)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L0-L41)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L33)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L37)
|
||||
|
||||
## 性能考虑
|
||||
系统在性能方面采用了多种优化策略。首先,通过scheduleOnce方法实现了界面元素的延迟显示,避免了瞬间大量UI更新带来的性能冲击。其次,组件的销毁通过reset方法完成,确保了内存的及时释放。最后,事件系统的使用减少了组件间的直接调用,降低了耦合度和性能开销。
|
||||
|
||||
## 故障排除指南
|
||||
当遇到UI数据绑定错误时,应首先检查数据传递路径。确保MissionComp中的rewards和game_data字段正确初始化,并在oops.gui.open调用时作为参数传递。在VictoryComp的onAdded方法中,验证args参数是否包含预期的数据字段。如果问题仍然存在,检查SingletonModuleComp中的vmdata结构是否与UI绑定要求一致。
|
||||
|
||||
**Section sources**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L13-L74)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#37-L87)
|
||||
|
||||
## 结论
|
||||
MissionComp与Victory界面的集成通过清晰的事件驱动机制和数据传递模式实现。系统利用scheduleOnce方法控制界面元素的显示时机,提供了流畅的用户体验。通过分析代码结构和数据流,可以有效诊断和解决UI集成中的常见问题,并为自定义奖励展示效果提供扩展基础。
|
||||
169
.qoder/repowiki/zh/content/奖励系统/奖励机制/奖励数据流.md
Normal file
169
.qoder/repowiki/zh/content/奖励系统/奖励机制/奖励数据流.md
Normal file
@@ -0,0 +1,169 @@
|
||||
# 奖励数据流
|
||||
|
||||
<cite>
|
||||
**本文档引用文件**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [奖励数据生命周期](#奖励数据生命周期)
|
||||
3. [rewards数组存储格式与UI展示](#rewards数组存储格式与ui展示)
|
||||
4. [game_data对象累加逻辑](#game_data对象累加逻辑)
|
||||
5. [数据同步策略](#数据同步策略)
|
||||
6. [数据丢失问题调试](#数据丢失问题调试)
|
||||
7. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
本文档系统阐述了奖励数据在MissionComp组件中的完整生命周期管理过程。从data_init方法初始化rewards数组和game_data对象开始,到do_drop方法接收掉落物品参数并更新数据结构的全过程。详细解释了rewards数组的存储格式设计及其与UI展示的对应关系,分析了game_data对象中exp、gold、diamond字段的累加逻辑与数据一致性保障机制,说明了MissionComp与全局状态管理smc.vmdata.mission_data的数据同步策略,并提供了数据丢失问题的调试方法。
|
||||
|
||||
## 奖励数据生命周期
|
||||
|
||||
奖励数据在MissionComp组件中的生命周期始于任务开始时的初始化,终于任务结束时的数据清理。整个生命周期通过事件驱动的方式进行管理,确保数据的准确性和一致性。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["任务开始 MissionStart"] --> B["data_init初始化"]
|
||||
B --> C["do_drop接收掉落物品"]
|
||||
C --> D["更新rewards数组"]
|
||||
D --> E["更新game_data对象"]
|
||||
E --> F["任务结束 FightEnd"]
|
||||
F --> G["数据同步到全局状态"]
|
||||
G --> H["打开胜利界面"]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L150)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L150)
|
||||
|
||||
## rewards数组存储格式与UI展示
|
||||
|
||||
rewards数组用于存储任务过程中获得的所有掉落物品信息。该数组在data_init方法中被初始化为空数组,随着任务进行逐步填充。数组的设计考虑了后续UI展示的需求,每个元素代表一个掉落物品。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MissionComp {
|
||||
+rewards : any[]
|
||||
+game_data : any
|
||||
+data_init()
|
||||
+do_drop(drop_item[], game_data)
|
||||
}
|
||||
class VictoryComp {
|
||||
+rewards : any[]
|
||||
+game_data : any
|
||||
+onAdded(args)
|
||||
}
|
||||
MissionComp --> VictoryComp : "传递数据"
|
||||
```
|
||||
|
||||
当任务结束时,rewards数组作为参数传递给胜利界面(VictoryComp),实现数据的跨组件传递。这种设计模式确保了奖励数据的完整性和可追溯性。
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L33)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L37)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L33)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L37)
|
||||
|
||||
## game_data对象累加逻辑
|
||||
|
||||
game_data对象包含exp、gold、diamond三个核心字段,用于记录任务过程中的经验值、金币和钻石奖励。这些数据的累加逻辑通过do_drop方法实现,确保每次获得奖励时都能正确更新。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A["do_drop方法"] --> B["接收game_data参数"]
|
||||
B --> C{"参数有效性检查"}
|
||||
C --> |有效| D["累加exp、gold、diamond"]
|
||||
C --> |无效| E["使用默认值{exp:0,gold:0,diamond:0}"]
|
||||
D --> F["更新本地game_data对象"]
|
||||
F --> G["数据一致性保障"]
|
||||
```
|
||||
|
||||
数据一致性通过以下机制保障:
|
||||
1. 初始化时设置默认值
|
||||
2. 参数传递时提供默认值
|
||||
3. 事件驱动更新,避免直接修改
|
||||
4. 任务结束时统一同步到全局状态
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L32-L70)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L32-L70)
|
||||
|
||||
## 数据同步策略
|
||||
|
||||
MissionComp组件与全局状态管理smc.vmdata.mission_data之间采用事件驱动的数据同步策略。当特定事件发生时,相关数据会被同步到全局状态,确保数据的一致性和可访问性。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MissionComp
|
||||
participant smc_vmdata
|
||||
participant VictoryComp
|
||||
MissionComp->>MissionComp : data_init()
|
||||
MissionComp->>smc_vmdata : 初始化mission_data状态
|
||||
MissionComp->>MissionComp : do_drop(drop_item, game_data)
|
||||
MissionComp->>MissionComp : 更新本地数据
|
||||
MissionComp->>smc_vmdata : 同步关键状态(如mon_num)
|
||||
MissionComp->>VictoryComp : FightEnd事件
|
||||
VictoryComp->>VictoryComp : 接收rewards和game_data
|
||||
VictoryComp->>smc_vmdata : 最终数据持久化
|
||||
```
|
||||
|
||||
除了直接的奖励数据,其他任务相关状态如怪物数量(mon_num)、英雄数量(hero_num)等也会同步到全局状态,为其他组件提供必要的上下文信息。
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L116)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L57-L93)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L116)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L57-L93)
|
||||
|
||||
## 数据丢失问题调试
|
||||
|
||||
为确保奖励数据的完整性和可靠性,需要建立系统的调试方法来检测和解决潜在的数据丢失问题。以下是常见的调试策略和检查点:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["数据丢失问题"] --> B["检查事件监听"]
|
||||
A --> C["验证数据初始化"]
|
||||
A --> D["确认数据传递"]
|
||||
A --> E["检查异常处理"]
|
||||
B --> B1["MissionStart事件是否正确触发"]
|
||||
B --> B2["do_drop事件参数是否完整"]
|
||||
B --> B3["FightEnd事件是否携带数据"]
|
||||
C --> C1["data_init是否清空rewards数组"]
|
||||
C --> C2["game_data是否重置为默认值"]
|
||||
D --> D1["胜利界面是否正确接收参数"]
|
||||
D --> D2["数据结构是否匹配"]
|
||||
E --> E1["异常情况下数据是否保存"]
|
||||
E --> E2["网络中断时的恢复机制"]
|
||||
```
|
||||
|
||||
关键调试检查点包括:
|
||||
1. 确认data_init方法在每次任务开始时都被正确调用
|
||||
2. 验证do_drop方法接收的参数格式是否符合预期
|
||||
3. 检查FightEnd事件触发时是否正确传递了rewards和game_data
|
||||
4. 确保异常情况下(如游戏崩溃)有适当的数据恢复机制
|
||||
5. 验证全局状态smc.vmdata.mission_data的更新时机和内容
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L114-L150)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L47-L86)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L114-L150)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L47-L86)
|
||||
|
||||
## 结论
|
||||
MissionComp组件中的奖励数据管理采用了一套完整的生命周期管理体系。通过data_init方法初始化数据结构,do_drop方法处理奖励更新,最终通过事件机制将数据传递给胜利界面展示。rewards数组和game_data对象的设计充分考虑了UI展示需求和数据一致性要求。与全局状态管理smc.vmdata.mission_data的同步策略确保了数据的可靠性和可访问性。为防止数据丢失,建议建立完善的调试机制,重点关注事件触发、数据初始化、参数传递和异常处理等关键环节。
|
||||
272
.qoder/repowiki/zh/content/奖励系统/奖励机制/奖励机制.md
Normal file
272
.qoder/repowiki/zh/content/奖励系统/奖励机制/奖励机制.md
Normal file
@@ -0,0 +1,272 @@
|
||||
# 奖励机制
|
||||
|
||||
<cite>
|
||||
**本文档引用文件**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
- [Design.md](file://assets/script/Design.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [奖励系统概述](#奖励系统概述)
|
||||
2. [三选一奖励机制](#三选一奖励机制)
|
||||
3. [FightSet常量配置与奖励类型](#fightset常量配置与奖励类型)
|
||||
4. [奖励数据结构与流程](#奖励数据结构与流程)
|
||||
5. [掉落处理与数据更新](#掉落处理与数据更新)
|
||||
6. [奖励界面触发与数据传递](#奖励界面触发与数据传递)
|
||||
7. [扩展新奖励类型](#扩展新奖励类型)
|
||||
|
||||
## 奖励系统概述
|
||||
|
||||
本游戏采用肉鸽(Roguelike)塔防玩法,奖励系统是核心成长机制之一。玩家通过击败怪物获得金币,并在每波战斗结束后从三个奖励选项中选择一个,用于强化英雄能力。奖励类型包括属性提升、技能升级、装备获取、新技能解锁等,不同奖励具有不同的战力评分和金币消耗,玩家需要根据当前局势进行策略性选择。
|
||||
|
||||
奖励系统通过事件驱动机制实现,主要由`MissionComp`组件负责奖励数据的收集与分发,`VictoryComp`组件负责奖励界面的展示与交互。系统采用ECS架构,通过事件总线(`oops.message`)进行组件间通信,确保了高内聚低耦合的设计原则。
|
||||
|
||||
**Section sources**
|
||||
- [Design.md](file://assets/script/Design.md#L0-L40)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L150)
|
||||
|
||||
## 三选一奖励机制
|
||||
|
||||
三选一奖励机制是游戏的核心决策系统,其触发条件为每波怪物被全部击败后。当`MissionMonComp`组件检测到当前波次怪物全部死亡时,会触发`FightEnd`事件,进而启动奖励选择流程。
|
||||
|
||||
该机制的实现逻辑如下:
|
||||
1. 战斗结束时,`MissionComp`组件监听到`FightEnd`事件
|
||||
2. 收集本局战斗的奖励数据(金币、经验、钻石等)
|
||||
3. 构建奖励选项数组,通常包含三个不同强度的奖励
|
||||
4. 通过GUI系统打开胜利界面(Victory界面),并传递奖励数据
|
||||
5. 玩家在界面中选择一个奖励,系统应用对应效果
|
||||
|
||||
奖励选项的设计遵循"弱、一般、强"的梯度原则,不同选项消耗的金币数量不同,战力评分也不同,鼓励玩家进行策略性决策。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MissionMonComp as MissionMonComp
|
||||
participant MissionComp as MissionComp
|
||||
participant VictoryComp as VictoryComp
|
||||
participant GUI as GUI系统
|
||||
MissionMonComp->>MissionComp : MonDead事件(最后一只怪物死亡)
|
||||
MissionComp->>MissionComp : 检查怪物数量是否为0
|
||||
MissionComp->>MissionComp : 触发FightEnd事件
|
||||
MissionComp->>MissionComp : 收集game_data(金币、经验等)
|
||||
MissionComp->>GUI : 打开Victory界面并传递数据
|
||||
GUI->>VictoryComp : 初始化奖励界面
|
||||
VictoryComp->>Player : 显示三个奖励选项
|
||||
Player->>VictoryComp : 选择奖励
|
||||
VictoryComp->>MissionComp : 应用所选奖励效果
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L23-L70)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L19-L37)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
|
||||
|
||||
## FightSet常量配置与奖励类型
|
||||
|
||||
`FightSet`枚举定义在`Mission.ts`文件中,包含了游戏的核心配置常量,其中与奖励系统直接相关的配置项包括:
|
||||
|
||||
- `GREEN_GOLD=1`:绿色金币,基础奖励单位
|
||||
- `BLUE_GOLD=2`:蓝色金币,中级奖励单位
|
||||
- `PURPLE_GOLD=3`:紫色金币,高级奖励单位
|
||||
- `ORANGE_GOLD=4`:橙色金币,稀有奖励单位
|
||||
- `ATK_ADD_GLOD=1`:伙伴攻击力增加对应的金币奖励值
|
||||
|
||||
这些常量定义了不同品质奖励的数值基准,系统根据这些基准值计算实际奖励数量。例如,普通怪物可能掉落`GREEN_GOLD`数量的金币,而精英怪物或Boss可能掉落`PURPLE_GOLD`或`ORANGE_GOLD`数量的金币。
|
||||
|
||||
此外,`FightSet`还定义了其他影响奖励获取的参数,如`MORE_RC=10`表示通过观看广告可获得的额外次数,这与奖励系统的双倍奖励功能相关联。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L35)
|
||||
|
||||
## 奖励数据结构与流程
|
||||
|
||||
### 数据结构分析
|
||||
|
||||
`MissionComp`组件中定义了两个关键数据结构:
|
||||
|
||||
1. **rewards数组**:用于存储掉落物品列表
|
||||
```typescript
|
||||
rewards:any[]=[]
|
||||
```
|
||||
|
||||
2. **game_data对象**:用于存储游戏数据
|
||||
```typescript
|
||||
game_data:any={
|
||||
exp:0,
|
||||
gold:0,
|
||||
diamond:0
|
||||
}
|
||||
```
|
||||
|
||||
`rewards`数组存储具体的物品奖励,如装备、技能书等;`game_data`对象则存储基础资源类奖励,包括经验值、金币和钻石。
|
||||
|
||||
### 奖励收集流程
|
||||
|
||||
奖励数据的收集与分发流程如下:
|
||||
|
||||
1. **初始化阶段**:在`data_init()`方法中,重置`rewards`数组和`game_data`对象
|
||||
2. **战斗阶段**:通过监听`MonDead`事件,逐步累积奖励数据
|
||||
3. **结束阶段**:当战斗结束时,将收集到的奖励数据传递给胜利界面
|
||||
|
||||
数据流从怪物死亡事件开始,经过`MissionComp`组件的收集处理,最终传递给`VictoryComp`组件进行展示,形成了完整的奖励数据流转闭环。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[怪物死亡] --> B{是否为最后一只}
|
||||
B --> |是| C[触发FightEnd事件]
|
||||
B --> |否| D[继续战斗]
|
||||
C --> E[收集奖励数据]
|
||||
E --> F[填充rewards数组和game_data]
|
||||
F --> G[打开Victory界面]
|
||||
G --> H[展示奖励选项]
|
||||
H --> I[玩家选择奖励]
|
||||
I --> J[应用奖励效果]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L23-L33)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L133-L135)
|
||||
|
||||
## 掉落处理与数据更新
|
||||
|
||||
`do_drop`方法是处理掉落物品和更新游戏数据的核心方法。该方法接收两个参数:`drop_item`数组和`game_data`对象,分别表示掉落的物品列表和基础资源奖励。
|
||||
|
||||
```typescript
|
||||
do_drop(drop_item:any[],game_data:any={exp:0,gold:0,diamond:0}){
|
||||
// console.log("[MissionComp] do_drop",drop_item,game_data)
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
虽然当前实现为空,但从方法签名可以看出其设计意图:
|
||||
- `drop_item`参数接收掉落的物品数组,可能包含装备、道具等
|
||||
- `game_data`参数接收基础资源奖励,默认值为零
|
||||
- 方法内部应实现将掉落物品添加到`rewards`数组,并将资源奖励累加到`game_data`对象中
|
||||
|
||||
在`MissionMonComp`组件中,可以找到实际的奖励发放逻辑。当关卡类型为"event"(事件关卡)时,会触发随机事件,其中`EventType.TREASURE`(宝藏事件)会直接增加50金币:
|
||||
```typescript
|
||||
switch (this.currentEvent) {
|
||||
case EventType.TREASURE:
|
||||
smc.vmdata.mission_data.gold += 50; // 增加50金币
|
||||
break;
|
||||
}
|
||||
```
|
||||
|
||||
这种设计模式表明,实际的奖励发放可能分散在多个组件中,最终由`MissionComp`统一收集和管理。
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L60-L63)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L145-L148)
|
||||
|
||||
## 奖励界面触发与数据传递
|
||||
|
||||
### 事件监听机制
|
||||
|
||||
`MissionComp`组件通过事件监听机制触发奖励界面的展示。在`onLoad`方法中,注册了对`FightEnd`事件的监听:
|
||||
|
||||
```typescript
|
||||
this.on(GameEvent.FightEnd,this.fight_end,this)
|
||||
```
|
||||
|
||||
当战斗结束时,`fight_end`方法会被调用,该方法通过`oops.gui.open`方法打开胜利界面,并传递奖励数据:
|
||||
|
||||
```typescript
|
||||
oops.gui.open(UIID.Victory,{victory:false,rewards:this.rewards,game_data:this.game_data})
|
||||
```
|
||||
|
||||
### 数据传递机制
|
||||
|
||||
数据传递通过`open`方法的参数实现,传递了三个关键数据:
|
||||
- `victory`:布尔值,表示战斗结果
|
||||
- `rewards`:奖励物品数组
|
||||
- `game_data`:基础资源数据对象
|
||||
|
||||
在`VictoryComp`组件的`onAdded`方法中接收这些数据:
|
||||
|
||||
```typescript
|
||||
onAdded(args: any) {
|
||||
if(args.game_data){
|
||||
this.game_data=args.game_data
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
这种事件驱动的数据传递机制确保了组件间的松耦合,`MissionComp`只需关注奖励数据的收集,而`VictoryComp`只需关注奖励数据的展示,职责分离清晰。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MissionComp {
|
||||
+rewards : any[]
|
||||
+game_data : any
|
||||
+onLoad()
|
||||
+fight_end()
|
||||
+do_drop()
|
||||
}
|
||||
class VictoryComp {
|
||||
+rewards : any[]
|
||||
+game_data : any
|
||||
+onAdded(args)
|
||||
+victory_end()
|
||||
}
|
||||
class GameEvent {
|
||||
+FightEnd : "FightEnd"
|
||||
+MissionEnd : "MissionEnd"
|
||||
}
|
||||
class UIID {
|
||||
+Victory : 2
|
||||
}
|
||||
MissionComp --> GameEvent : "监听"
|
||||
MissionComp --> UIID : "使用"
|
||||
MissionComp --> VictoryComp : "传递数据"
|
||||
VictoryComp --> GameEvent : "触发"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L23-L33)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L35-L37)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L43)
|
||||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts#L30)
|
||||
|
||||
## 扩展新奖励类型
|
||||
|
||||
### 配置修改步骤
|
||||
|
||||
1. **在Mission.ts中添加常量**:在`FightSet`枚举中添加新的奖励类型常量
|
||||
```typescript
|
||||
NEW_REWARD_TYPE=5 // 新奖励类型
|
||||
```
|
||||
|
||||
2. **在RogueConfig.ts中定义事件**:如果涉及新事件类型,需在`EventType`枚举中添加
|
||||
```typescript
|
||||
NEW_EVENT = "new_event"
|
||||
```
|
||||
|
||||
3. **更新事件概率配置**:在`EventConfig`中添加新事件的触发概率
|
||||
|
||||
### 代码集成步骤
|
||||
|
||||
1. **修改MissionComp.ts**:
|
||||
- 在`game_data`对象中添加新奖励字段
|
||||
- 在`do_drop`方法中处理新奖励类型的逻辑
|
||||
- 确保`rewards`数组能正确存储新类型的奖励物品
|
||||
|
||||
2. **更新VictoryComp.ts**:
|
||||
- 在`onAdded`方法中处理新奖励数据
|
||||
- 更新界面展示逻辑以支持新奖励类型的显示
|
||||
|
||||
3. **添加事件处理**:在`MissionMonComp`或相关组件中添加对新奖励事件的处理逻辑
|
||||
|
||||
4. **更新UI配置**:确保GUI系统能正确加载和显示新奖励类型的界面元素
|
||||
|
||||
通过以上步骤,可以无缝集成新的奖励类型,系统的设计具有良好的扩展性,新增奖励类型不会影响现有功能的稳定性。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L35)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L47-L86)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L23-L70)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L19-L37)
|
||||
177
.qoder/repowiki/zh/content/奖励系统/奖励机制/奖励触发机制.md
Normal file
177
.qoder/repowiki/zh/content/奖励系统/奖励机制/奖励触发机制.md
Normal file
@@ -0,0 +1,177 @@
|
||||
# 奖励触发机制
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [事件监听注册机制](#事件监听注册机制)
|
||||
3. [战斗事件响应逻辑](#战斗事件响应逻辑)
|
||||
4. [奖励发放触发流程](#奖励发放触发流程)
|
||||
5. [失败情况下的奖励处理](#失败情况下的奖励处理)
|
||||
6. [事件派发与数据更新链条](#事件派发与数据更新链条)
|
||||
7. [常见异常排查方案](#常见异常排查方案)
|
||||
8. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文档深入分析基于事件驱动的奖励触发机制,重点解析`MissionComp.ts`中`onLoad`方法注册的事件监听器。详细说明`do_mon_dead`、`do_hero_dead`等方法如何响应战斗事件并累积奖励数据,以及`fight_end`和`to_end_fight`方法中奖励发放的触发时机与条件判断逻辑。
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L20)
|
||||
|
||||
## 事件监听注册机制
|
||||
在`MissionComp`组件的`onLoad`方法中,系统注册了多个关键的游戏事件监听器,包括`GameEvent.FightEnd`、`GameEvent.MonDead`、`GameEvent.HeroDead`等。这些监听器构成了奖励触发系统的核心基础,确保在特定游戏事件发生时能够及时响应并执行相应的奖励逻辑。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[onLoad] --> B[注册GameEvent.MissionStart]
|
||||
A --> C[注册GameEvent.MonDead]
|
||||
A --> D[注册GameEvent.HeroDead]
|
||||
A --> E[注册GameEvent.FightEnd]
|
||||
A --> F[注册GameEvent.MissionEnd]
|
||||
A --> G[注册GameEvent.DO_AD_BACK]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L15-L21)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L15-L21)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L1-L70)
|
||||
|
||||
## 战斗事件响应逻辑
|
||||
当怪物死亡或英雄死亡事件发生时,系统会通过相应的事件处理器更新战斗状态数据。`do_mon_dead`方法在接收到`GameEvent.MonDead`事件后,会减少当前关卡中的怪物数量计数;而`do_hero_dead`方法在处理`GameEvent.HeroDead`事件时,会减少英雄数量,并在英雄全部阵亡时触发战斗结束事件。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Mon as 怪物
|
||||
participant HeroViewComp as HeroViewComp
|
||||
participant MissionComp as MissionComp
|
||||
Mon->>HeroViewComp : 被击败
|
||||
HeroViewComp->>HeroViewComp : do_dead()
|
||||
HeroViewComp->>HeroViewComp : 调度HeroDead事件
|
||||
HeroViewComp->>MissionComp : dispatchEvent(GameEvent.HeroDead)
|
||||
MissionComp->>MissionComp : do_hero_dead()
|
||||
MissionComp->>MissionComp : 更新英雄数量
|
||||
MissionComp->>MissionComp : 检查是否全部阵亡
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L570-L580)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L58-L67)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L58-L67)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L570-L580)
|
||||
|
||||
## 奖励发放触发流程
|
||||
奖励发放的触发主要通过`fight_end`和`to_end_fight`方法实现。当战斗结束条件满足时,系统会调度`GameEvent.FightEnd`事件,进而触发`fight_end`方法执行。该方法会在0.5秒延迟后清理战斗组件并重置游戏状态,确保奖励发放过程的稳定性和完整性。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[战斗结束条件满足] --> B[dispatchEvent(FightEnd)]
|
||||
B --> C[fight_end方法执行]
|
||||
C --> D[延迟0.5秒]
|
||||
D --> E[设置smc.mission.play=false]
|
||||
D --> F[设置smc.mission.pause=false]
|
||||
D --> G[cleanComponents()]
|
||||
G --> H[销毁HeroViewComp]
|
||||
G --> I[销毁AtkConCom]
|
||||
G --> J[销毁SkillViewCom]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L99-L114)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L99-L114)
|
||||
|
||||
## 失败情况下的奖励处理
|
||||
在战斗失败的情况下,系统会通过`do_hero_dead`方法中的逻辑判断来处理奖励。当英雄数量减至零或以下时,系统会立即派发`GameEvent.FightEnd`事件,并携带`{victory:false}`参数,同时打开胜利/失败界面,传递当前累积的奖励数据和游戏数据。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[英雄死亡] --> B[do_hero_dead执行]
|
||||
B --> C[英雄数量减1]
|
||||
C --> D{英雄数量<=0?}
|
||||
D --> |是| E[派发FightEnd事件]
|
||||
D --> |否| F[继续战斗]
|
||||
E --> G[打开胜利界面]
|
||||
G --> H[传递rewards数组]
|
||||
G --> I[传递game_data对象]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L62-L67)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L62-L67)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L1-L74)
|
||||
|
||||
## 事件派发与数据更新链条
|
||||
整个奖励触发系统依赖于清晰的事件派发与数据更新链条。从怪物死亡到最终奖励展示,每个环节都有明确的数据流转路径。系统使用`smc.vmdata.mission_data`作为共享数据存储,确保各个组件之间能够同步最新的战斗状态信息。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
MONSTER ||--o{ MISSION_DATA : "死亡时"
|
||||
HERO ||--o{ MISSION_DATA : "死亡时"
|
||||
MISSION_DATA ||--o{ REWARDS : "累积"
|
||||
MISSION_DATA ||--o{ GAME_DATA : "累积"
|
||||
REWARDS ||--o{ VICTORY_UI : "显示"
|
||||
GAME_DATA ||--o{ VICTORY_UI : "显示"
|
||||
class MISSION_DATA {
|
||||
int mon_num
|
||||
int hero_num
|
||||
float fight_time
|
||||
int level
|
||||
}
|
||||
class REWARDS {
|
||||
array rewards[]
|
||||
}
|
||||
class GAME_DATA {
|
||||
int exp
|
||||
int gold
|
||||
int diamond
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L23-L24)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L19-L20)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L23-L24)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L19-L20)
|
||||
|
||||
## 常见异常排查方案
|
||||
在实际运行过程中,可能会遇到一些常见的异常情况。以下是针对这些异常的排查方案:
|
||||
|
||||
1. **事件未正确触发**:检查事件名称是否拼写正确,确认事件监听器是否已正确注册。
|
||||
2. **奖励数据丢失**:验证`rewards`数组和`game_data`对象的初始化时机,确保在战斗开始前已完成初始化。
|
||||
3. **界面显示异常**:检查`VictoryComp`组件的`onAdded`方法中数据接收逻辑,确保参数传递正确。
|
||||
4. **性能问题**:监控`update`方法的执行频率,避免不必要的计算开销。
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[问题现象] --> B{问题类型}
|
||||
B --> |事件问题| C[检查事件名称]
|
||||
B --> |数据问题| D[检查数据初始化]
|
||||
B --> |界面问题| E[检查参数传递]
|
||||
B --> |性能问题| F[优化update逻辑]
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L133-L135)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L32-L33)
|
||||
|
||||
## 结论
|
||||
通过对`MissionComp.ts`中奖励触发逻辑的深入分析,我们了解到该系统采用事件驱动架构,通过注册和监听关键游戏事件来实现奖励的累积和发放。系统设计合理,各组件职责分明,数据流转清晰,为游戏的战斗奖励机制提供了可靠的支撑。
|
||||
234
.qoder/repowiki/zh/content/奖励系统/奖励机制/奖励配置.md
Normal file
234
.qoder/repowiki/zh/content/奖励系统/奖励机制/奖励配置.md
Normal file
@@ -0,0 +1,234 @@
|
||||
# 奖励配置
|
||||
|
||||
<cite>
|
||||
**本文档引用文件**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [奖励配置概述](#奖励配置概述)
|
||||
2. [FightSet枚举中的奖励配置项](#fightset枚举中的奖励配置项)
|
||||
3. [常量在奖励机制中的作用](#常量在奖励机制中的作用)
|
||||
4. [奖励平衡性调整方法](#奖励平衡性调整方法)
|
||||
5. [新增奖励类型的配置方法](#新增奖励类型的配置方法)
|
||||
6. [配置数据与运行时逻辑的映射关系](#配置数据与运行时逻辑的映射关系)
|
||||
7. [配置变更的正确加载机制](#配置变更的正确加载机制)
|
||||
|
||||
## 奖励配置概述
|
||||
|
||||
本节详细解析Mission.ts文件中FightSet枚举的奖励相关配置项,包括金币、经验、钻石的数值定义与获取规则。同时解释TAL_NUM天赋数量、MORE_RC广告奖励次数等常量在奖励机制中的作用,并提供修改FightSet常量调整奖励平衡性的方法。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L59)
|
||||
|
||||
## FightSet枚举中的奖励配置项
|
||||
|
||||
FightSet枚举定义了游戏中各种奖励相关的配置项,主要包括:
|
||||
|
||||
- **金币奖励配置**:
|
||||
- GREEN_GOLD=1:绿色金币的数值定义
|
||||
- BLUE_GOLD=2:蓝色金币的数值定义
|
||||
- PURPLE_GOLD=3:紫色金币的数值定义
|
||||
- ORANGE_GOLD=4:橙色金币的数值定义
|
||||
|
||||
- **经验奖励**:
|
||||
- ATK_ADD_GLOD=1:攻击增加金币的数量
|
||||
|
||||
- **钻石奖励**:
|
||||
- 通过广告获取的钻石奖励次数由MORE_RC常量控制
|
||||
|
||||
这些配置项在游戏运行时被用于计算玩家完成任务后获得的奖励数量。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L35)
|
||||
|
||||
## 常量在奖励机制中的作用
|
||||
|
||||
### TAL_NUM天赋数量
|
||||
|
||||
TAL_NUM=3定义了玩家可选择的天赋数量。这个常量直接影响玩家在游戏中的成长路径和策略选择,是奖励机制中的重要组成部分。
|
||||
|
||||
### MORE_RC广告奖励次数
|
||||
|
||||
MORE_RC=10定义了通过观看广告可以获得的额外奖励次数。这个常量控制着玩家通过广告获取奖励的频率和数量,是游戏内经济系统的重要调节参数。
|
||||
|
||||
### 其他相关常量
|
||||
|
||||
- ATK_ADD_COUNT=4:伙伴攻击力增加的数量
|
||||
- CRIT_DAMAGE=50:暴击伤害的百分比
|
||||
- ONE_WAVE_TIME=30:单波次的时间长度
|
||||
|
||||
这些常量共同构成了游戏奖励机制的基础框架。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L59)
|
||||
|
||||
## 奖励平衡性调整方法
|
||||
|
||||
通过修改FightSet常量可以调整游戏的奖励平衡性:
|
||||
|
||||
### 调整金币奖励
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[开始] --> B[修改FightSet中的金币常量]
|
||||
B --> C[GREEN_GOLD=1 -> 2]
|
||||
B --> D[BLUE_GOLD=2 -> 3]
|
||||
B --> E[PURPLE_GOLD=3 -> 4]
|
||||
B --> F[ORANGE_GOLD=4 -> 5]
|
||||
C --> G[增加金币获取速度]
|
||||
D --> G
|
||||
E --> G
|
||||
F --> G
|
||||
G --> H[测试游戏平衡性]
|
||||
H --> I[根据反馈进一步调整]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L35)
|
||||
|
||||
### 调整经验获取
|
||||
|
||||
通过调整ATK_ADD_GLOD等常量可以改变玩家获取经验的速度,从而影响游戏进度和难度曲线。
|
||||
|
||||
### 调整广告奖励
|
||||
|
||||
修改MORE_RC常量可以控制玩家通过广告获取奖励的次数,影响游戏内购和广告收入的平衡。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L59)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L70)
|
||||
|
||||
## 新增奖励类型的配置方法
|
||||
|
||||
### 添加新的奖励类型
|
||||
|
||||
要在游戏中新增奖励类型,需要执行以下步骤:
|
||||
|
||||
1. 在FightSet枚举中添加新的奖励常量
|
||||
2. 在游戏逻辑中添加对新奖励类型的处理
|
||||
3. 在UI界面中添加新奖励类型的显示
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class FightSet {
|
||||
+GREEN_GOLD : number
|
||||
+BLUE_GOLD : number
|
||||
+PURPLE_GOLD : number
|
||||
+ORANGE_GOLD : number
|
||||
+NEW_REWARD_TYPE : number
|
||||
}
|
||||
class MissionComp {
|
||||
+rewards : any[]
|
||||
+game_data : any
|
||||
+do_drop(drop_item[], game_data) : void
|
||||
}
|
||||
class VictoryComp {
|
||||
+rewards : any[]
|
||||
+game_data : any
|
||||
+onAdded(args) : void
|
||||
}
|
||||
FightSet --> MissionComp : "使用"
|
||||
FightSet --> VictoryComp : "使用"
|
||||
MissionComp --> VictoryComp : "传递数据"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L59)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L150)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L74)
|
||||
|
||||
### 特殊道具奖励配置
|
||||
|
||||
要添加特殊道具作为奖励,可以在FightSet枚举中添加新的常量,例如:
|
||||
|
||||
- SPECIAL_ITEM_1=5:特殊道具1的标识
|
||||
- SPECIAL_ITEM_2=6:特殊道具2的标识
|
||||
|
||||
然后在奖励发放逻辑中处理这些新的奖励类型。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L59)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L47-L50)
|
||||
|
||||
## 配置数据与运行时逻辑的映射关系
|
||||
|
||||
### 数据流分析
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MissionComp as MissionComp
|
||||
participant SingletonModuleComp as SingletonModuleComp
|
||||
participant VictoryComp as VictoryComp
|
||||
participant UI as UI界面
|
||||
MissionComp->>SingletonModuleComp : 更新smc.vmdata.mission_data
|
||||
SingletonModuleComp->>VictoryComp : 传递game_data和rewards
|
||||
VictoryComp->>UI : 显示奖励信息
|
||||
UI->>SingletonModuleComp : 确认奖励领取
|
||||
SingletonModuleComp->>MissionComp : 更新全局数据
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L150)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L0-L41)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L74)
|
||||
|
||||
### 配置数据的使用
|
||||
|
||||
FightSet枚举中的常量在多个组件中被引用:
|
||||
|
||||
- MissionComp使用这些常量来计算奖励
|
||||
- VictoryComp使用这些常量来显示奖励信息
|
||||
- SingletonModuleComp使用这些常量来存储全局游戏数据
|
||||
|
||||
这种设计实现了配置数据与运行时逻辑的分离,便于维护和调整。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L59)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L150)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L74)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L0-L41)
|
||||
|
||||
## 配置变更的正确加载机制
|
||||
|
||||
### 配置加载流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[游戏启动] --> B[加载Mission.ts配置]
|
||||
B --> C[初始化FightSet常量]
|
||||
C --> D[创建SingletonModuleComp实例]
|
||||
D --> E[初始化smc.vmdata.mission_data]
|
||||
E --> F[MissionComp引用FightSet常量]
|
||||
F --> G[游戏运行时使用配置]
|
||||
G --> H[配置变更]
|
||||
H --> I[重新加载配置]
|
||||
I --> J[更新所有相关组件]
|
||||
J --> K[应用新配置]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L59)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L0-L41)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L150)
|
||||
|
||||
### 确保配置正确加载
|
||||
|
||||
为确保配置变更在游戏中正确加载,需要遵循以下原则:
|
||||
|
||||
1. 所有组件都应从SingletonModuleComp获取全局数据
|
||||
2. 配置变更后需要通知所有相关组件更新
|
||||
3. 使用事件机制(如oops.message)来同步配置变更
|
||||
|
||||
通过这些机制,可以确保配置变更能够正确地应用到游戏的所有部分。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L59)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L0-L41)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L150)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L74)
|
||||
638
.qoder/repowiki/zh/content/奖励系统/奖励系统.md
Normal file
638
.qoder/repowiki/zh/content/奖励系统/奖励系统.md
Normal file
@@ -0,0 +1,638 @@
|
||||
# 奖励系统
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts)
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
|
||||
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [系统架构概览](#系统架构概览)
|
||||
3. [核心组件分析](#核心组件分析)
|
||||
4. [奖励类型与配置](#奖励类型与配置)
|
||||
5. [三选一奖励机制](#三选一奖励机制)
|
||||
6. [战斗胜利与奖励选择](#战斗胜利与奖励选择)
|
||||
7. [奖励触发条件](#奖励触发条件)
|
||||
8. [数据绑定与UI展示](#数据绑定与UI展示)
|
||||
9. [扩展新奖励类型](#扩展新奖励类型)
|
||||
10. [性能优化考虑](#性能优化考虑)
|
||||
11. [故障排除指南](#故障排除指南)
|
||||
12. [总结](#总结)
|
||||
|
||||
## 简介
|
||||
|
||||
奖励系统是本游戏的核心机制之一,采用三选一奖励选择模式,在每波怪物清理后为玩家提供三种不同类型的奖励选项。系统基于肉鸽(Roguelike)游戏设计理念,通过策略性的奖励选择来影响英雄的成长路径,为玩家提供多样化的游戏体验和重玩价值。
|
||||
|
||||
奖励系统的主要特点包括:
|
||||
- **三选一选择机制**:每轮战斗结束后提供三个奖励选项
|
||||
- **多样化奖励类型**:属性提升、技能升级、装备获取、新技能解锁等
|
||||
- **策略性决策**:玩家需要根据当前阵容和游戏进度做出最优选择
|
||||
- **动态权重系统**:奖励权重根据游戏进度和玩家状态动态调整
|
||||
- **可视化反馈**:清晰的奖励预览和效果展示
|
||||
|
||||
## 系统架构概览
|
||||
|
||||
奖励系统采用模块化架构设计,各组件职责明确,通过事件驱动的方式协同工作。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "战斗系统"
|
||||
MC[MissionComp<br/>任务控制器]
|
||||
MMC[MissionMonComp<br/>怪物控制器]
|
||||
MHMC[MissionHeroComp<br/>英雄控制器]
|
||||
end
|
||||
subgraph "奖励系统"
|
||||
VC[VictoryComp<br/>胜利界面]
|
||||
SM[SingletonModule<br/>单例模块]
|
||||
end
|
||||
subgraph "配置系统"
|
||||
MS[Mission.ts<br/>战斗配置]
|
||||
TS[Tasks.ts<br/>任务配置]
|
||||
RS[RogueConfig.ts<br/>肉鸽配置]
|
||||
end
|
||||
subgraph "数据层"
|
||||
GD[GameData<br/>游戏数据]
|
||||
MD[MissionData<br/>关卡数据]
|
||||
end
|
||||
MC --> VC
|
||||
MC --> SM
|
||||
MMC --> MC
|
||||
MHMC --> MC
|
||||
VC --> SM
|
||||
SM --> GD
|
||||
SM --> MD
|
||||
MS --> MC
|
||||
RS --> MMC
|
||||
TS --> MC
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L151)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L1-L75)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L41)
|
||||
|
||||
## 核心组件分析
|
||||
|
||||
### MissionComp - 任务控制器
|
||||
|
||||
MissionComp是奖励系统的核心控制器,负责整个战斗流程的管理和奖励发放。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MissionComp {
|
||||
+rewards : any[]
|
||||
+game_data : any
|
||||
+onLoad() void
|
||||
+update(dt : number) void
|
||||
+do_reward() void
|
||||
+do_drop(drop_item : any[], game_data : any) void
|
||||
+do_mon_dead(event : any, data : any) void
|
||||
+do_hero_dead(event : any, data : any) void
|
||||
+mission_start() Promise~void~
|
||||
+to_fight() void
|
||||
+fight_end() void
|
||||
+mission_end() void
|
||||
+data_init() void
|
||||
+cleanComponents() void
|
||||
}
|
||||
class SingletonModuleComp {
|
||||
+mission : any
|
||||
+vmdata : any
|
||||
+data : any
|
||||
}
|
||||
class GameEvent {
|
||||
+MissionStart
|
||||
+MonDead
|
||||
+HeroDead
|
||||
+FightEnd
|
||||
+MissionEnd
|
||||
}
|
||||
MissionComp --> SingletonModuleComp : "使用"
|
||||
MissionComp --> GameEvent : "监听"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L15-L151)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L20-L41)
|
||||
|
||||
**节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L151)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L41)
|
||||
|
||||
### VictoryComp - 胜利界面控制器
|
||||
|
||||
VictoryComp负责战斗胜利后的奖励选择界面,处理玩家的选择和奖励发放。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as 玩家
|
||||
participant VC as VictoryComp
|
||||
participant SM as SingletonModule
|
||||
participant UI as 用户界面
|
||||
Player->>VC : 战斗胜利
|
||||
VC->>SM : 获取奖励数据
|
||||
SM-->>VC : 返回奖励列表
|
||||
VC->>UI : 显示奖励选项
|
||||
Player->>UI : 选择奖励
|
||||
UI->>VC : 发送选择事件
|
||||
VC->>SM : 处理奖励发放
|
||||
SM-->>VC : 确认奖励生效
|
||||
VC->>Player : 显示奖励效果
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L25-L75)
|
||||
|
||||
**节来源**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L1-L75)
|
||||
|
||||
### MissionHeroComp & MissionMonComp - 奖励触发器
|
||||
|
||||
这两个组件分别负责英雄和怪物的奖励触发条件监控。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[战斗开始] --> B{检查英雄状态}
|
||||
B --> |英雄存活| C[继续战斗]
|
||||
B --> |英雄死亡| D[战斗失败]
|
||||
C --> E{检查怪物状态}
|
||||
E --> |怪物存活| F[继续战斗]
|
||||
E --> |怪物死亡| G[战斗胜利]
|
||||
F --> H[更新战斗数据]
|
||||
H --> B
|
||||
G --> I[触发奖励生成]
|
||||
I --> J[打开胜利界面]
|
||||
J --> K[等待玩家选择]
|
||||
D --> L[打开失败界面]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L1-L81)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||||
|
||||
**节来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L1-L81)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||||
|
||||
## 奖励类型与配置
|
||||
|
||||
### 基础奖励配置
|
||||
|
||||
奖励系统基于Mission.ts中的FightSet枚举定义了各种奖励类型的基础配置:
|
||||
|
||||
| 奖励类型 | 配置值 | 描述 |
|
||||
|---------|--------|------|
|
||||
| ATK_ADD_COUNT | 4 | 伙伴攻击力增加数量 |
|
||||
| ATK_ADD_GLOD | 1 | 金币增加数量 |
|
||||
| CRIT_DAMAGE | 50 | 暴击伤害百分比 |
|
||||
| DOUBLE_ATK_RATE | 100 | 额外攻击默认概率 |
|
||||
| GREEN_GOLD | 1 | 绿色金币数量 |
|
||||
| BLUE_GOLD | 2 | 蓝色金币数量 |
|
||||
| PURPLE_GOLD | 3 | 紫色金币数量 |
|
||||
| ORANGE_GOLD | 4 | 橙色金币数量 |
|
||||
|
||||
**节来源**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L1-L60)
|
||||
|
||||
### 英雄属性系统
|
||||
|
||||
英雄属性系统通过HeroAttrs.ts定义了完整的属性体系:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "基础属性"
|
||||
HP[生命值 HP_MAX]
|
||||
MP[魔法值 MP_MAX]
|
||||
AP[攻击力 AP]
|
||||
MAP[魔法攻击力 MAP]
|
||||
end
|
||||
subgraph "防御属性"
|
||||
DEF[物理防御 DEF]
|
||||
MDEF[魔法防御 MDEF]
|
||||
SHIELD[护盾值 SHIELD_MAX]
|
||||
end
|
||||
subgraph "特殊属性"
|
||||
SPEED[移动速度 SPEED]
|
||||
DIS[攻击距离 DIS]
|
||||
CRIT[暴击率 CRITICAL]
|
||||
DODGE[闪避率 DODGE]
|
||||
end
|
||||
HP --> DEF
|
||||
MP --> MDEF
|
||||
AP --> CRIT
|
||||
MAP --> CRIT
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L25-L47)
|
||||
|
||||
**节来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L544)
|
||||
|
||||
### 天赋系统配置
|
||||
|
||||
天赋系统通过TalSet.ts定义了丰富的天赋效果:
|
||||
|
||||
| 天赋类型 | 示例 | 效果描述 |
|
||||
|---------|------|----------|
|
||||
| 等级类天赋 | 剑意提升 | 每升5级,攻击力增加10% |
|
||||
| 攻击触发类 | 胡服骑射 | 每3次攻击,攻击速度增加5% |
|
||||
| 受伤触发类 | 坚韧意志 | 每受伤3次,防御力增加2点 |
|
||||
| 特定等级触发 | 兵圣之道 | 20级获得额外技能 |
|
||||
|
||||
**节来源**
|
||||
- [TalSet.ts](file://assets/script/game/common/config/TalSet.ts#L68-L114)
|
||||
|
||||
## 三选一奖励机制
|
||||
|
||||
### 奖励生成算法
|
||||
|
||||
奖励系统采用基于权重的概率算法生成奖励选项:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[战斗胜利] --> B[计算基础权重]
|
||||
B --> C[应用难度系数]
|
||||
C --> D[生成奖励池]
|
||||
D --> E{随机选择奖励}
|
||||
E --> |奖励1| F[验证奖励有效性]
|
||||
E --> |奖励2| F
|
||||
E --> |奖励3| F
|
||||
F --> G{奖励有效?}
|
||||
G --> |是| H[添加到选项列表]
|
||||
G --> |否| I[重新生成]
|
||||
H --> J[返回三个奖励选项]
|
||||
I --> E
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L40-L50)
|
||||
|
||||
### 奖励权重调整
|
||||
|
||||
奖励权重系统根据以下因素动态调整:
|
||||
|
||||
1. **游戏进度**:随着关卡推进,奖励权重逐渐向高级奖励倾斜
|
||||
2. **英雄状态**:根据当前英雄阵容和等级调整奖励偏好
|
||||
3. **玩家行为**:记录玩家的选择历史,优化奖励推荐
|
||||
4. **随机事件**:特殊事件可能临时改变奖励权重
|
||||
|
||||
**节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L40-L50)
|
||||
|
||||
## 战斗胜利与奖励选择
|
||||
|
||||
### 战斗胜利流程
|
||||
|
||||
战斗胜利后,系统按照以下流程处理奖励选择:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Game as 游戏引擎
|
||||
participant MC as MissionComp
|
||||
participant VC as VictoryComp
|
||||
participant SM as SingletonModule
|
||||
participant UI as 用户界面
|
||||
Game->>MC : 战斗结束事件
|
||||
MC->>MC : 检查战斗结果
|
||||
alt 战斗胜利
|
||||
MC->>SM : 获取奖励数据
|
||||
SM-->>MC : 返回奖励列表
|
||||
MC->>VC : 打开胜利界面
|
||||
VC->>UI : 显示奖励选项
|
||||
UI->>VC : 玩家选择奖励
|
||||
VC->>SM : 处理奖励发放
|
||||
SM-->>VC : 确认奖励生效
|
||||
VC->>Game : 关闭胜利界面
|
||||
else 战斗失败
|
||||
MC->>Game : 显示失败界面
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L80-L95)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L25-L40)
|
||||
|
||||
**节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L80-L95)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L25-L40)
|
||||
|
||||
### 奖励选择界面
|
||||
|
||||
胜利界面提供直观的奖励选择功能:
|
||||
|
||||
1. **奖励预览**:每个奖励选项都有详细的属性说明
|
||||
2. **视觉反馈**:通过图标和颜色区分不同类型的奖励
|
||||
3. **选择确认**:提供明确的选择按钮和取消选项
|
||||
4. **即时反馈**:选择后立即显示奖励效果
|
||||
|
||||
**节来源**
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L1-L75)
|
||||
|
||||
## 奖励触发条件
|
||||
|
||||
### 英雄奖励触发
|
||||
|
||||
英雄奖励通过MissionHeroComp监控英雄状态变化:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 战斗准备
|
||||
战斗准备 --> 英雄召唤 : Zhaohuan事件
|
||||
英雄召唤 --> 战斗中 : FightReady事件
|
||||
战斗中 --> 英雄存活 : 英雄未死亡
|
||||
战斗中 --> 英雄死亡 : HeroDead事件
|
||||
英雄存活 --> 战斗中 : 继续战斗
|
||||
英雄死亡 --> 战斗失败 : 英雄全灭
|
||||
战斗失败 --> [*]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L15-L30)
|
||||
|
||||
**节来源**
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts#L1-L81)
|
||||
|
||||
### 怪物奖励触发
|
||||
|
||||
怪物奖励通过MissionMonComp监控怪物击杀情况:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[怪物生成] --> B[怪物存活]
|
||||
B --> C{怪物死亡?}
|
||||
C --> |否| D[继续战斗]
|
||||
C --> |是| E[更新怪物计数]
|
||||
E --> F{还有怪物?}
|
||||
F --> |是| B
|
||||
F --> |否| G[战斗胜利]
|
||||
D --> C
|
||||
G --> H[触发奖励生成]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L40-L60)
|
||||
|
||||
**节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||||
|
||||
### 事件奖励触发
|
||||
|
||||
特殊事件通过RogueConfig.ts定义的事件系统触发:
|
||||
|
||||
| 事件类型 | 概率 | 效果 |
|
||||
|---------|------|------|
|
||||
| TREASURE | 40% | 增加50金币奖励 |
|
||||
| TRAP | 20% | 对玩家造成伤害 |
|
||||
| BUFF | 25% | 增加临时增益效果 |
|
||||
| DEBUFF | 15% | 增加临时减益效果 |
|
||||
|
||||
**节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L279-L310)
|
||||
|
||||
## 数据绑定与UI展示
|
||||
|
||||
### 单例模块数据管理
|
||||
|
||||
SingletonModuleComp作为全局数据管理中心,维护奖励系统所需的所有数据:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class SingletonModuleComp {
|
||||
+mission : MissionData
|
||||
+vmdata : ViewData
|
||||
+data : GameData
|
||||
+guides : number[]
|
||||
+current_guide : number
|
||||
+openid : string
|
||||
}
|
||||
class MissionData {
|
||||
+status : number
|
||||
+play : boolean
|
||||
+pause : boolean
|
||||
+in_select : boolean
|
||||
+in_fight : boolean
|
||||
}
|
||||
class ViewData {
|
||||
+mission_data : MissionData
|
||||
}
|
||||
class GameData {
|
||||
+gold : number
|
||||
+diamond : number
|
||||
+score : number
|
||||
+mission : number
|
||||
}
|
||||
SingletonModuleComp --> MissionData
|
||||
SingletonModuleComp --> ViewData
|
||||
SingletonModuleComp --> GameData
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L20-L41)
|
||||
|
||||
**节来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L41)
|
||||
|
||||
### UI配置与界面管理
|
||||
|
||||
GameUIConfig.ts定义了奖励系统相关的界面配置:
|
||||
|
||||
| UI标识 | 预制件路径 | 层级 |
|
||||
|--------|-----------|------|
|
||||
| Victory | gui/element/victory | UI层 |
|
||||
| Loading | loading/prefab/loading | UI层 |
|
||||
|
||||
**节来源**
|
||||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts#L1-L36)
|
||||
|
||||
## 扩展新奖励类型
|
||||
|
||||
### 添加新奖励类型
|
||||
|
||||
要扩展新的奖励类型,需要修改以下文件:
|
||||
|
||||
1. **Mission.ts** - 添加新的奖励配置常量
|
||||
2. **HeroAttrs.ts** - 定义新属性类型
|
||||
3. **TalSet.ts** - 添加新天赋效果
|
||||
4. **RogueConfig.ts** - 更新事件配置
|
||||
|
||||
### 奖励权重调整
|
||||
|
||||
通过修改FightSet枚举可以调整各类奖励的权重:
|
||||
|
||||
```typescript
|
||||
// 示例:增加高级奖励的权重
|
||||
export enum FightSet {
|
||||
// 高级奖励权重提升
|
||||
PURPLE_GOLD = 5, // 紫色金币权重从3提升到5
|
||||
ORANGE_GOLD = 8, // 橙色金币权重从4提升到8
|
||||
// 中级奖励保持不变
|
||||
BLUE_GOLD = 2,
|
||||
GREEN_GOLD = 1,
|
||||
}
|
||||
```
|
||||
|
||||
### 自定义奖励算法
|
||||
|
||||
可以通过重写MissionComp中的do_reward方法来实现自定义奖励算法:
|
||||
|
||||
```typescript
|
||||
// 示例:基于英雄阵容的奖励算法
|
||||
do_reward() {
|
||||
// 获取当前英雄阵容
|
||||
const heroes = this.getCurrentHeroes();
|
||||
|
||||
// 根据阵容特点调整奖励权重
|
||||
const weightMap = this.calculateRewardWeights(heroes);
|
||||
|
||||
// 生成奖励选项
|
||||
this.rewards = this.generateRewards(weightMap);
|
||||
}
|
||||
```
|
||||
|
||||
## 性能优化考虑
|
||||
|
||||
### 内存管理
|
||||
|
||||
奖励系统采用以下内存优化策略:
|
||||
|
||||
1. **组件生命周期管理**:及时销毁不需要的组件
|
||||
2. **数据缓存策略**:缓存常用的奖励配置数据
|
||||
3. **事件监听优化**:避免不必要的事件监听器
|
||||
|
||||
### 渲染优化
|
||||
|
||||
1. **延迟加载**:奖励界面按需加载资源
|
||||
2. **对象池**:复用奖励预览对象
|
||||
3. **批量更新**:合并UI更新操作
|
||||
|
||||
### 算法优化
|
||||
|
||||
1. **权重计算缓存**:缓存复杂的权重计算结果
|
||||
2. **随机数优化**:使用高效的随机数生成算法
|
||||
3. **数据结构优化**:使用合适的数据结构提高查找效率
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 奖励不显示问题
|
||||
|
||||
**症状**:战斗胜利后没有显示奖励选项
|
||||
|
||||
**原因分析**:
|
||||
1. 奖励数据为空
|
||||
2. UI界面未正确打开
|
||||
3. 事件监听器未正确注册
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 检查奖励数据
|
||||
if (!this.rewards || this.rewards.length === 0) {
|
||||
console.error("奖励数据为空");
|
||||
// 重新生成奖励
|
||||
this.rewards = this.generateDefaultRewards();
|
||||
}
|
||||
|
||||
// 确保UI正确打开
|
||||
oops.gui.open(UIID.Victory, {
|
||||
victory: true,
|
||||
rewards: this.rewards,
|
||||
game_data: this.game_data
|
||||
});
|
||||
```
|
||||
|
||||
#### 奖励权重异常
|
||||
|
||||
**症状**:奖励权重分布不合理
|
||||
|
||||
**原因分析**:
|
||||
1. 权重配置错误
|
||||
2. 动态权重计算逻辑问题
|
||||
3. 随机数种子问题
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 验证权重配置
|
||||
validateRewardWeights() {
|
||||
const weights = Object.values(FightSet).filter(v => typeof v === 'number');
|
||||
const sum = weights.reduce((a, b) => a + b, 0);
|
||||
|
||||
if (sum === 0) {
|
||||
console.error("奖励权重总和为0");
|
||||
// 使用默认权重
|
||||
return this.getDefaultWeights();
|
||||
}
|
||||
|
||||
return weights;
|
||||
}
|
||||
```
|
||||
|
||||
#### 性能问题
|
||||
|
||||
**症状**:奖励生成过程卡顿
|
||||
|
||||
**原因分析**:
|
||||
1. 奖励算法复杂度过高
|
||||
2. 数据库查询频繁
|
||||
3. UI渲染过于复杂
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 优化奖励生成算法
|
||||
async generateRewardsOptimized() {
|
||||
// 使用Web Worker异步处理
|
||||
const worker = new Worker('reward_worker.js');
|
||||
|
||||
worker.postMessage({
|
||||
monsters: this.monsters,
|
||||
heroes: this.heroes,
|
||||
difficulty: this.difficulty
|
||||
});
|
||||
|
||||
worker.onmessage = (e) => {
|
||||
this.rewards = e.data;
|
||||
this.displayRewards();
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
奖励系统是本游戏的核心机制,通过精心设计的三选一奖励选择模式,为玩家提供了丰富的策略选择空间。系统采用模块化架构,各组件职责明确,通过事件驱动的方式实现松耦合设计。
|
||||
|
||||
### 主要特性
|
||||
|
||||
1. **多样化奖励类型**:涵盖属性提升、技能升级、装备获取等多个方面
|
||||
2. **策略性决策**:玩家需要根据当前阵容和游戏进度做出最优选择
|
||||
3. **动态权重系统**:奖励权重根据游戏进度和玩家状态动态调整
|
||||
4. **可视化反馈**:清晰的奖励预览和效果展示
|
||||
5. **扩展性强**:易于添加新的奖励类型和调整奖励权重
|
||||
|
||||
### 设计优势
|
||||
|
||||
- **平衡性**:通过权重系统确保奖励的平衡性
|
||||
- **可玩性**:多样的奖励选项提供重玩价值
|
||||
- **可维护性**:模块化设计便于维护和扩展
|
||||
- **性能优化**:采用多种优化策略确保流畅运行
|
||||
|
||||
### 未来发展方向
|
||||
|
||||
1. **智能推荐系统**:基于玩家行为的奖励推荐
|
||||
2. **社交元素**:好友间的奖励分享和比较
|
||||
3. **成就系统**:与奖励系统结合的成就解锁
|
||||
4. **动态难度**:根据玩家表现调整奖励难度
|
||||
|
||||
奖励系统的设计体现了游戏设计理念的核心思想:通过简单的机制创造复杂的策略深度,为玩家提供持续的游戏动力和成就感。
|
||||
446
.qoder/repowiki/zh/content/奖励系统/奖励配置/任务奖励配置.md
Normal file
446
.qoder/repowiki/zh/content/奖励系统/奖励配置/任务奖励配置.md
Normal file
@@ -0,0 +1,446 @@
|
||||
# 任务奖励配置
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [Guide.ts](file://assets/script/game/common/config/Guide.ts)
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
本文档全面解析了《英雄传说》游戏中基于Tasks.ts文件的任务奖励配置系统。该系统负责管理游戏中的各种任务类型,包括新手指引任务和每日任务,并实现了完整的奖励发放机制。系统采用模块化设计,支持任务配置的动态加载、运行时查询和奖励数据的实时更新。
|
||||
|
||||
## 项目结构
|
||||
|
||||
任务奖励配置系统在项目中的组织结构如下:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "配置层"
|
||||
Tasks[Tasks.ts<br/>任务配置常量]
|
||||
GameEvent[GameEvent.ts<br/>游戏事件定义]
|
||||
Guide[Guide.ts<br/>引导系统]
|
||||
end
|
||||
subgraph "数据管理层"
|
||||
SingletonModule[SingletonModuleComp.ts<br/>单例模块管理]
|
||||
Initialize[Initialize.ts<br/>初始化系统]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
MissionComp[MissionComp.ts<br/>任务控制组件]
|
||||
VictoryComp[VictoryComp.ts<br/>胜利界面组件]
|
||||
MissionHeroComp[MissionHeroComp.ts<br/>英雄任务组件]
|
||||
end
|
||||
subgraph "UI展示层"
|
||||
MInfoComp[MInfoComp.ts<br/>任务信息组件]
|
||||
MapViewComp[MapViewComp.ts<br/>地图视图组件]
|
||||
end
|
||||
Tasks --> MissionComp
|
||||
GameEvent --> MissionComp
|
||||
SingletonModule --> MissionComp
|
||||
MissionComp --> VictoryComp
|
||||
MissionComp --> MInfoComp
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L13-L28)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L30)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L50)
|
||||
|
||||
**章节来源**
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L1-L28)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L151)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 任务配置常量
|
||||
|
||||
Tasks.ts文件定义了游戏中的任务配置常量数组,包含以下关键字段:
|
||||
|
||||
| 字段名 | 类型 | 描述 | 示例值 |
|
||||
|--------|------|------|--------|
|
||||
| id | number | 任务唯一标识符 | 0, 1 |
|
||||
| name | string | 任务名称 | "新手指引", "每日任务" |
|
||||
| description | string | 任务描述 | "新手指引描述", "每日任务描述" |
|
||||
| reward | number | 奖励数值 | 100 |
|
||||
| type | number | 任务类型(可选) | 0 |
|
||||
|
||||
### 用户数据管理
|
||||
|
||||
SingletonModuleComp.ts提供了完整的用户数据管理系统,包含以下核心数据结构:
|
||||
|
||||
| 数据字段 | 类型 | 默认值 | 描述 |
|
||||
|----------|------|--------|------|
|
||||
| score | number | 0 | 游戏分数 |
|
||||
| mission | number | 1 | 当前关卡 |
|
||||
| diamond | number | 100 | 钻石数量 |
|
||||
| meat | number | 0 | 肉类资源 |
|
||||
| exp | number | 0 | 经验值 |
|
||||
| task | number | 0 | 任务进度 |
|
||||
|
||||
**章节来源**
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L13-L28)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L37-L50)
|
||||
|
||||
## 架构概览
|
||||
|
||||
任务奖励配置系统采用分层架构设计,确保了良好的可维护性和扩展性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as 玩家
|
||||
participant MissionComp as 任务控制器
|
||||
participant SingletonModule as 数据管理器
|
||||
participant Tasks as 任务配置
|
||||
participant VictoryComp as 胜利界面
|
||||
Player->>MissionComp : 开始任务
|
||||
MissionComp->>Tasks : 查询任务配置
|
||||
Tasks-->>MissionComp : 返回任务信息
|
||||
MissionComp->>MissionComp : 执行任务逻辑
|
||||
MissionComp->>Player : 显示任务进度
|
||||
Player->>MissionComp : 完成任务
|
||||
MissionComp->>SingletonModule : 更新用户数据
|
||||
SingletonModule->>SingletonModule : 存储到云端/本地
|
||||
MissionComp->>VictoryComp : 显示奖励界面
|
||||
VictoryComp->>Player : 展示奖励结果
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L70-L90)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L81-L121)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L30-L50)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 任务配置组件
|
||||
|
||||
#### Tasks.ts - 任务配置核心
|
||||
|
||||
任务配置组件负责定义所有可用的任务类型及其奖励规则:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class TaskConfig {
|
||||
+number id
|
||||
+string name
|
||||
+string description
|
||||
+number reward
|
||||
+number type
|
||||
+validateTask() boolean
|
||||
+getRewardAmount() number
|
||||
}
|
||||
class Tasks {
|
||||
+TaskConfig[] tasks
|
||||
+findTaskById(id) TaskConfig
|
||||
+getDailyRewards() number[]
|
||||
+getTypeRewards(type) TaskConfig[]
|
||||
}
|
||||
Tasks --> TaskConfig : "包含多个"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L13-L28)
|
||||
|
||||
#### 任务类型与奖励规则
|
||||
|
||||
系统支持多种任务类型,每种类型具有不同的奖励计算规则:
|
||||
|
||||
| 任务类型 | ID | 奖励计算 | 特殊规则 |
|
||||
|----------|----|---------|---------|
|
||||
| 新手指引 | 0 | 固定奖励 | 一次性奖励,不可重复 |
|
||||
| 每日任务 | 1 | 固定奖励 | 每日刷新,可重复完成 |
|
||||
|
||||
**章节来源**
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L13-L28)
|
||||
|
||||
### 任务执行组件
|
||||
|
||||
#### MissionComp.ts - 任务控制中心
|
||||
|
||||
任务控制组件管理整个任务生命周期,包括任务开始、执行和完成:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([任务开始]) --> LoadConfig["加载任务配置"]
|
||||
LoadConfig --> InitData["初始化任务数据"]
|
||||
InitData --> MonitorEvents["监控游戏事件"]
|
||||
MonitorEvents --> EventCheck{"事件检查"}
|
||||
EventCheck --> |怪物死亡| UpdateProgress["更新任务进度"]
|
||||
EventCheck --> |英雄死亡| CheckGameOver{"检查游戏结束"}
|
||||
EventCheck --> |任务完成| RewardCalculation["计算奖励"]
|
||||
UpdateProgress --> MonitorEvents
|
||||
CheckGameOver --> |失败| EndMission["结束任务"]
|
||||
CheckGameOver --> |继续| MonitorEvents
|
||||
RewardCalculation --> AwardRewards["发放奖励"]
|
||||
AwardRewards --> ShowVictory["显示胜利界面"]
|
||||
ShowVictory --> EndMission
|
||||
EndMission --> ResetData["重置任务数据"]
|
||||
ResetData --> End([任务结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L70-L150)
|
||||
|
||||
#### 奖励发放机制
|
||||
|
||||
奖励发放通过以下流程实现:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MissionComp as 任务控制器
|
||||
participant SingletonModule as 数据管理器
|
||||
participant VictoryComp as 胜利界面
|
||||
participant Player as 玩家
|
||||
MissionComp->>MissionComp : 检查任务完成条件
|
||||
MissionComp->>MissionComp : 计算奖励数值
|
||||
MissionComp->>SingletonModule : 更新用户数据
|
||||
SingletonModule->>SingletonModule : 验证数据完整性
|
||||
SingletonModule->>SingletonModule : 同步到云端/本地
|
||||
SingletonModule-->>MissionComp : 确认更新成功
|
||||
MissionComp->>VictoryComp : 打开胜利界面
|
||||
VictoryComp->>Player : 显示奖励详情
|
||||
Player->>VictoryComp : 确认奖励领取
|
||||
VictoryComp->>MissionComp : 完成奖励流程
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L47-L50)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L30-L50)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L120-L140)
|
||||
|
||||
**章节来源**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L47-L50)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L30-L50)
|
||||
|
||||
### 用户数据管理组件
|
||||
|
||||
#### SingletonModuleComp.ts - 数据管理中心
|
||||
|
||||
数据管理中心负责维护玩家的全局状态和持久化存储:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class SingletonModuleComp {
|
||||
+Object data
|
||||
+Object vmdata
|
||||
+number fight_hero
|
||||
+Array heros
|
||||
+Array monsters
|
||||
+updateGold(amount) boolean
|
||||
+updateFihgtHero(heroId) boolean
|
||||
+addHero(hero_uuid) boolean
|
||||
+updateCloudData() boolean
|
||||
+getCloudData() void
|
||||
}
|
||||
class UserData {
|
||||
+number gold
|
||||
+number exp
|
||||
+number diamond
|
||||
+number meat
|
||||
+number task
|
||||
+number score
|
||||
+number mission
|
||||
}
|
||||
class MissionData {
|
||||
+number mon_num
|
||||
+number hero_num
|
||||
+number fight_time
|
||||
+boolean in_fight
|
||||
+number level
|
||||
+number coin
|
||||
}
|
||||
SingletonModuleComp --> UserData : "管理"
|
||||
SingletonModuleComp --> MissionData : "管理"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L37-L50)
|
||||
|
||||
**章节来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L37-L87)
|
||||
|
||||
### 初始化系统
|
||||
|
||||
#### Initialize.ts - 系统初始化
|
||||
|
||||
初始化系统负责在游戏启动时加载必要的配置和数据:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([游戏启动]) --> CheckPlatform{"检查平台"}
|
||||
CheckPlatform --> |微信客户端| LoadCloud["加载云端数据"]
|
||||
CheckPlatform --> |其他平台| LoadLocal["加载本地数据"]
|
||||
LoadCloud --> LoginCloud["云端登录"]
|
||||
LoginCloud --> ValidateData{"验证数据"}
|
||||
ValidateData --> |成功| OverrideLocal["覆盖本地数据"]
|
||||
ValidateData --> |失败| UseDefault["使用默认数据"]
|
||||
LoadLocal --> UseDefault
|
||||
OverrideLocal --> InitComplete["初始化完成"]
|
||||
UseDefault --> InitComplete
|
||||
InitComplete --> StartGame["启动游戏"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L80-L140)
|
||||
|
||||
**章节来源**
|
||||
- [Initialize.ts](file://assets/script/game/initialize/Initialize.ts#L80-L140)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
任务奖励配置系统的依赖关系如下:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "外部依赖"
|
||||
OopsFramework[Oops Framework]
|
||||
WeChatAPI[微信API]
|
||||
end
|
||||
subgraph "内部模块"
|
||||
Tasks[Tasks配置]
|
||||
GameEvent[游戏事件]
|
||||
SingletonModule[单例模块]
|
||||
MissionComp[任务组件]
|
||||
VictoryComp[胜利组件]
|
||||
end
|
||||
Tasks --> MissionComp
|
||||
GameEvent --> MissionComp
|
||||
SingletonModule --> MissionComp
|
||||
MissionComp --> VictoryComp
|
||||
SingletonModule --> WeChatAPI
|
||||
MissionComp --> OopsFramework
|
||||
VictoryComp --> OopsFramework
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L1-L10)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L15)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L15)
|
||||
|
||||
**章节来源**
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L1-L10)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L15)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 任务配置加载优化
|
||||
|
||||
1. **静态配置缓存**:任务配置作为常量数组,在游戏启动时一次性加载到内存
|
||||
2. **按需查询**:通过ID索引快速定位特定任务配置
|
||||
3. **类型检查**:运行时验证任务配置的完整性
|
||||
|
||||
### 数据更新性能
|
||||
|
||||
1. **批量更新**:将多个数据变更合并为单次更新操作
|
||||
2. **异步处理**:云端数据同步采用异步方式,避免阻塞主线程
|
||||
3. **增量更新**:只更新发生变化的数据项
|
||||
|
||||
### 内存管理
|
||||
|
||||
1. **对象池**:复用任务相关对象,减少垃圾回收压力
|
||||
2. **弱引用**:对临时对象使用弱引用,便于及时回收
|
||||
3. **定时清理**:定期清理过期的任务数据
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 任务奖励未发放
|
||||
|
||||
**问题症状**:任务完成后未获得预期奖励
|
||||
|
||||
**排查步骤**:
|
||||
1. 检查任务配置中的reward字段是否正确设置
|
||||
2. 验证用户数据更新逻辑是否正常执行
|
||||
3. 确认云端同步功能是否工作正常
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 检查任务配置
|
||||
if (!task.reward || task.reward <= 0) {
|
||||
console.error("任务奖励配置错误:", task);
|
||||
return false;
|
||||
}
|
||||
|
||||
// 验证数据更新
|
||||
if (!smc.updateGold(task.reward)) {
|
||||
console.error("奖励发放失败");
|
||||
return false;
|
||||
}
|
||||
```
|
||||
|
||||
#### 任务进度不更新
|
||||
|
||||
**问题症状**:任务进度显示异常或不更新
|
||||
|
||||
**排查步骤**:
|
||||
1. 检查GameEvent监听器是否正确注册
|
||||
2. 验证任务完成条件判断逻辑
|
||||
3. 确认UI组件的数据绑定是否正确
|
||||
|
||||
#### 云端数据同步失败
|
||||
|
||||
**问题症状**:本地数据与云端数据不一致
|
||||
|
||||
**排查步骤**:
|
||||
1. 检查网络连接状态
|
||||
2. 验证微信API初始化是否成功
|
||||
3. 查看错误日志获取详细信息
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 云端数据同步检查
|
||||
async function syncDataWithCloud() {
|
||||
try {
|
||||
const result = await smc.updateCloudData();
|
||||
if (!result) {
|
||||
throw new Error("云端数据同步失败");
|
||||
}
|
||||
console.log("数据同步成功");
|
||||
} catch (error) {
|
||||
console.error("数据同步异常:", error);
|
||||
// 回滚到本地数据
|
||||
smc.getCloudData();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L81-L121)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L47-L50)
|
||||
|
||||
## 结论
|
||||
|
||||
《英雄传说》任务奖励配置系统通过模块化的设计和清晰的职责分离,实现了高效、可靠的任务管理功能。系统支持多种任务类型,具备完善的奖励发放机制,并提供了灵活的扩展接口。
|
||||
|
||||
### 系统优势
|
||||
|
||||
1. **配置灵活**:通过Tasks.ts文件集中管理任务配置
|
||||
2. **数据安全**:支持云端和本地双重存储机制
|
||||
3. **性能优化**:采用缓存和异步处理提升响应速度
|
||||
4. **易于维护**:清晰的代码结构和完善的错误处理
|
||||
|
||||
### 扩展建议
|
||||
|
||||
1. **任务类型扩展**:增加更多任务类型如成就任务、挑战任务
|
||||
2. **奖励多样化**:支持多种奖励类型如道具、技能等
|
||||
3. **数据分析**:添加任务完成率统计和玩家行为分析
|
||||
4. **社交功能**:支持任务分享和好友竞争功能
|
||||
|
||||
该系统为游戏提供了坚实的任务管理基础,能够有效支撑游戏的核心玩法和用户粘性。
|
||||
670
.qoder/repowiki/zh/content/奖励系统/奖励配置/奖励提示类型定义.md
Normal file
670
.qoder/repowiki/zh/content/奖励系统/奖励配置/奖励提示类型定义.md
Normal file
@@ -0,0 +1,670 @@
|
||||
# 奖励提示类型定义
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts)
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts)
|
||||
- [Tooltip.ts](file://assets/script/game/skill/Tooltip.ts)
|
||||
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
|
||||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [TooltipTypes常量定义](#tooltiptypes常量定义)
|
||||
3. [类型映射关系](#类型映射关系)
|
||||
4. [UI奖励提示系统架构](#ui奖励提示系统架构)
|
||||
5. [具体类型应用场景](#具体类型应用场景)
|
||||
6. [代码实现分析](#代码实现分析)
|
||||
7. [新增提示类型的配置步骤](#新增提示类型的配置步骤)
|
||||
8. [常见集成问题及解决方案](#常见集成问题及解决方案)
|
||||
9. [性能优化建议](#性能优化建议)
|
||||
10. [总结](#总结)
|
||||
|
||||
## 简介
|
||||
|
||||
奖励提示系统是游戏中的重要视觉反馈机制,用于向玩家展示各种奖励效果和状态变化。本文档详细解析了Mission.ts中TooltipTypes常量的定义,说明了各种提示类型对应的数值标识及其在游戏中的实际应用场景,并解释了这些类型如何与UI奖励提示系统(如TooltipCom.ts)协同工作,实现不同奖励效果的视觉反馈。
|
||||
|
||||
## TooltipTypes常量定义
|
||||
|
||||
### 核心常量结构
|
||||
|
||||
TooltipTypes常量定义在Mission.ts文件中,采用简洁的对象字面量形式:
|
||||
|
||||
```typescript
|
||||
export const TooltipTypes = {
|
||||
life:1,
|
||||
health:2,
|
||||
skill:3,
|
||||
crit:4,
|
||||
uskill:5,
|
||||
lvup:6,
|
||||
apup:7,
|
||||
hpup:8,
|
||||
}
|
||||
```
|
||||
|
||||
### 类型定义说明
|
||||
|
||||
| 类型名称 | 数值标识 | 描述 |
|
||||
|---------|---------|------|
|
||||
| life | 1 | 减少生命值提示 |
|
||||
| health | 2 | 增加生命值提示 |
|
||||
| skill | 3 | 技能激活提示 |
|
||||
| crit | 4 | 暴击伤害提示 |
|
||||
| uskill | 5 | 特殊技能效果提示 |
|
||||
| lvup | 6 | 等级提升提示 |
|
||||
| apup | 7 | 攻击力提升提示 |
|
||||
| hpup | 8 | 生命值上限提升提示 |
|
||||
|
||||
**节来源**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L44-L52)
|
||||
|
||||
## 类型映射关系
|
||||
|
||||
### 枚举与数值映射
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[TooltipTypes常量] --> B[life: 1]
|
||||
A --> C[health: 2]
|
||||
A --> D[skill: 3]
|
||||
A --> E[crit: 4]
|
||||
A --> F[uskill: 5]
|
||||
A --> G[lvup: 6]
|
||||
A --> H[apup: 7]
|
||||
A --> I[hpup: 8]
|
||||
B --> J[减少生命值效果]
|
||||
C --> K[增加生命值效果]
|
||||
D --> L[技能激活效果]
|
||||
E --> M[特殊技能效果]
|
||||
F --> N[等级提升效果]
|
||||
G --> O[攻击力提升效果]
|
||||
H --> P[生命值上限提升效果]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L44-L52)
|
||||
|
||||
### 对应的UI元素结构
|
||||
|
||||
每种类型对应不同的UI子节点和显示内容:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[TooltipCom.start] --> B{stype判断}
|
||||
B --> |1 - life| C[loss_life节点]
|
||||
B --> |2 - health| D[add_life节点]
|
||||
B --> |3 - skill| E[skill节点]
|
||||
B --> |4 - crit| F[bloss节点]
|
||||
B --> |5 - uskill| G[uskill节点]
|
||||
B --> |6 - lvup| H[lvup节点]
|
||||
B --> |7 - apup| I[apup节点]
|
||||
B --> |8 - hpup| J[hpup节点]
|
||||
C --> K[显示伤害数值]
|
||||
D --> L[显示恢复数值]
|
||||
E --> M[显示技能名称]
|
||||
F --> N[显示暴击数值]
|
||||
G --> O[显示特殊效果]
|
||||
H --> P[显示升级效果]
|
||||
I --> Q[显示攻击力提升]
|
||||
J --> R[显示生命值提升]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L26-L101)
|
||||
|
||||
## UI奖励提示系统架构
|
||||
|
||||
### 系统组件关系
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Tooltip {
|
||||
+TooltipView : TooltipCom
|
||||
+load(pos, type, value, s_uuid, parent, cd)
|
||||
+destroy()
|
||||
}
|
||||
class TooltipCom {
|
||||
+stype : number
|
||||
+value : string
|
||||
+s_uuid : number
|
||||
+alive_time : number
|
||||
+start()
|
||||
+do_up()
|
||||
+to_destroy()
|
||||
+reset()
|
||||
}
|
||||
class BuffComp {
|
||||
+tooltip(type, value, s_uuid, y)
|
||||
+hp_tip(type, value, s_uuid, y)
|
||||
+show_shield(shield, shield_max)
|
||||
+hp_show(hp, hp_max)
|
||||
+ap_up()
|
||||
+lv_up()
|
||||
}
|
||||
class HeroViewComp {
|
||||
+do_atked(remainingDamage, CAttrs, s_uuid)
|
||||
+check_dodge()
|
||||
+check_crit(crit)
|
||||
+playSkillEffect(skill_id)
|
||||
+showDamage(damage, isCrit, anm)
|
||||
}
|
||||
Tooltip --> TooltipCom : "管理"
|
||||
BuffComp --> Tooltip : "使用"
|
||||
HeroViewComp --> BuffComp : "调用"
|
||||
HeroViewComp --> Tooltip : "直接调用"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Tooltip.ts](file://assets/script/game/skill/Tooltip.ts#L10-L30)
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L12-L25)
|
||||
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L10-L30)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L540-L580)
|
||||
|
||||
### 数据流向
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as 玩家操作
|
||||
participant Hero as HeroViewComp
|
||||
participant Buff as BuffComp
|
||||
participant Tooltip as Tooltip
|
||||
participant Com as TooltipCom
|
||||
Player->>Hero : 触发事件(攻击/技能/死亡等)
|
||||
Hero->>Hero : 计算结果
|
||||
Hero->>Buff : 调用tooltip()方法
|
||||
Buff->>Tooltip : 获取Tooltip实体
|
||||
Tooltip->>Tooltip : 加载预制件
|
||||
Tooltip->>Com : 创建TooltipCom实例
|
||||
Com->>Com : 根据stype设置UI
|
||||
Com->>Com : 启动动画和定时器
|
||||
Com->>Com : 自动销毁
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L540-L580)
|
||||
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L185-L210)
|
||||
- [Tooltip.ts](file://assets/script/game/skill/Tooltip.ts#L35-L49)
|
||||
|
||||
**节来源**
|
||||
- [Tooltip.ts](file://assets/script/game/skill/Tooltip.ts#L10-L49)
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L12-L101)
|
||||
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L10-L210)
|
||||
|
||||
## 具体类型应用场景
|
||||
|
||||
### life类型 - 减少生命值提示
|
||||
|
||||
**应用场景:**
|
||||
- 英雄受到伤害时显示
|
||||
- 怪物攻击玩家时显示
|
||||
- 各种负面效果造成的伤害
|
||||
|
||||
**实现特点:**
|
||||
- 使用`loss_life`节点显示
|
||||
- 数值显示在`hp`标签中
|
||||
- 动画效果:从当前位置向上移动
|
||||
- 持续时间:0.5秒后自动销毁
|
||||
|
||||
**节来源**
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L26-L33)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L774)
|
||||
|
||||
### health类型 - 增加生命值提示
|
||||
|
||||
**应用场景:**
|
||||
- 回复技能效果
|
||||
- 治疗道具使用
|
||||
- 生命值恢复效果
|
||||
|
||||
**实现特点:**
|
||||
- 使用`add_life`节点显示
|
||||
- 数值显示在`hp`标签中
|
||||
- 层级索引:110(高于其他提示)
|
||||
- 动画效果:从当前位置向上移动
|
||||
|
||||
**节来源**
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L35-L42)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L540-L550)
|
||||
|
||||
### skill类型 - 技能激活提示
|
||||
|
||||
**应用场景:**
|
||||
- 主要技能激活
|
||||
- 技能冷却完成
|
||||
- 特殊技能触发
|
||||
|
||||
**实现特点:**
|
||||
- 使用`skill`节点显示
|
||||
- 显示技能名称(从SkillSet获取)
|
||||
- 位置偏移:y坐标+30
|
||||
- 持续时间:0.5秒
|
||||
|
||||
**节来源**
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L52-L60)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L730)
|
||||
|
||||
### crit类型 - 暴击伤害提示
|
||||
|
||||
**应用场景:**
|
||||
- 暴击攻击造成伤害
|
||||
- 暴击回复效果
|
||||
- 暴击触发的特殊效果
|
||||
|
||||
**实现特点:**
|
||||
- 使用`bloss`节点显示
|
||||
- 数值显示在`hp`标签中
|
||||
- 层级索引:200(最高层级)
|
||||
- 动画效果:从当前位置向上移动
|
||||
|
||||
**节来源**
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L43-L50)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L771)
|
||||
|
||||
### uskill类型 - 特殊技能效果提示
|
||||
|
||||
**应用场景:**
|
||||
- 闪避成功
|
||||
- 护盾吸收伤害
|
||||
- 其他特殊技能效果
|
||||
|
||||
**实现特点:**
|
||||
- 使用`uskill`节点显示
|
||||
- 直接显示预设文本(如"*吸收*"、"*闪避*")
|
||||
- 位置偏移:y坐标+30
|
||||
- 持续时间:0.5秒
|
||||
|
||||
**节来源**
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L60-L68)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L667)
|
||||
|
||||
### lvup类型 - 等级提升提示
|
||||
|
||||
**应用场景:**
|
||||
- 英雄等级提升
|
||||
- 经验值达到新等级
|
||||
- 系统通知等级变化
|
||||
|
||||
**实现特点:**
|
||||
- 使用`lvup`节点显示
|
||||
- 位置偏移:y坐标-30
|
||||
- 持续时间:0.5秒
|
||||
- (注:当前实现中未显示具体数值)
|
||||
|
||||
**节来源**
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L68-L76)
|
||||
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L110-L115)
|
||||
|
||||
### apup类型 - 攻击力提升提示
|
||||
|
||||
**应用场景:**
|
||||
- 攻击力属性提升
|
||||
- 攻击力增益效果
|
||||
- 装备强化效果
|
||||
|
||||
**实现特点:**
|
||||
- 使用`apup`节点显示
|
||||
- 数值显示在`num`标签中,带"+"前缀
|
||||
- 位置偏移:y坐标-60
|
||||
- 持续时间:0.5秒
|
||||
|
||||
**节来源**
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L76-L84)
|
||||
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L115-L120)
|
||||
|
||||
### hpup类型 - 生命值上限提升提示
|
||||
|
||||
**应用场景:**
|
||||
- 生命值上限增加
|
||||
- 生命值成长效果
|
||||
- 生命值相关增益
|
||||
|
||||
**实现特点:**
|
||||
- 使用`hpup`节点显示
|
||||
- 数值显示在`num`标签中,带"+"前缀
|
||||
- 位置偏移:y坐标-60
|
||||
- 持续时间:0.5秒
|
||||
|
||||
**节来源**
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L84-L92)
|
||||
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L120-L125)
|
||||
|
||||
## 代码实现分析
|
||||
|
||||
### TooltipCom核心逻辑
|
||||
|
||||
TooltipCom组件负责具体的UI显示逻辑,其核心switch语句处理不同类型:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[TooltipCom.start] --> B[接收stype参数]
|
||||
B --> C{switch(stype)}
|
||||
C --> |1| D[life类型处理]
|
||||
C --> |2| E[health类型处理]
|
||||
C --> |3| F[skill类型处理]
|
||||
C --> |4| G[crit类型处理]
|
||||
C --> |5| H[uskill类型处理]
|
||||
C --> |6| I[lvup类型处理]
|
||||
C --> |7| J[apup类型处理]
|
||||
C --> |8| K[hpup类型处理]
|
||||
D --> L[设置位置和层级]
|
||||
D --> M[显示loss_life节点]
|
||||
D --> N[设置数值文本]
|
||||
D --> O[启动定时器销毁]
|
||||
E --> P[设置层级110]
|
||||
E --> Q[显示add_life节点]
|
||||
E --> R[设置数值文本]
|
||||
E --> S[启动定时器销毁]
|
||||
F --> T[显示skill节点]
|
||||
F --> U[设置技能名称]
|
||||
F --> V[调整位置]
|
||||
F --> W[启动定时器销毁]
|
||||
G --> X[设置层级200]
|
||||
G --> Y[显示bloss节点]
|
||||
G --> Z[设置数值文本]
|
||||
G --> AA[启动定时器销毁]
|
||||
H --> BB[显示uskill节点]
|
||||
H --> CC[设置预设文本]
|
||||
H --> DD[调整位置]
|
||||
H --> EE[启动定时器销毁]
|
||||
I --> FF[显示lvup节点]
|
||||
I --> GG[调整位置]
|
||||
I --> HH[启动定时器销毁]
|
||||
J --> II[显示apup节点]
|
||||
J --> JJ[设置带+的数值]
|
||||
J --> KK[调整位置]
|
||||
J --> LL[启动定时器销毁]
|
||||
K --> MM[显示hpup节点]
|
||||
K --> NN[设置带+的数值]
|
||||
K --> OO[调整位置]
|
||||
K --> PP[启动定时器销毁]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [TooltipCom.ts](file://assets/script/game/skill/TooltipCom.ts#L26-L101)
|
||||
|
||||
### Tooltip加载流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 调用方
|
||||
participant Tooltip as Tooltip实体
|
||||
participant ResMgr as 资源管理器
|
||||
participant Prefab as 提示预制件
|
||||
participant Com as TooltipCom组件
|
||||
Client->>Tooltip : load(pos, type, value, s_uuid, parent)
|
||||
Tooltip->>ResMgr : 获取"game/skill/buff/tooltip"预制件
|
||||
ResMgr-->>Tooltip : 返回Prefab实例
|
||||
Tooltip->>Prefab : instantiate(prefab)
|
||||
Prefab-->>Tooltip : 返回Node实例
|
||||
Tooltip->>Tooltip : 设置父节点和位置
|
||||
Tooltip->>Tooltip : 检查父节点缩放
|
||||
Tooltip->>Com : 获取TooltipCom组件
|
||||
Tooltip->>Com : 设置stype、value、s_uuid、alive_time
|
||||
Tooltip->>Tooltip : 添加到实体
|
||||
Tooltip-->>Client : 完成加载
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Tooltip.ts](file://assets/script/game/skill/Tooltip.ts#L35-L49)
|
||||
|
||||
### BuffComp工具方法
|
||||
|
||||
BuffComp提供了两个主要的工具方法来简化Tooltip的使用:
|
||||
|
||||
#### tooltip()方法
|
||||
- 通用提示方法
|
||||
- 参数:type(类型)、value(数值)、s_uuid(技能UUID)、y(垂直偏移)
|
||||
- 位置计算:基于节点的相对位置
|
||||
|
||||
#### hp_tip()方法
|
||||
- 生命值相关提示专用方法
|
||||
- 参数:type(类型)、value(数值)、s_uuid(技能UUID)、y(垂直偏移)
|
||||
- 位置计算:基于节点高度的绝对位置
|
||||
|
||||
**节来源**
|
||||
- [BuffComp.ts](file://assets/script/game/hero/BuffComp.ts#L185-L210)
|
||||
|
||||
## 新增提示类型的配置步骤
|
||||
|
||||
### 步骤1:修改TooltipTypes常量
|
||||
|
||||
在Mission.ts中添加新的类型定义:
|
||||
|
||||
```typescript
|
||||
export const TooltipTypes = {
|
||||
// ... 现有类型
|
||||
newType: 9, // 新增类型,使用下一个可用数值
|
||||
}
|
||||
```
|
||||
|
||||
### 步骤2:更新TooltipCom处理逻辑
|
||||
|
||||
在TooltipCom.ts的switch语句中添加新的case分支:
|
||||
|
||||
```typescript
|
||||
case TooltipTypes.newType:
|
||||
this.node.getChildByName("newType").getChildByName("value").getComponent(Label).string = this.value;
|
||||
this.node.getChildByName("newType").active = true;
|
||||
this.node.setPosition(v3(this.node.position.x, this.node.position.y + offset));
|
||||
this.scheduleOnce(() => {
|
||||
this.ent.destroy()
|
||||
}, this.alive_time);
|
||||
break
|
||||
```
|
||||
|
||||
### 步骤3:创建对应的UI节点
|
||||
|
||||
在提示预制件中添加新的UI节点:
|
||||
- 在Canvas下创建名为`newType`的子节点
|
||||
- 添加必要的子节点(如数值显示标签)
|
||||
- 设置适当的层级和初始状态
|
||||
|
||||
### 步骤4:测试和验证
|
||||
|
||||
1. **功能测试**:确保新类型能够正确显示
|
||||
2. **层级测试**:验证显示层级是否符合预期
|
||||
3. **动画测试**:确认动画效果正常
|
||||
4. **性能测试**:检查是否存在性能问题
|
||||
|
||||
### 注意事项
|
||||
|
||||
1. **数值唯一性**:确保每个类型的数值都是唯一的
|
||||
2. **层级管理**:合理设置显示层级,避免遮挡
|
||||
3. **资源管理**:及时销毁不需要的提示对象
|
||||
4. **兼容性**:确保新类型与现有系统兼容
|
||||
5. **国际化**:如果支持多语言,考虑文本本地化
|
||||
|
||||
## 常见集成问题及解决方案
|
||||
|
||||
### 问题1:提示显示位置不正确
|
||||
|
||||
**症状**:提示出现在错误的位置
|
||||
|
||||
**原因**:
|
||||
- 父节点变换影响
|
||||
- 缩放比例问题
|
||||
- 坐标系转换错误
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 在Tooltip.ts中已处理
|
||||
if(parent.scale.x < 0){
|
||||
node.setScale(-node.scale.x, node.scale.y, 0);
|
||||
}
|
||||
```
|
||||
|
||||
### 问题2:提示层级混乱
|
||||
|
||||
**症状**:某些提示被其他UI元素遮挡
|
||||
|
||||
**原因**:
|
||||
- 层级索引设置不当
|
||||
- 动态层级管理缺失
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 在TooltipCom.ts中已处理
|
||||
case TooltipTypes.health:
|
||||
this.node.setSiblingIndex(110); // 明确设置层级
|
||||
break
|
||||
```
|
||||
|
||||
### 问题3:提示消失过快或过慢
|
||||
|
||||
**症状**:提示持续时间不符合预期
|
||||
|
||||
**原因**:
|
||||
- alive_time设置不当
|
||||
- 销毁时机错误
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 在Tooltip.ts中统一设置
|
||||
sv.alive_time = 0.5; // 统一的持续时间
|
||||
```
|
||||
|
||||
### 问题4:内存泄漏
|
||||
|
||||
**症状**:长时间运行后出现内存占用过高
|
||||
|
||||
**原因**:
|
||||
- 提示对象未正确销毁
|
||||
- 事件监听器未清理
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 在TooltipCom.ts中确保正确销毁
|
||||
scheduleOnce(() => {
|
||||
this.ent.destroy()
|
||||
}, this.alive_time);
|
||||
```
|
||||
|
||||
### 问题5:动画效果异常
|
||||
|
||||
**症状**:提示动画不流畅或不正确
|
||||
|
||||
**原因**:
|
||||
- Tween动画配置错误
|
||||
- 更新频率不匹配
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 在TooltipCom.ts中使用正确的动画配置
|
||||
tween(this.node).to(
|
||||
this.alive_time,
|
||||
{ position: v3(this.node.position.x, this.node.position.y + 60) },
|
||||
{
|
||||
onComplete: () => { this.ent.destroy() },
|
||||
easing: "linear"
|
||||
}
|
||||
).start()
|
||||
```
|
||||
|
||||
## 性能优化建议
|
||||
|
||||
### 1. 对象池化
|
||||
|
||||
对于频繁使用的提示类型,可以考虑使用对象池:
|
||||
|
||||
```typescript
|
||||
class TooltipPool {
|
||||
private pool: TooltipCom[] = [];
|
||||
|
||||
public acquire(): TooltipCom {
|
||||
if (this.pool.length > 0) {
|
||||
return this.pool.pop()!;
|
||||
}
|
||||
return new TooltipCom();
|
||||
}
|
||||
|
||||
public release(tooltip: TooltipCom): void {
|
||||
// 重置状态
|
||||
tooltip.reset();
|
||||
this.pool.push(tooltip);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 批量处理
|
||||
|
||||
对于连续的相同类型提示,可以考虑批量处理:
|
||||
|
||||
```typescript
|
||||
private damageQueue: DamageInfo[] = [];
|
||||
|
||||
public showDamage(damage: number, isCrit: boolean, anm: string = "atked") {
|
||||
this.damageQueue.push({
|
||||
damage,
|
||||
isCrit,
|
||||
delay: this.damageInterval,
|
||||
anm
|
||||
});
|
||||
}
|
||||
|
||||
private processDamageQueue() {
|
||||
if (this.isProcessingDamage || this.damageQueue.length === 0) return;
|
||||
|
||||
this.isProcessingDamage = true;
|
||||
const damageInfo = this.damageQueue.shift()!;
|
||||
|
||||
this.showDamageImmediate(damageInfo.damage, damageInfo.isCrit, damageInfo.anm);
|
||||
|
||||
this.scheduleOnce(() => {
|
||||
this.isProcessingDamage = false;
|
||||
}, this.damageInterval);
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 条件渲染
|
||||
|
||||
对于某些不常用的提示类型,可以考虑延迟加载:
|
||||
|
||||
```typescript
|
||||
private cachedNodes: Map<number, Node> = new Map();
|
||||
|
||||
private getCachedNode(type: number): Node {
|
||||
if (!this.cachedNodes.has(type)) {
|
||||
// 延迟加载UI节点
|
||||
const node = this.createNodeForType(type);
|
||||
this.cachedNodes.set(type, node);
|
||||
}
|
||||
return this.cachedNodes.get(type)!;
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 异步加载
|
||||
|
||||
对于大型UI资源,可以考虑异步加载:
|
||||
|
||||
```typescript
|
||||
async loadTooltipAsync(type: number, pos: Vec3, value: string, s_uuid: number, parent: any) {
|
||||
// 异步加载UI资源
|
||||
const prefab = await oops.res.getAsync("game/skill/buff/tooltip", Prefab);
|
||||
// 继续后续逻辑...
|
||||
}
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
奖励提示系统是游戏体验的重要组成部分,通过TooltipTypes常量定义的八种提示类型,系统能够有效地向玩家传达各种游戏状态和奖励信息。
|
||||
|
||||
### 关键特性
|
||||
|
||||
1. **类型化设计**:通过数值化的类型系统,实现了清晰的功能分类
|
||||
2. **灵活的UI适配**:每种类型都有专门的UI节点和显示逻辑
|
||||
3. **良好的扩展性**:新增类型只需遵循既定的配置步骤
|
||||
4. **完善的生命周期管理**:自动化的创建和销毁机制
|
||||
5. **丰富的应用场景**:覆盖了游戏中的各种奖励和状态变化
|
||||
|
||||
### 最佳实践
|
||||
|
||||
1. **合理使用类型**:根据具体场景选择合适的提示类型
|
||||
2. **注意层级管理**:确保提示不会被其他UI元素遮挡
|
||||
3. **控制显示时机**:避免过多的提示同时显示
|
||||
4. **关注性能表现**:对于高频使用的提示类型进行优化
|
||||
5. **保持一致性**:确保相似效果使用相同的提示类型
|
||||
|
||||
通过深入理解和正确使用这个奖励提示系统,开发者可以为玩家创造更加丰富和直观的游戏体验。
|
||||
195
.qoder/repowiki/zh/content/奖励系统/奖励配置/奖励配置.md
Normal file
195
.qoder/repowiki/zh/content/奖励系统/奖励配置/奖励配置.md
Normal file
@@ -0,0 +1,195 @@
|
||||
# 奖励配置
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts)
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts)
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
|
||||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [奖励系统概述](#奖励系统概述)
|
||||
2. [波次常量与奖励触发时机](#波次常量与奖励触发时机)
|
||||
3. [任务系统与奖励配置](#任务系统与奖励配置)
|
||||
4. [奖励类型的数据结构](#奖励类型的数据结构)
|
||||
5. [属性提升与技能升级奖励](#属性提升与技能升级奖励)
|
||||
6. [配置数据的加载与使用](#配置数据的加载与使用)
|
||||
7. [奖励配置的修改与扩展](#奖励配置的修改与扩展)
|
||||
|
||||
## 奖励系统概述
|
||||
|
||||
奖励系统是游戏核心机制的重要组成部分,通过配置文件定义各类奖励的参数和触发条件。系统主要由`Mission.ts`中的`FightSet`枚举和`TooltipTypes`常量、`Tasks.ts`中的任务配置以及`HeroAttrs.ts`中的属性定义共同构成。奖励系统不仅包括任务完成后的金币、经验奖励,还涵盖了战斗中属性提升、技能升级、装备获取等多种奖励类型。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L1-L59)
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L1-L29)
|
||||
|
||||
## 波次常量与奖励触发时机
|
||||
|
||||
波次常量定义了游戏中各种事件的触发时机,直接影响奖励的发放。`FightSet`枚举中的常量精确控制了伙伴、BOSS、装备和技能的登场波次,这些波次是奖励触发的关键节点。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class FightSet {
|
||||
+FRIEND_WAVE_UP = 3 : 伙伴登场波次
|
||||
+BOSS_WAVE_UP_1 = 3 : BOSS登场波次
|
||||
+BOSS_WAVE_UP_2 = 5 : BOSS登场波次
|
||||
+BOSS_WAVE_UP_3 = 7 : BOSS登场波次
|
||||
+EQUIP_WAVE_UP_1 = 4 : 装备登场波次
|
||||
+EQUIP_WAVE_UP_2 = 6 : 装备登场波次
|
||||
+EQUIP_WAVE_UP_3 = 8 : 装备登场波次
|
||||
+SKILL_WAVE_UP_1 = 2 : 技能登场波次
|
||||
+SKILL_WAVE_UP_2 = 5 : 技能登场波次
|
||||
+SKILL_WAVE_UP_3 = 7 : 技能登场波次
|
||||
+MON_WAVE_TIME = 10 : 怪物波次时间
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L1-L20)
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L1-L35)
|
||||
|
||||
## 任务系统与奖励配置
|
||||
|
||||
任务系统通过`Tasks.ts`文件中的`Tasks`常量定义,每个任务包含ID、名称、描述和奖励等属性。任务完成后,系统会根据配置发放相应的奖励。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Tasks {
|
||||
+id : number
|
||||
+name : string
|
||||
+description : string
|
||||
+reward : number
|
||||
+type? : number
|
||||
}
|
||||
class Speeks {
|
||||
+randomSpeek() : string[]
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L1-L29)
|
||||
|
||||
**Section sources**
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L1-L29)
|
||||
|
||||
## 奖励类型的数据结构
|
||||
|
||||
奖励系统定义了多种奖励类型,每种类型都有其特定的数据结构。`TooltipTypes`常量定义了各种奖励的类型标识,用于在UI中显示相应的奖励效果。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class TooltipTypes {
|
||||
+life = 1 : 生命值变化
|
||||
+health = 2 : 治疗效果
|
||||
+skill = 3 : 技能获得
|
||||
+crit = 4 : 暴击提示
|
||||
+uskill = 5 : 使用技能
|
||||
+lvup = 6 : 升级提示
|
||||
+apup = 7 : 攻击力提升
|
||||
+hpup = 8 : 生命值提升
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L50-L59)
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L50-L59)
|
||||
|
||||
## 属性提升与技能升级奖励
|
||||
|
||||
属性提升和技能升级奖励通过`HeroAttrs.ts`文件中的`Attrs`枚举和`AttrsType`配置表定义。系统区分数值型和百分比型属性,确保奖励计算的准确性。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Attrs {
|
||||
+HP_MAX = 0 : 最大生命值
|
||||
+MP_MAX = 1 : 最大魔法值
|
||||
+SHIELD_MAX = 2 : 最大护盾值
|
||||
+AP = 10 : 攻击力
|
||||
+MAP = 11 : 魔法攻击力
|
||||
+CRITICAL = 30 : 暴击率
|
||||
+CRITICAL_DMG = 31 : 暴击伤害
|
||||
+GOLD_GAIN = 65 : 金币获取
|
||||
+EXP_GAIN = 64 : 经验获取
|
||||
}
|
||||
class BType {
|
||||
+VALUE = 0 : 数值型
|
||||
+RATIO = 1 : 百分比型
|
||||
}
|
||||
class AttrsType {
|
||||
+[Attrs.HP_MAX] : BType.VALUE
|
||||
+[Attrs.AP] : BType.VALUE
|
||||
+[Attrs.CRITICAL] : BType.RATIO
|
||||
+[Attrs.GOLD_GAIN] : BType.RATIO
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L100)
|
||||
|
||||
**Section sources**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L100)
|
||||
|
||||
## 配置数据的加载与使用
|
||||
|
||||
配置数据通过单例模式的`SingletonModuleComp`进行管理,确保数据在游戏运行时的一致性和可访问性。奖励数据在战斗结束时通过`VictoryComp`组件显示给玩家。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MissionComp as MissionComp
|
||||
participant SingletonModule as SingletonModuleComp
|
||||
participant VictoryComp as VictoryComp
|
||||
MissionComp->>SingletonModule : 更新游戏数据(vmdata)
|
||||
SingletonModule->>MissionComp : 返回数据更新结果
|
||||
MissionComp->>VictoryComp : 传递奖励数据和游戏数据
|
||||
VictoryComp->>Player : 显示胜利界面和奖励
|
||||
VictoryComp->>SingletonModule : 更新金币等永久数据
|
||||
SingletonModule->>VictoryComp : 返回数据更新结果
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L70)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L1-L74)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L194)
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L1-L70)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L1-L74)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L1-L194)
|
||||
|
||||
## 奖励配置的修改与扩展
|
||||
|
||||
奖励配置可以通过修改相应的TS文件进行调整和扩展。开发者可以调整奖励权重、添加新的奖励配置项,或创建新的奖励类型。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始修改奖励配置]) --> ModifyMission["修改Mission.ts中的FightSet常量"]
|
||||
ModifyMission --> ModifyTasks["修改Tasks.ts中的任务奖励"]
|
||||
ModifyTasks --> ModifyHeroAttrs["修改HeroAttrs.ts中的属性定义"]
|
||||
ModifyHeroAttrs --> Test["测试配置变更"]
|
||||
Test --> Validate["验证奖励效果"]
|
||||
Validate --> Deploy["部署到游戏"]
|
||||
Deploy --> End([完成])
|
||||
ModifyMission --> AddNewReward["添加新的奖励类型到TooltipTypes"]
|
||||
AddNewReward --> UpdateUI["更新UI显示逻辑"]
|
||||
UpdateUI --> Test
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L1-L59)
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L1-L29)
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L546)
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L1-L59)
|
||||
- [Tasks.ts](file://assets/script/game/common/config/Tasks.ts#L1-L29)
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L546)
|
||||
343
.qoder/repowiki/zh/content/奖励系统/奖励配置/战斗奖励配置.md
Normal file
343
.qoder/repowiki/zh/content/奖励系统/奖励配置/战斗奖励配置.md
Normal file
@@ -0,0 +1,343 @@
|
||||
# 战斗奖励配置
|
||||
|
||||
<cite>
|
||||
**本文档引用文件**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
|
||||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [战斗奖励机制概述](#战斗奖励机制概述)
|
||||
2. [FightSet枚举常量详解](#fightset枚举常量详解)
|
||||
3. [奖励触发波次机制](#奖励触发波次机制)
|
||||
4. [奖励数值影响参数](#奖励数值影响参数)
|
||||
5. [奖励类型配置逻辑](#奖励类型配置逻辑)
|
||||
6. [配置加载与运行时访问](#配置加载与运行时访问)
|
||||
7. [常见问题排查](#常见问题排查)
|
||||
8. [代码示例](#代码示例)
|
||||
|
||||
## 战斗奖励机制概述
|
||||
|
||||
本系统基于Mission.ts文件中的FightSet枚举实现战斗奖励触发机制,通过波次常量控制奖励生成时机,结合参数配置实现多样化的奖励效果。系统通过事件驱动模式,在特定战斗阶段触发相应的奖励逻辑,包括属性提升、金币获取和技能解锁等。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L35)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L33)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts#L0-L69)
|
||||
|
||||
## FightSet枚举常量详解
|
||||
|
||||
FightSet枚举定义了战斗中的关键配置常量,主要分为三类:波次触发常量、数值影响常量和资源类型常量。
|
||||
|
||||
### 波次触发常量
|
||||
|
||||
| 常量名称 | 数值 | 业务含义 |
|
||||
|---------|------|---------|
|
||||
| FRIEND_WAVE_UP | 3 | 伙伴登场的战斗波次 |
|
||||
| BOSS_WAVE_UP_1 | 3 | 第一波BOSS登场波次 |
|
||||
| BOSS_WAVE_UP_2 | 5 | 第二波BOSS登场波次 |
|
||||
| BOSS_WAVE_UP_3 | 7 | 第三波BOSS登场波次 |
|
||||
| EQUIP_WAVE_UP_1 | 4 | 第一波装备登场波次 |
|
||||
| EQUIP_WAVE_UP_2 | 6 | 第二波装备登场波次 |
|
||||
| EQUIP_WAVE_UP_3 | 8 | 第三波装备登场波次 |
|
||||
| SKILL_WAVE_UP_1 | 2 | 第一波技能登场波次 |
|
||||
| SKILL_WAVE_UP_2 | 5 | 第二波技能登场波次 |
|
||||
| SKILL_WAVE_UP_3 | 7 | 第三波技能登场波次 |
|
||||
|
||||
### 数值影响常量
|
||||
|
||||
| 常量名称 | 数值 | 业务含义 |
|
||||
|---------|------|---------|
|
||||
| ATK_ADD_COUNT | 4 | 伙伴攻击力增加基数 |
|
||||
| ATK_ADD_GLOD | 1 | 金币增加基数 |
|
||||
| CRIT_DAMAGE | 50 | 暴击伤害百分比 |
|
||||
| DOUBLE_ATK_RATE | 100 | 额外攻击默认概率 |
|
||||
| ATKED_TO_POWER | 15 | 被攻击涨能量值 |
|
||||
| ATK_TO_POWER | 10 | 攻击涨能量值 |
|
||||
|
||||
### 资源类型常量
|
||||
|
||||
| 常量名称 | 数值 | 业务含义 |
|
||||
|---------|------|---------|
|
||||
| GREEN_GOLD | 1 | 绿色金币类型 |
|
||||
| BLUE_GOLD | 2 | 蓝色金币类型 |
|
||||
| PURPLE_GOLD | 3 | 紫色金币类型 |
|
||||
| ORANGE_GOLD | 4 | 橙色金币类型 |
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L35)
|
||||
|
||||
## 奖励触发波次机制
|
||||
|
||||
战斗奖励的触发与波次系统紧密关联,通过FightSet中的波次常量控制不同奖励类型的出现时机。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MissionComp as MissionComp
|
||||
participant MissionMonComp as MissionMonComp
|
||||
participant RogueConfig as RogueConfig
|
||||
MissionComp->>MissionMonComp : dispatchEvent(FightStart)
|
||||
MissionMonComp->>RogueConfig : getStageType(stage,level)
|
||||
RogueConfig-->>MissionMonComp : 返回关卡类型
|
||||
MissionMonComp->>RogueConfig : getStageMonsterConfigs()
|
||||
RogueConfig-->>MissionMonComp : 返回怪物配置
|
||||
MissionMonComp->>MissionMonComp : generateMonstersFromStageConfig()
|
||||
MissionMonComp->>MissionMonComp : processRandomEvent()
|
||||
alt 事件触发
|
||||
MissionMonComp->>MissionMonComp : TREASURE事件
|
||||
MissionMonComp->>MissionComp : 增加金币奖励
|
||||
end
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L66-L116)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L129-L168)
|
||||
|
||||
### 波次与地图系统联动
|
||||
|
||||
波次常量与地图系统通过关卡配置实现联动,具体关系如下:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[开始战斗] --> B{判断关卡类型}
|
||||
B --> |普通关卡| C[按波次生成怪物]
|
||||
B --> |精英关卡| D[增加精英怪物]
|
||||
B --> |BOSS关卡| E[生成BOSS怪物]
|
||||
B --> |事件关卡| F[触发随机事件]
|
||||
F --> G{随机事件类型}
|
||||
G --> |宝箱事件| H[增加金币奖励]
|
||||
G --> |陷阱事件| I[对玩家造成伤害]
|
||||
G --> |增益事件| J[给予临时增益]
|
||||
G --> |减益事件| K[给予临时减益]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L86-L132)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L135-L169)
|
||||
|
||||
## 奖励数值影响参数
|
||||
|
||||
奖励数值通过FightSet中的参数进行配置,影响各种奖励效果的强度。
|
||||
|
||||
### 攻击力与金币影响机制
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class FightSet {
|
||||
+FRIEND_WAVE_UP : number
|
||||
+BOSS_WAVE_UP_1 : number
|
||||
+EQUIP_WAVE_UP_1 : number
|
||||
+SKILL_WAVE_UP_1 : number
|
||||
+ATK_ADD_COUNT : number
|
||||
+ATK_ADD_GLOD : number
|
||||
+CRIT_DAMAGE : number
|
||||
}
|
||||
class HeroViewComp {
|
||||
+Attrs : number[]
|
||||
+base_ap : number
|
||||
+hp : number
|
||||
}
|
||||
class TalComp {
|
||||
+FStats : Stats
|
||||
+checkTrigger(tal) : boolean
|
||||
+doTalEffect(tal) : void
|
||||
}
|
||||
FightSet --> HeroViewComp : 影响属性计算
|
||||
FightSet --> TalComp : 影响天赋触发
|
||||
TalComp --> HeroViewComp : 修改英雄属性
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L35)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L0-L22)
|
||||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L102-L139)
|
||||
|
||||
### 能量增长参数
|
||||
|
||||
| 参数 | 数值 | 触发条件 |
|
||||
|------|------|---------|
|
||||
| ATKED_TO_POWER | 15 | 被攻击时增长能量 |
|
||||
| ATK_TO_POWER | 10 | 攻击时增长能量 |
|
||||
| CRIT_TO_POWER | 15 | 暴击时增长能量 |
|
||||
| DODGE_TO_POWER | 15 | 闪避时增长能量 |
|
||||
|
||||
这些参数在英雄战斗过程中实时影响能量值的增长,进而影响技能释放频率。
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L35)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L582-L622)
|
||||
|
||||
## 奖励类型配置逻辑
|
||||
|
||||
系统实现了多种奖励类型,每种类型都有特定的配置逻辑和触发条件。
|
||||
|
||||
### 属性提升奖励
|
||||
|
||||
属性提升通过天赋系统实现,当满足特定条件时触发:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[战斗开始] --> B{检查天赋触发条件}
|
||||
B --> |等级提升| C[触发LEVEL_UP天赋]
|
||||
B --> |行动次数| D[触发ACTION_COUNT天赋]
|
||||
B --> |技能使用| E[触发SKILL_COUNT天赋]
|
||||
B --> |受到伤害| F[触发DAMAGE_COUNT天赋]
|
||||
C --> G[执行天赋效果]
|
||||
D --> G
|
||||
E --> G
|
||||
F --> G
|
||||
G --> H[属性提升]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L134-L169)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L281-L316)
|
||||
|
||||
### 金币获取奖励
|
||||
|
||||
金币获取主要通过两种方式实现:
|
||||
|
||||
1. **战斗掉落**:怪物死亡时随机掉落金币
|
||||
2. **事件奖励**:事件关卡触发宝箱事件获得固定金币
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Mon as Monster
|
||||
participant MissionComp as MissionComp
|
||||
participant TopComp as TopComp
|
||||
Mon->>MissionComp : dispatchEvent(MonDead)
|
||||
MissionComp->>MissionComp : do_mon_dead()
|
||||
MissionComp->>MissionComp : 增加金币
|
||||
MissionComp->>TopComp : dispatchEvent(GOLD_UPDATE)
|
||||
TopComp->>TopComp : 更新金币UI显示
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L32-L70)
|
||||
- [TopComp.ts](file://assets/script/game/map/TopComp.ts#L0-L28)
|
||||
|
||||
### 技能解锁奖励
|
||||
|
||||
技能解锁通过技能波次常量控制,在特定波次解锁新技能:
|
||||
|
||||
- SKILL_WAVE_UP_1=2:第二波解锁第一个技能
|
||||
- SKILL_WAVE_UP_2=5:第五波解锁第二个技能
|
||||
- SKILL_WAVE_UP_3=7:第七波解锁第三个技能
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L35)
|
||||
- [TalComp.ts](file://assets/script/game/hero/TalComp.ts#L102-L139)
|
||||
|
||||
## 配置加载与运行时访问
|
||||
|
||||
系统通过模块化方式加载和访问配置数据,确保配置的可维护性和可扩展性。
|
||||
|
||||
### 配置加载流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[游戏启动] --> B[加载Mission.ts配置]
|
||||
B --> C[初始化FightSet常量]
|
||||
C --> D[加载地图配置]
|
||||
D --> E[初始化关卡数据]
|
||||
E --> F[战斗开始]
|
||||
F --> G[运行时访问配置]
|
||||
G --> H[根据波次触发奖励]
|
||||
```
|
||||
|
||||
### 运行时访问路径
|
||||
|
||||
配置数据在运行时通过以下路径访问:
|
||||
|
||||
- FightSet常量:`import { FightSet } from "../common/config/Mission"`
|
||||
- 关卡配置:`import { getStageMonsterConfigs } from "./RogueConfig"`
|
||||
- 事件配置:`import { getRandomEvent } from "./RogueConfig"`
|
||||
|
||||
**Section sources**
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L0-L33)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L246-L281)
|
||||
|
||||
## 常见问题排查
|
||||
|
||||
### 奖励未触发的可能原因
|
||||
|
||||
1. **波次配置错误**
|
||||
- 检查FightSet中波次常量设置是否正确
|
||||
- 确认波次值与实际战斗进度匹配
|
||||
|
||||
2. **事件监听缺失**
|
||||
- 确保MissionComp正确监听FightStart事件
|
||||
- 检查事件派发是否正常
|
||||
|
||||
3. **配置加载失败**
|
||||
- 验证Mission.ts文件是否正确导入
|
||||
- 检查路径引用是否正确
|
||||
|
||||
4. **条件未满足**
|
||||
- 天赋触发条件未达到
|
||||
- 关卡类型不符合奖励条件
|
||||
|
||||
### 调试方法
|
||||
|
||||
1. **日志输出**
|
||||
- 在关键节点添加console.log输出
|
||||
- 监控波次变化和事件触发
|
||||
|
||||
2. **断点调试**
|
||||
- 在MissionMonComp的do_mon_wave方法设置断点
|
||||
- 检查怪物生成和事件处理逻辑
|
||||
|
||||
3. **配置验证**
|
||||
- 确认FightSet常量值在合理范围内
|
||||
- 验证关卡配置与波次设置的匹配性
|
||||
|
||||
**Section sources**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L69-L105)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L114-L150)
|
||||
|
||||
## 代码示例
|
||||
|
||||
### 调整奖励触发波次
|
||||
|
||||
```typescript
|
||||
// 修改技能登场波次
|
||||
export enum FightSet {
|
||||
SKILL_WAVE_UP_1 = 1, // 提前到第一波
|
||||
SKILL_WAVE_UP_2 = 4, // 提前到第四波
|
||||
SKILL_WAVE_UP_3 = 6, // 提前到第六波
|
||||
// 其他配置...
|
||||
}
|
||||
```
|
||||
|
||||
### 修改奖励数值
|
||||
|
||||
```typescript
|
||||
// 增加金币奖励数值
|
||||
export enum FightSet {
|
||||
ATK_ADD_GLOD = 2, // 金币增加从1提升到2
|
||||
CRIT_DAMAGE = 75, // 暴击伤害从50%提升到75%
|
||||
// 其他配置...
|
||||
}
|
||||
```
|
||||
|
||||
### 添加新的奖励类型
|
||||
|
||||
```typescript
|
||||
// 在Mission.ts中添加新的奖励常量
|
||||
export enum FightSet {
|
||||
NEW_REWARD_TYPE = 5, // 新的奖励类型
|
||||
REWARD_VALUE = 100, // 奖励数值
|
||||
// 其他配置...
|
||||
}
|
||||
```
|
||||
|
||||
**Section sources**
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts#L0-L35)
|
||||
- [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts#L0-L74)
|
||||
Reference in New Issue
Block a user