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架构实现高效的组件管理
|
||||
|
||||
该英雄管理系统为游戏战斗提供了稳定可靠的基础框架,支持动态英雄召唤、战斗状态管理和资源回收等功能,是整个战斗系统的重要组成部分。
|
||||
Reference in New Issue
Block a user