feat(怪物系统): 重构怪物类型与属性计算系统
引入MonType枚举支持普通、精英、BOSS三种怪物类型 新增getMonAttr函数实现基于等级和类型的动态属性计算 更新Mon.ts的load和hero_init方法以支持新参数 扩展heroSet.ts添加多种新怪物类型配置 重构属性初始化流程,移除strengthMultiplier机制 更新相关文档和流程图反映最新设计
This commit is contained in:
@@ -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怪物,支持动态调整怪物数量和强度。数据与表现层分离清晰,便于维护和迭代。通过合理使用配置文件,实现了关卡数据的外部化管理。整体架构设计合理,为游戏的长期发展奠定了坚实基础。
|
||||
Reference in New Issue
Block a user