Files
pixelheros/.qoder/repowiki/zh/content/奖励系统/奖励UI交互/MissionComp事件处理机制.md
panw 4235e3b776 refactor(game): 移除已弃用的事件常量
- 删除 UpdateHero 和 UpdateFightHero 事件
- 移除 MISSION_UPDATE 事件常量
- 优化游戏事件枚举定义
2025-10-28 16:15:47 +08:00

12 KiB
Raw Blame History

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)

目录

  1. 简介
  2. 项目结构概览
  3. 核心组件分析
  4. 架构概览
  5. 详细组件分析
  6. 事件处理流程
  7. 性能考虑
  8. 故障排除指南
  9. 结论

简介

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:游戏统计数据(经验、金币、钻石)
  • nodeCocos节点引用

章节来源

架构概览

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 : 监听事件

图表来源

事件监听器详解

  1. MissionStart事件:任务开始事件

    • 触发时机:任务初始化时
    • 处理逻辑发送FightReady事件激活节点初始化数据
  2. MonDead事件:怪物死亡事件

    • 触发时机:怪物被击败时
    • 处理逻辑:减少怪物计数
  3. HeroDead事件:英雄死亡事件

    • 触发时机:英雄生命值归零时
    • 处理逻辑:减少英雄计数,判断游戏失败
  4. FightEnd事件:战斗结束事件

    • 触发时机:战斗结束时
    • 处理逻辑:延迟清理游戏实体
  5. 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[游戏失败]

图表来源

当所有英雄都死亡时,系统会:

  1. 分发FightEnd事件携带victory=false参数
  2. 打开Victory界面显示失败状态
  3. 传递奖励数组和游戏统计数据

章节来源

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} 英雄死亡信息

章节来源

性能考虑

事件监听器优化

  1. 事件去重:确保相同事件不会重复注册
  2. 内存管理:及时清理不再使用的事件监听器
  3. 异步处理:战斗结束清理采用延迟执行避免阻塞

ECS组件清理策略

cleanComponents方法采用批量查询和清理策略

  • 使用ECS查询系统高效定位目标组件
  • 批量移除和销毁相关实体
  • 避免逐个遍历导致的性能问题

故障排除指南

常见问题及解决方案

1. 事件未正确触发

症状:某些事件监听器没有响应 原因:事件名称拼写错误或事件未正确注册 解决检查GameEvent枚举定义和事件监听器注册

2. 战斗结束后残留实体

症状:战斗结束后仍有未清理的游戏实体 原因cleanComponents方法未能匹配到所有组件 解决:检查组件标签是否正确,确保所有实体都包含相应组件

3. 英雄死亡判定错误

症状:英雄死亡后游戏未正确判定失败 原因do_hero_dead方法逻辑错误或事件传递中断 解决:验证英雄计数逻辑和事件分发机制

章节来源

结论

MissionComp.ts作为游戏战斗系统的核心控制器通过精心设计的事件驱动架构实现了高效的战斗管理。其主要优势包括

  1. 模块化设计:清晰的职责分离,便于维护和扩展
  2. 事件驱动:松耦合的组件通信机制
  3. 资源管理:完善的清理机制确保内存安全
  4. 状态控制:精确的游戏状态管理

该设计模式为游戏开发提供了可复用的战斗系统框架,能够适应不同类型的战斗场景需求。通过合理的事件管理和组件清理,确保了游戏运行的稳定性和性能表现。