12 KiB
MissionComp事件处理机制
**本文档中引用的文件** - [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)目录
简介
MissionComp.ts是游戏战斗系统的核心控制器,负责管理整个任务生命周期中的事件监听、处理和游戏状态管理。该组件通过事件驱动的方式协调各个子系统的运作,包括战斗准备、怪物生成、英雄死亡检测、战斗结束处理等功能。
项目结构概览
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作为游戏战斗系统的核心控制器,主要负责以下功能:
主要职责
- 事件监听管理:注册并处理各种游戏事件
- 战斗状态控制:管理战斗开始、进行、结束的状态转换
- 资源清理:战斗结束后清理游戏实体和组件
- 数据初始化:每局游戏开始时初始化相关数据
关键属性
rewards:掉落物品奖励数组game_data:游戏统计数据(经验、金币、钻石)node:Cocos节点引用
章节来源
架构概览
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 : 打开胜利界面
图表来源
详细组件分析
onLoad方法中的事件注册
MissionComp在onLoad方法中注册了多个关键事件监听器:
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 : 监听事件
图表来源
事件监听器详解
-
MissionStart事件:任务开始事件
- 触发时机:任务初始化时
- 处理逻辑:发送FightReady事件,激活节点,初始化数据
-
MonDead事件:怪物死亡事件
- 触发时机:怪物被击败时
- 处理逻辑:减少怪物计数
-
HeroDead事件:英雄死亡事件
- 触发时机:英雄生命值归零时
- 处理逻辑:减少英雄计数,判断游戏失败
-
FightEnd事件:战斗结束事件
- 触发时机:战斗结束时
- 处理逻辑:延迟清理游戏实体
-
MissionEnd事件:任务结束事件
- 触发时机:任务完成或失败时
- 处理逻辑:隐藏任务节点
章节来源
fight_end方法的延迟清理机制
fight_end方法实现了战斗结束后的延迟清理逻辑:
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([清理完成])
图表来源
cleanComponents方法实现细节
cleanComponents方法通过ECS查询系统清理不同类型的游戏实体:
- 英雄实体清理:查询所有带有HeroViewComp组件的实体
- 攻击实体清理:查询所有带有AtkConCom组件的实体
- 技能实体清理:查询所有带有SkillViewCom组件的实体
章节来源
do_hero_dead方法的游戏失败判定
do_hero_dead方法实现了英雄死亡时的游戏失败判定逻辑:
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[游戏失败]
图表来源
当所有英雄都死亡时,系统会:
- 分发FightEnd事件,携带victory=false参数
- 打开Victory界面,显示失败状态
- 传递奖励数组和游戏统计数据
章节来源
data_init方法的数据初始化过程
data_init方法负责每局游戏开始时的初始化工作:
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([初始化完成])
图表来源
章节来源
事件处理流程
完整的事件派发与监听流程
以下是游戏战斗系统中典型的事件处理流程:
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()
图表来源
参数传递机制
事件系统采用参数化设计,支持不同类型的参数传递:
| 事件类型 | 参数结构 | 用途 |
|---|---|---|
| GameEvent.FightEnd | {victory: boolean} |
标识战斗结果 |
| GameEvent.MissionStart | 无参数 | 启动新任务 |
| GameEvent.MonDead | data: {monsterId: number} |
怪物死亡信息 |
| GameEvent.HeroDead | data: {heroId: number} |
英雄死亡信息 |
章节来源
性能考虑
事件监听器优化
- 事件去重:确保相同事件不会重复注册
- 内存管理:及时清理不再使用的事件监听器
- 异步处理:战斗结束清理采用延迟执行避免阻塞
ECS组件清理策略
cleanComponents方法采用批量查询和清理策略:
- 使用ECS查询系统高效定位目标组件
- 批量移除和销毁相关实体
- 避免逐个遍历导致的性能问题
故障排除指南
常见问题及解决方案
1. 事件未正确触发
症状:某些事件监听器没有响应 原因:事件名称拼写错误或事件未正确注册 解决:检查GameEvent枚举定义和事件监听器注册
2. 战斗结束后残留实体
症状:战斗结束后仍有未清理的游戏实体 原因:cleanComponents方法未能匹配到所有组件 解决:检查组件标签是否正确,确保所有实体都包含相应组件
3. 英雄死亡判定错误
症状:英雄死亡后游戏未正确判定失败 原因:do_hero_dead方法逻辑错误或事件传递中断 解决:验证英雄计数逻辑和事件分发机制
章节来源
结论
MissionComp.ts作为游戏战斗系统的核心控制器,通过精心设计的事件驱动架构实现了高效的战斗管理。其主要优势包括:
- 模块化设计:清晰的职责分离,便于维护和扩展
- 事件驱动:松耦合的组件通信机制
- 资源管理:完善的清理机制确保内存安全
- 状态控制:精确的游戏状态管理
该设计模式为游戏开发提供了可复用的战斗系统框架,能够适应不同类型的战斗场景需求。通过合理的事件管理和组件清理,确保了游戏运行的稳定性和性能表现。