# 奖励触发机制 **本文档引用的文件** - [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) ## 目录 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`中奖励触发逻辑的深入分析,我们了解到该系统采用事件驱动架构,通过注册和监听关键游戏事件来实现奖励的累积和发放。系统设计合理,各组件职责分明,数据流转清晰,为游戏的战斗奖励机制提供了可靠的支撑。