feat(怪物系统): 重构怪物类型与属性计算系统

引入MonType枚举支持普通、精英、BOSS三种怪物类型
新增getMonAttr函数实现基于等级和类型的动态属性计算
更新Mon.ts的load和hero_init方法以支持新参数
扩展heroSet.ts添加多种新怪物类型配置
重构属性初始化流程,移除strengthMultiplier机制
更新相关文档和流程图反映最新设计
This commit is contained in:
panw
2025-10-29 16:50:30 +08:00
parent 9dc1126dfe
commit edb7f23918
6 changed files with 648 additions and 432 deletions

View File

@@ -3,13 +3,13 @@
<cite>
**本文档引用的文件**
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts) - *在最近提交中更新*
- [Mon.ts](file://assets/script/game/hero/Mon.ts) - *在最近提交中更新*
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
- [map.json](file://assets/resources/config/map/map.json)
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json)
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts) - *在最近提交中更新*
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts)
@@ -17,6 +17,14 @@
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts)
</cite>
## 更新摘要
**已更新内容**
- 更新了“随机关卡生成逻辑分析”章节,反映使用 `MonType` 枚举重构的怪物生成系统
- 更新了“怪物实体设计模式分析”章节,以包含新的 `monType``buffs` 参数
- 更新了“依赖分析”图表,反映 `RogueConfig.ts``MissionMonComp.ts` 的变更
- 新增了“怪物类型与属性计算”章节,详细说明 `MonType` 枚举和 `getMonAttr` 函数
- 所有受影响的代码示例和序列图均已更新
## 目录
1. [引言](#引言)
2. [项目结构](#项目结构)
@@ -217,9 +225,34 @@ GameMap --> MapModelComp : "包含"
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L35)
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L42)
### 怪物类型与属性计算
`RogueConfig.ts`文件引入了`MonType`枚举来定义怪物类型,取代了原有的布尔标记。`MonType`包含`NORMAL`(普通)、`ELITE`(精英)和`BOSS`(首领)三种类型。系统通过`MonAttrSet`配置表为不同类型的怪物设置属性倍率。`getMonAttr`函数根据怪物等级、UUID和类型计算最终属性值确保精英和Boss怪物具有更高的生命值、攻击力和防御力。
#### 属性计算逻辑
```mermaid
flowchart TD
Start([计算怪物属性]) --> GetBase["获取基础属性 (来自HeroInfo)"]
GetBase --> ApplyLevel["应用等级倍率 (lv)"]
ApplyLevel --> ApplyType["应用类型倍率 (MonAttrSet[MonType])"]
ApplyType --> Calculate["计算最终属性: HP, MP, AP, DEF等"]
Calculate --> Return["返回属性对象"]
Return --> End([属性计算完成])
```
**图示来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L31-L31) - *MonType枚举定义*
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L79-L88) - *getMonAttr函数实现*
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L37-L60) - *load方法调用getMonAttr*
**本节来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L31-L31)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L79-L88)
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L37-L60)
### 随机关卡生成逻辑分析
`RogueConfig.ts`文件定义了随机关卡的生成规则。系统通过`getStageType`函数根据关卡号和等级决定关卡类型普通、精英、Boss、事件`generateStageConfig`函数根据关卡类型生成怪物类型数组,`calculateMonsterCount`函数根据关卡进度动态调整怪物数量,`calculateMonsterStrengthMultiplier`函数计算怪物强度倍率。`getStageMonsterConfigs`函数综合以上逻辑生成包含怪物UUID、类型和强度倍率的完整配置
`RogueConfig.ts`文件重构了随机关卡的生成规则。系统通过`getStageMonConfigs`函数根据关卡号生成怪物配置。该函数首先判断当前关卡是否为精英关卡(`EliteStage`数组中包含或Boss关卡`BossStage`数组中包含。如果是Boss关卡则从`BossMons`列表中随机选择一个Boss怪物加入配置并减少普通怪物数量。如果是精英关卡则添加1-2个精英怪物。最后根据`StageRule`中的`extraMonsterRate`概率决定是否生成额外的普通怪物
#### API/服务组件
```mermaid
@@ -227,48 +260,42 @@ sequenceDiagram
participant Game as "游戏逻辑"
participant RogueConfig as "RogueConfig"
participant MissionMonComp as "MissionMonComp"
Game->>RogueConfig : getStageType(stageNumber, level)
RogueConfig-->>Game : 返回关卡类型
Game->>RogueConfig : generateStageConfig(stageNumber, level)
RogueConfig-->>Game : 返回怪物类型数组
Game->>RogueConfig : calculateMonsterCount(...)
RogueConfig-->>Game : 返回实际数量
Game->>RogueConfig : calculateMonsterStrengthMultiplier(...)
RogueConfig-->>Game : 返回强度倍率
Game->>RogueConfig : getStageMonsterConfigs(...)
RogueConfig-->>Game : 返回完整怪物配置
Game->>MissionMonComp : do_mon_wave()
MissionMonComp->>MissionMonComp : generateMonstersFromStageConfig()
Game->>RogueConfig : getStageMonConfigs(stageNumber)
RogueConfig-->>Game : 返回IMonsConfig[]数组
Game->>MissionMonComp : generateMonsters(monsConf)
MissionMonComp->>MissionMonComp : addToStageSpawnQueue()
loop 每个怪物
loop 每个怪物配置
MissionMonComp->>MissionMonComp : spawnNextMonster()
MissionMonComp->>Monster : load()
MissionMonComp->>Monster : load(uuid, pos, monType, level, buffs)
end
```
**图示来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L310)
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L239)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L95-L173) - *getStageMonConfigs函数实现*
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L19-L25) - *MonQueue使用MonType*
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L177-L191) - *addMonster方法*
**本节来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L310)
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L239)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L95-L173)
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L19-L25)
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L177-L191)
### 怪物实体设计模式分析
`Mon.ts`文件定义了`Monster`类,代表游戏中的怪物实体。该类同样基于ECS架构包含`HeroModel`(模型组件)、`HeroView`(视图组件)和`BattleMove`(战斗移动组件)。`load`方法负责加载怪物的预制件并初始化其位置和属性。`hero_init`方法根据怪物UUID从`HeroInfo`配置中获取基础属性,并根据强度倍率进行调整。怪物的技能、属性和状态均在此方法中初始化。
`Mon.ts`文件定义了`Monster`代表游戏中的怪物实体。该类基于ECS架构包含`HeroModel`(模型组件)、`HeroView`(视图组件)和`BattleMove`(战斗移动组件)。`load`方法的签名已更新,增加了`monType``buffs`参数。该方法调用`getMonAttr`函数根据关卡等级和怪物类型计算属性,并将这些属性传递给`hero_init`方法进行初始化。怪物的技能、属性和状态均在此方法中初始化。
#### 复杂逻辑组件
```mermaid
flowchart TD
Start([怪物加载]) --> Load["load(pos, scale, uuid, is_boss)"]
Start([怪物加载]) --> Load["load(pos, scale, uuid, lv, monType, buffs)"]
Load --> GetPrefab["获取预制件路径"]
GetPrefab --> Instantiate["实例化预制件"]
Instantiate --> SetParent["设置父节点为entityLayer"]
SetParent --> Init["调用hero_init初始化"]
Init --> GetHeroInfo["从HeroInfo获取基础属性"]
GetHeroInfo --> AdjustAttrs["根据strengthMultiplier调整属性"]
AdjustAttrs --> InitSkills["初始化技能数组"]
GetHeroInfo --> CalculateAttrs["调用getMonAttr计算最终属性"]
CalculateAttrs --> ApplyBuffs["应用buffs数组"]
ApplyBuffs --> InitSkills["初始化技能数组"]
InitSkills --> AddComponent["将HeroViewComp添加到实体"]
AddComponent --> SetMove["设置BattleMove参数"]
SetMove --> Dispatch["派发monster_load事件"]
@@ -276,12 +303,14 @@ Dispatch --> End([怪物加载完成])
```
**图示来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L108)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L151)
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L37-L60) - *load方法实现*
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L61-L108) - *hero_init方法实现*
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L79-L88) - *getMonAttr函数*
**本节来源**
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L108)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L151)
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L37-L60)
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L61-L108)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L79-L88)
### 数据与表现层分离分析
@@ -394,8 +423,8 @@ RogueConfig_ts --> heroSet_ts
## 故障排除指南
- **地图无法加载**:检查`MapModelComp`中的`resPrefab`路径是否正确,确保预制件存在于资源目录中。
- **怪物未生成**:确认`MissionMonComp`是否监听了`FightReady`事件,检查`monsterQueue`是否正确填充。
- **属性未按倍率调整**:确保`Mon.ts`中的`hero_init`方法正确接收并应用`strengthMultiplier`数。
- **怪物未生成**:确认`MissionMonComp`是否监听了`FightReady`事件,检查`MonQueue`是否正确填充。
- **属性未按倍率调整**:确保`Mon.ts`中的`hero_init`方法正确接收并应用`monType`参数,并调用`getMonAttr`数。
- **转场无效**:验证`map_delivery.json`中的`pos``start`坐标格式是否正确,确保触发位置与玩家位置匹配。
**本节来源**
@@ -405,4 +434,4 @@ RogueConfig_ts --> heroSet_ts
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json#L1-L29)
## 结论
本文档全面分析了Cocos游戏项目中的地图系统架构。系统采用ECS和MVC设计模式实现了良好的代码分离和可扩展性。随机关卡生成逻辑灵活,支持动态调整怪物数量和强度。数据与表现层分离清晰,便于维护和迭代。通过合理使用配置文件,实现了关卡数据的外部化管理。整体架构设计合理,为游戏的长期发展奠定了坚实基础。
本文档全面分析了Cocos游戏项目中的地图系统架构。系统采用ECS和MVC设计模式实现了良好的代码分离和可扩展性。随机关卡生成逻辑经过重构,使用`MonType`枚举清晰地管理普通、精英和Boss怪物,支持动态调整怪物数量和强度。数据与表现层分离清晰,便于维护和迭代。通过合理使用配置文件,实现了关卡数据的外部化管理。整体架构设计合理,为游戏的长期发展奠定了坚实基础。