refactor(game): 移除已弃用的事件常量
- 删除 UpdateHero 和 UpdateFightHero 事件 - 移除 MISSION_UPDATE 事件常量 - 优化游戏事件枚举定义
This commit is contained in:
503
.qoder/repowiki/zh/content/地图系统/地图模型.md
Normal file
503
.qoder/repowiki/zh/content/地图系统/地图模型.md
Normal file
@@ -0,0 +1,503 @@
|
||||
# 地图模型
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
- [map.json](file://assets/resources/config/map/map.json)
|
||||
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [数据结构分析](#数据结构分析)
|
||||
7. [ECS初始化流程](#ecs初始化流程)
|
||||
8. [地图跳转逻辑](#地图跳转逻辑)
|
||||
9. [数据驱动设计](#数据驱动设计)
|
||||
10. [最佳实践](#最佳实践)
|
||||
11. [总结](#总结)
|
||||
|
||||
## 简介
|
||||
|
||||
MapModelComp组件是Cocos游戏项目中地图系统的核心数据层组件,采用ECS(Entity-Component-System)架构模式设计。该组件负责管理地图资源路径、关卡配置及地图跳转逻辑,为整个地图系统提供数据支撑和状态管理功能。
|
||||
|
||||
地图系统基于两个关键的JSON配置文件:
|
||||
- `map.json`:存储地图基本信息(ID、名称、可跳转关卡)
|
||||
- `map_delivery.json`:存储地图连接点、目标地图和出生点信息
|
||||
|
||||
## 项目结构
|
||||
|
||||
地图系统的文件组织遵循清晰的分层架构:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "地图系统架构"
|
||||
A[MapModelComp.ts<br/>数据模型组件] --> B[GameMap.ts<br/>游戏地图实体]
|
||||
B --> C[MapViewComp.ts<br/>视图组件]
|
||||
C --> D[MapViewScene.ts<br/>场景逻辑]
|
||||
E[map.json<br/>地图配置] --> A
|
||||
F[map_delivery.json<br/>连接点配置] --> A
|
||||
G[SingletonModuleComp.ts<br/>单例模块] --> B
|
||||
H[LoadingViewComp.ts<br/>加载界面] --> B
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L43)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
|
||||
**章节来源**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L43)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### MapModelComp - 地图模型组件
|
||||
|
||||
MapModelComp是地图系统的核心数据组件,继承自ECS框架的ecs.Comp基类,负责维护地图的基本状态和资源配置。
|
||||
|
||||
#### 主要属性
|
||||
|
||||
| 属性名 | 类型 | 默认值 | 描述 |
|
||||
|--------|------|--------|------|
|
||||
| id | number | 1 | 初始地图编号,标识当前激活的地图 |
|
||||
| resPrefab | string | "game/map/map_rpg" | 地图显示预制体资源路径 |
|
||||
|
||||
#### 设计特点
|
||||
|
||||
1. **数据驱动**:所有地图配置通过外部JSON文件管理
|
||||
2. **资源管理**:集中管理地图相关的资源路径
|
||||
3. **状态控制**:维护当前地图的状态信息
|
||||
4. **扩展性**:预留了资源获取方法的注释,支持动态资源加载
|
||||
|
||||
**章节来源**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L9-L43)
|
||||
|
||||
### GameMap - 游戏地图实体
|
||||
|
||||
GameMap继承自ecs.Entity,是地图系统的主实体,负责地图的整体生命周期管理和资源加载。
|
||||
|
||||
#### 核心功能
|
||||
|
||||
1. **组件初始化**:自动添加MapModelComp组件
|
||||
2. **资源加载**:异步加载地图显示资源
|
||||
3. **场景管理**:协调地图视图和场景逻辑
|
||||
|
||||
**章节来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L14-L36)
|
||||
|
||||
## 架构概览
|
||||
|
||||
地图系统采用经典的ECS架构模式,实现了数据与行为的分离:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MapModelComp {
|
||||
+number id
|
||||
+string resPrefab
|
||||
+reset() void
|
||||
}
|
||||
class GameMap {
|
||||
+MapModelComp MapModel
|
||||
+MapViewComp MapView
|
||||
+init() void
|
||||
+load() void
|
||||
}
|
||||
class MapViewComp {
|
||||
+MapViewScene scene
|
||||
+Timer game_timer
|
||||
+onLoad() void
|
||||
+start() void
|
||||
+load_data() void
|
||||
+update(dt) void
|
||||
}
|
||||
class MapViewScene {
|
||||
+Camera camera
|
||||
+Node layer
|
||||
+MapLayer mapLayer
|
||||
+EntityLayer entityLayer
|
||||
+SkillLayer SkillLayer
|
||||
+Vec2 ratio
|
||||
+init() void
|
||||
+update(dt) void
|
||||
}
|
||||
class SingletonModuleComp {
|
||||
+GameMap map
|
||||
+number fight_hero
|
||||
+any heros
|
||||
+updateFihgtHero(id) void
|
||||
+addHero(uuid) void
|
||||
}
|
||||
GameMap --> MapModelComp : "包含"
|
||||
GameMap --> MapViewComp : "包含"
|
||||
MapViewComp --> MapViewScene : "使用"
|
||||
SingletonModuleComp --> GameMap : "管理"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L9-L43)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L14-L36)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L14-L45)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L17-L77)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### MapModelComp组件深度分析
|
||||
|
||||
#### 组件注册与继承
|
||||
|
||||
MapModelComp通过`@ecs.register('MapModel')`装饰器注册到ECS系统中,继承自ecs.Comp基类,具备以下特性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant ECS as "ECS系统"
|
||||
participant Comp as "MapModelComp"
|
||||
participant Entity as "GameMap实体"
|
||||
ECS->>Comp : 注册组件
|
||||
Entity->>Comp : 创建实例
|
||||
Comp->>Comp : 初始化默认属性
|
||||
Entity->>Comp : 添加到实体
|
||||
Comp->>ECS : 准备就绪
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L8-L9)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L20-L22)
|
||||
|
||||
#### 资源管理策略
|
||||
|
||||
组件提供了灵活的资源管理机制:
|
||||
|
||||
1. **预制体资源**:`resPrefab`属性指向地图显示预制体
|
||||
2. **注释方法**:预留了多种资源获取方法(迷你地图、瓦片、数据资源)
|
||||
3. **默认配置**:提供合理的默认值,确保系统正常运行
|
||||
|
||||
#### 生命周期管理
|
||||
|
||||
reset()方法为空实现,为未来的扩展预留空间。
|
||||
|
||||
**章节来源**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L9-L43)
|
||||
|
||||
### GameMap实体分析
|
||||
|
||||
#### 实体生命周期
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[GameMap创建] --> B[init方法调用]
|
||||
B --> C[添加MapModelComp组件]
|
||||
C --> D[load方法调用]
|
||||
D --> E[异步加载资源]
|
||||
E --> F[实例化预制体]
|
||||
F --> G[添加MapView组件]
|
||||
G --> H[地图加载完成]
|
||||
E --> I[错误处理]
|
||||
I --> J[控制台输出错误]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L20-L36)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L36-L42)
|
||||
|
||||
#### 资源加载机制
|
||||
|
||||
load()方法实现了异步资源加载,包括:
|
||||
1. **资源验证**:检查加载结果
|
||||
2. **实例化**:创建地图实例
|
||||
3. **层级设置**:设置父节点关系
|
||||
4. **组件添加**:添加地图视图组件
|
||||
|
||||
**章节来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L24-L36)
|
||||
|
||||
### 地图视图系统
|
||||
|
||||
#### 组件层次结构
|
||||
|
||||
MapViewComp和MapViewScene构成了完整的地图视图系统:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[MapViewComp] --> B[MapViewScene]
|
||||
B --> C[Camera]
|
||||
B --> D[MapLayer]
|
||||
B --> E[EntityLayer]
|
||||
B --> F[SkillLayer]
|
||||
D --> G[背景图片]
|
||||
E --> H[游戏实体]
|
||||
F --> I[技能效果]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L14-L45)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L17-L77)
|
||||
|
||||
**章节来源**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L14-L45)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L17-L77)
|
||||
|
||||
## 数据结构分析
|
||||
|
||||
### map.json - 地图基本信息配置
|
||||
|
||||
map.json文件定义了地图的基本信息和关联关系:
|
||||
|
||||
#### 配置结构
|
||||
|
||||
| 字段 | 类型 | 描述 | 示例值 |
|
||||
|------|------|------|--------|
|
||||
| id | number | 地图唯一标识符 | 1, 2, 3... |
|
||||
| name | string | 地图资源名称 | "img_map3", "img_map15" |
|
||||
| delivery | string | 可跳转的连接点列表 | "1,2", "3,4" |
|
||||
|
||||
#### 数据示例分析
|
||||
|
||||
根据现有配置:
|
||||
- 地图1(ID:1)关联连接点1和2
|
||||
- 地图2(ID:2)关联连接点3和4
|
||||
|
||||
这种设计允许:
|
||||
1. **多路径跳转**:一个地图可以有多个出口
|
||||
2. **动态配置**:通过修改JSON文件即可调整地图关系
|
||||
3. **解耦设计**:地图逻辑与配置分离
|
||||
|
||||
**章节来源**
|
||||
- [map.json](file://assets/resources/config/map/map.json#L1-L12)
|
||||
|
||||
### map_delivery.json - 地图连接点配置
|
||||
|
||||
map_delivery.json定义了具体的跳转连接点信息:
|
||||
|
||||
#### 完整配置结构
|
||||
|
||||
| 字段 | 类型 | 描述 | 示例值 |
|
||||
|------|------|------|--------|
|
||||
| id | number | 连接点唯一标识 | 1, 2, 3... |
|
||||
| mapId | number | 当前地图ID | 1, 2 |
|
||||
| pos | string | 连接点坐标 | "19,267" |
|
||||
| toMapId | number | 目标地图ID | 2, 5, 3, 1 |
|
||||
| start | string | 出生点坐标 | "66,237" |
|
||||
|
||||
#### 数据流分析
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[用户点击连接点] --> B[读取map_delivery.json]
|
||||
B --> C[获取目标地图ID]
|
||||
C --> D[获取出生点坐标]
|
||||
D --> E[切换到目标地图]
|
||||
E --> F[设置玩家位置]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json#L1-L30)
|
||||
|
||||
**章节来源**
|
||||
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json#L1-L30)
|
||||
|
||||
## ECS初始化流程
|
||||
|
||||
### 系统启动序列
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant App as "应用程序"
|
||||
participant SM as "SingletonModule"
|
||||
participant LM as "LoadingView"
|
||||
participant GM as "GameMap"
|
||||
participant MM as "MapModel"
|
||||
App->>SM : 初始化单例模块
|
||||
SM->>GM : 创建GameMap实体
|
||||
GM->>MM : 添加MapModel组件
|
||||
MM->>MM : 初始化默认状态
|
||||
SM->>LM : 开始加载界面
|
||||
LM->>GM : 调用load()方法
|
||||
GM->>GM : 异步加载资源
|
||||
GM->>SM : 设置smc.map引用
|
||||
SM->>App : 启动游戏主界面
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L36-L42)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts#L25-L26)
|
||||
|
||||
### 组件注册机制
|
||||
|
||||
ECS框架通过装饰器模式实现组件注册:
|
||||
|
||||
1. **MapModelComp注册**:`@ecs.register('MapModel')`
|
||||
2. **GameMap注册**:`@ecs.register('GameMap')`
|
||||
3. **MapViewComp注册**:`@ecs.register('MapView', false)`
|
||||
|
||||
这种设计确保了:
|
||||
- **自动发现**:ECS系统自动识别和管理组件
|
||||
- **类型安全**:编译时类型检查
|
||||
- **性能优化**:避免运行时反射开销
|
||||
|
||||
**章节来源**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L8-L9)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L14-L15)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L36-L42)
|
||||
|
||||
## 地图跳转逻辑
|
||||
|
||||
### 跳转流程设计
|
||||
|
||||
地图跳转是一个复杂的多阶段过程:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[检测到跳转请求] --> B[验证连接点有效性]
|
||||
B --> C{连接点存在?}
|
||||
C --> |否| D[显示错误信息]
|
||||
C --> |是| E[读取连接点配置]
|
||||
E --> F[获取目标地图ID]
|
||||
F --> G[获取出生点坐标]
|
||||
G --> H[清理当前地图资源]
|
||||
H --> I[加载目标地图]
|
||||
I --> J[设置玩家位置]
|
||||
J --> K[更新地图状态]
|
||||
K --> L[触发相关事件]
|
||||
```
|
||||
|
||||
### 多路径跳转实现
|
||||
|
||||
通过map.json中的delivery字段实现多路径跳转:
|
||||
|
||||
1. **配置解析**:将"1,2"字符串解析为数组
|
||||
2. **连接点匹配**:根据用户选择确定具体跳转路径
|
||||
3. **动态路由**:支持运行时修改跳转关系
|
||||
|
||||
### 地图解锁条件
|
||||
|
||||
虽然当前实现中没有显式的解锁条件,但可以通过以下方式扩展:
|
||||
|
||||
1. **成就系统**:完成特定任务后解锁新地图
|
||||
2. **等级要求**:达到一定等级才能访问高级地图
|
||||
3. **前置条件**:需要完成特定关卡才能解锁
|
||||
|
||||
**章节来源**
|
||||
- [map.json](file://assets/resources/config/map/map.json#L2-L11)
|
||||
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json#L1-L30)
|
||||
|
||||
## 数据驱动设计
|
||||
|
||||
### 配置文件的作用
|
||||
|
||||
数据驱动设计的核心优势:
|
||||
|
||||
1. **灵活性**:无需修改代码即可调整地图配置
|
||||
2. **可维护性**:配置与逻辑分离,便于维护
|
||||
3. **可扩展性**:支持动态添加新地图和连接点
|
||||
4. **版本控制**:配置文件易于版本管理和协作
|
||||
|
||||
### 动态配置加载
|
||||
|
||||
系统支持运行时加载配置:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[JSON配置文件] --> B[oops.res.load]
|
||||
B --> C[解析JSON数据]
|
||||
C --> D[构建地图配置对象]
|
||||
D --> E[应用到地图系统]
|
||||
```
|
||||
|
||||
### 配置验证机制
|
||||
|
||||
为了确保配置的正确性,系统应该包含:
|
||||
|
||||
1. **格式验证**:检查JSON语法正确性
|
||||
2. **完整性检查**:验证必需字段的存在
|
||||
3. **一致性验证**:确保地图ID和连接点ID的一致性
|
||||
4. **边界检查**:验证坐标值的有效范围
|
||||
|
||||
**章节来源**
|
||||
- [map.json](file://assets/resources/config/map/map.json#L1-L12)
|
||||
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json#L1-L30)
|
||||
|
||||
## 最佳实践
|
||||
|
||||
### 地图配置最佳实践
|
||||
|
||||
#### 新地图添加流程
|
||||
|
||||
1. **创建地图资源**:准备地图图像和相关资源
|
||||
2. **更新map.json**:添加新的地图条目
|
||||
3. **配置连接点**:在map_delivery.json中添加对应的连接点
|
||||
4. **测试验证**:确保跳转逻辑正确
|
||||
|
||||
#### 配置示例
|
||||
|
||||
```json
|
||||
{
|
||||
"3": {
|
||||
"id": 3,
|
||||
"name": "img_map_new",
|
||||
"delivery": "5,6"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"5": {
|
||||
"id": 5,
|
||||
"mapId": 3,
|
||||
"pos": "30,40",
|
||||
"toMapId": 1,
|
||||
"start": "15,25"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 性能优化建议
|
||||
|
||||
1. **资源预加载**:提前加载常用地图资源
|
||||
2. **延迟加载**:对于不常用的地图采用按需加载
|
||||
3. **内存管理**:及时释放不再使用的地图资源
|
||||
4. **缓存策略**:缓存频繁访问的地图配置
|
||||
|
||||
### 错误处理策略
|
||||
|
||||
1. **配置缺失**:提供默认配置或友好的错误提示
|
||||
2. **资源加载失败**:实现资源降级方案
|
||||
3. **跳转失败**:提供重试机制或备用路径
|
||||
4. **数据损坏**:实现配置文件的备份和恢复
|
||||
|
||||
## 总结
|
||||
|
||||
MapModelComp组件作为地图系统的核心数据层,成功地实现了以下目标:
|
||||
|
||||
### 技术亮点
|
||||
|
||||
1. **ECS架构**:采用现代的游戏开发模式,实现了良好的解耦
|
||||
2. **数据驱动**:通过JSON配置文件实现了灵活的地图管理
|
||||
3. **资源管理**:提供了完整的资源生命周期管理
|
||||
4. **扩展性**:预留了丰富的扩展点和优化空间
|
||||
|
||||
### 设计优势
|
||||
|
||||
1. **模块化**:各组件职责明确,便于维护和扩展
|
||||
2. **可配置性**:通过配置文件即可调整地图逻辑
|
||||
3. **性能优化**:支持异步加载和资源管理
|
||||
4. **错误处理**:内置了基本的错误处理机制
|
||||
|
||||
### 应用价值
|
||||
|
||||
该设计为游戏开发提供了:
|
||||
- **快速迭代**:通过配置即可实现地图逻辑变更
|
||||
- **团队协作**:策划人员可以直接编辑配置文件
|
||||
- **跨平台支持**:基于Cocos引擎,支持多平台部署
|
||||
- **未来扩展**:为后续的功能扩展奠定了良好基础
|
||||
|
||||
通过深入理解MapModelComp的设计理念和实现细节,开发者可以更好地利用这一组件,构建更加复杂和有趣的游戏世界。
|
||||
408
.qoder/repowiki/zh/content/地图系统/地图系统.md
Normal file
408
.qoder/repowiki/zh/content/地图系统/地图系统.md
Normal file
@@ -0,0 +1,408 @@
|
||||
# 地图系统
|
||||
|
||||
<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)
|
||||
- [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)
|
||||
- [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)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
本文档详尽描述了基于Cocos引擎的《英雄》游戏项目中地图系统的整体架构与运行机制。系统涵盖关卡设计、怪物生成、战斗区域管理及视图渲染等核心功能。通过分析`GameMap.ts`中的地图主控制器职责,结合`RogueConfig.ts`解释随机关卡生成逻辑,深入剖析`Mon.ts`中怪物实体的设计模式及其与英雄的交互方式。同时,阐述`MapModelComp.ts`与`MapViewComp.ts`如何实现数据与表现层的分离,并结合`map.json`和`map_delivery.json`配置文件说明地图数据结构与关卡参数定义。最后,提供实例说明如何添加新关卡、配置怪物波次及实现战斗区域判定。
|
||||
|
||||
## 项目结构
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "Assets"
|
||||
subgraph "resources"
|
||||
subgraph "config"
|
||||
subgraph "map"
|
||||
map_json["map.json"]
|
||||
map_delivery_json["map_delivery.json"]
|
||||
end
|
||||
end
|
||||
end
|
||||
subgraph "script"
|
||||
subgraph "game"
|
||||
subgraph "map"
|
||||
GameMap_ts["GameMap.ts"]
|
||||
RogueConfig_ts["RogueConfig.ts"]
|
||||
MissionMonComp_ts["MissionMonComp.ts"]
|
||||
subgraph "model"
|
||||
MapModelComp_ts["MapModelComp.ts"]
|
||||
end
|
||||
subgraph "view"
|
||||
MapViewComp_ts["MapViewComp.ts"]
|
||||
MapViewScene_ts["MapViewScene.ts"]
|
||||
subgraph "layer"
|
||||
MapLayer_ts["MapLayer.ts"]
|
||||
EntityLayer_ts["EntityLayer.ts"]
|
||||
SkillLayer_ts["SkillLayer.ts"]
|
||||
end
|
||||
end
|
||||
end
|
||||
subgraph "hero"
|
||||
Mon_ts["Mon.ts"]
|
||||
MonModelComp_ts["MonModelComp.ts"]
|
||||
end
|
||||
subgraph "common"
|
||||
subgraph "config"
|
||||
heroSet_ts["heroSet.ts"]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [map.json](file://assets/resources/config/map/map.json)
|
||||
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts)
|
||||
|
||||
**本节来源**
|
||||
- [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)
|
||||
- [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)
|
||||
|
||||
## 核心组件
|
||||
|
||||
地图系统的核心由多个组件构成,实现了数据与逻辑的分离。`GameMap`作为地图主控制器,负责协调地图模型与视图。`MapModelComp`封装了地图的静态数据,如初始地图ID和资源路径。`MapViewComp`则负责地图的显示逻辑,通过`MapViewScene`管理地图层、实体层和技能层。`RogueConfig.ts`定义了随机关卡的生成规则,包括怪物类型、数量和强度的动态调整。`Mon.ts`实现了怪物实体的加载与初始化,支持根据关卡进度调整属性强度。
|
||||
|
||||
**本节来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L35)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L42)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L44)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L310)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L108)
|
||||
|
||||
## 架构概述
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class GameMap {
|
||||
+MapModel : MapModelComp
|
||||
+MapView : MapViewComp
|
||||
+init() : void
|
||||
+load() : void
|
||||
}
|
||||
class MapModelComp {
|
||||
+id : number
|
||||
+resPrefab : string
|
||||
+reset() : void
|
||||
}
|
||||
class MapViewComp {
|
||||
+scene : MapViewScene
|
||||
+game_timer : Timer
|
||||
+onLoad() : void
|
||||
+start() : void
|
||||
+reset() : void
|
||||
+update(dt : number) : void
|
||||
}
|
||||
class MapViewScene {
|
||||
+camera : Camera
|
||||
+layer : Node
|
||||
+mapLayer : MapLayer
|
||||
+floorLayer : Node
|
||||
+entityLayer : EntityLayer
|
||||
+SkillLayer : SkillLayer
|
||||
+isFollowPlayer : boolean
|
||||
+ratio : Vec2
|
||||
+onLoad() : void
|
||||
+start() : void
|
||||
+reset() : void
|
||||
+init() : void
|
||||
+update(dt : number) : void
|
||||
}
|
||||
class MapLayer {
|
||||
+bgImg : Sprite
|
||||
+init() : void
|
||||
+clear() : void
|
||||
+bgImage : Sprite
|
||||
+width : number
|
||||
+height : number
|
||||
}
|
||||
class EntityLayer {
|
||||
+timer : Timer
|
||||
+update(dt : number) : void
|
||||
+start() : void
|
||||
+clear() : void
|
||||
}
|
||||
class SkillLayer {
|
||||
+timer : Timer
|
||||
+light : Prefab
|
||||
+onLoad() : void
|
||||
+doSkill() : void
|
||||
+update(dt : number) : void
|
||||
+start() : void
|
||||
+clear() : void
|
||||
}
|
||||
GameMap --> MapModelComp : "包含"
|
||||
GameMap --> MapViewComp : "包含"
|
||||
MapViewComp --> MapViewScene : "引用"
|
||||
MapViewScene --> MapLayer : "引用"
|
||||
MapViewScene --> EntityLayer : "引用"
|
||||
MapViewScene --> SkillLayer : "引用"
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L35)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L42)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L44)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L76)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L46)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L38)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L1-L47)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 地图主控制器分析
|
||||
|
||||
`GameMap`类是地图系统的主控制器,使用ECS(实体-组件-系统)架构模式。它继承自`ecs.Entity`,并注册为`GameMap`实体。该类包含两个核心组件:`MapModel`(数据模型)和`MapView`(视图组件)。`init`方法在实体初始化时被调用,用于添加`MapModelComp`组件。`load`方法负责加载地图的显示资源,通过资源管理器异步加载地图预制件,并将其挂载到游戏根节点下,最后将地图视图组件添加到当前实体。
|
||||
|
||||
#### 对象导向组件
|
||||
```mermaid
|
||||
classDiagram
|
||||
class GameMap {
|
||||
+MapModel : MapModelComp
|
||||
+MapView : MapViewComp
|
||||
+init() : void
|
||||
+load() : void
|
||||
}
|
||||
class MapModelComp {
|
||||
+id : number
|
||||
+resPrefab : string
|
||||
+reset() : void
|
||||
}
|
||||
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)
|
||||
|
||||
**本节来源**
|
||||
- [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`文件定义了随机关卡的生成规则。系统通过`getStageType`函数根据关卡号和等级决定关卡类型(普通、精英、Boss、事件)。`generateStageConfig`函数根据关卡类型生成怪物类型数组,`calculateMonsterCount`函数根据关卡进度动态调整怪物数量,`calculateMonsterStrengthMultiplier`函数计算怪物强度倍率。`getStageMonsterConfigs`函数综合以上逻辑,生成包含怪物UUID、类型和强度倍率的完整配置。
|
||||
|
||||
#### API/服务组件
|
||||
```mermaid
|
||||
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()
|
||||
MissionMonComp->>MissionMonComp : addToStageSpawnQueue()
|
||||
loop 每个怪物
|
||||
MissionMonComp->>MissionMonComp : spawnNextMonster()
|
||||
MissionMonComp->>Monster : load()
|
||||
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#L1-L310)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L239)
|
||||
|
||||
### 怪物实体设计模式分析
|
||||
|
||||
`Mon.ts`文件定义了`Monster`类,代表游戏中的怪物实体。该类同样基于ECS架构,包含`HeroModel`(模型组件)、`HeroView`(视图组件)和`BattleMove`(战斗移动组件)。`load`方法负责加载怪物的预制件并初始化其位置和属性。`hero_init`方法根据怪物UUID从`HeroInfo`配置中获取基础属性,并根据强度倍率进行调整。怪物的技能、属性和状态均在此方法中初始化。
|
||||
|
||||
#### 复杂逻辑组件
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([怪物加载]) --> Load["load(pos, scale, uuid, is_boss)"]
|
||||
Load --> GetPrefab["获取预制件路径"]
|
||||
GetPrefab --> Instantiate["实例化预制件"]
|
||||
Instantiate --> SetParent["设置父节点为entityLayer"]
|
||||
SetParent --> Init["调用hero_init初始化"]
|
||||
Init --> GetHeroInfo["从HeroInfo获取基础属性"]
|
||||
GetHeroInfo --> AdjustAttrs["根据strengthMultiplier调整属性"]
|
||||
AdjustAttrs --> InitSkills["初始化技能数组"]
|
||||
InitSkills --> AddComponent["将HeroViewComp添加到实体"]
|
||||
AddComponent --> SetMove["设置BattleMove参数"]
|
||||
SetMove --> Dispatch["派发monster_load事件"]
|
||||
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#L1-L108)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L151)
|
||||
|
||||
### 数据与表现层分离分析
|
||||
|
||||
地图系统严格遵循MVC(模型-视图-控制器)设计模式,实现了数据与表现的分离。`MapModelComp`作为模型层,仅负责存储地图的静态数据,如地图ID和资源路径。`MapViewComp`作为视图层,负责地图的显示和用户交互。`MapViewScene`作为视图的具体实现,管理地图的各个显示层(背景层、实体层、技能层)。这种分离使得数据逻辑与显示逻辑解耦,提高了代码的可维护性和可测试性。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MapModelComp {
|
||||
+id : number
|
||||
+resPrefab : string
|
||||
}
|
||||
class MapViewComp {
|
||||
+scene : MapViewScene
|
||||
}
|
||||
class MapViewScene {
|
||||
+mapLayer : MapLayer
|
||||
+entityLayer : EntityLayer
|
||||
+SkillLayer : SkillLayer
|
||||
}
|
||||
MapModelComp --> MapViewComp : "数据驱动"
|
||||
MapViewComp --> MapViewScene : "控制"
|
||||
MapViewScene --> MapLayer : "显示"
|
||||
MapViewScene --> EntityLayer : "显示"
|
||||
MapViewScene --> SkillLayer : "显示"
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L42)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L44)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L76)
|
||||
|
||||
**本节来源**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L42)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L44)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L76)
|
||||
|
||||
### 地图数据结构与关卡参数分析
|
||||
|
||||
地图数据由两个JSON文件定义:`map.json`和`map_delivery.json`。`map.json`定义了地图的基本信息,包括地图ID、名称和转场点。`map_delivery.json`定义了地图转场的具体参数,包括转场点ID、所在地图ID、触发位置、目标地图ID和目标地图的起始位置。这种设计支持非线性关卡流程,玩家可以通过不同的转场点进入不同的地图。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
MAP {
|
||||
string id PK
|
||||
string name
|
||||
string delivery
|
||||
}
|
||||
MAP_DELIVERY {
|
||||
string id PK
|
||||
string mapId FK
|
||||
string pos
|
||||
string toMapId
|
||||
string start
|
||||
}
|
||||
MAP ||--o{ MAP_DELIVERY : "包含"
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [map.json](file://assets/resources/config/map/map.json#L1-L11)
|
||||
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json#L1-L29)
|
||||
|
||||
**本节来源**
|
||||
- [map.json](file://assets/resources/config/map/map.json#L1-L11)
|
||||
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json#L1-L29)
|
||||
|
||||
## 依赖分析
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
GameMap_ts --> MapModelComp_ts
|
||||
GameMap_ts --> MapViewComp_ts
|
||||
MapViewComp_ts --> MapViewScene_ts
|
||||
MapViewScene_ts --> MapLayer_ts
|
||||
MapViewScene_ts --> EntityLayer_ts
|
||||
MapViewScene_ts --> SkillLayer_ts
|
||||
MissionMonComp_ts --> RogueConfig_ts
|
||||
MissionMonComp_ts --> Mon_ts
|
||||
Mon_ts --> heroSet_ts
|
||||
RogueConfig_ts --> heroSet_ts
|
||||
```
|
||||
|
||||
**图示来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L35)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L42)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L44)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L76)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L46)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L38)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L1-L47)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L239)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L310)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L108)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L151)
|
||||
|
||||
**本节来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L35)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L42)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L44)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L76)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L46)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L38)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L1-L47)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L239)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L310)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L108)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L151)
|
||||
|
||||
## 性能考虑
|
||||
地图系统在性能方面进行了合理的设计。视图层的更新通过`update`方法每帧执行,但关键的实体排序逻辑被注释,表明开发者意识到性能问题并考虑优化。怪物生成采用队列机制,通过`spawnInterval`控制生成频率,避免一次性生成过多怪物导致性能骤降。地图资源采用异步加载,防止主线程阻塞。建议进一步优化实体层的深度排序,考虑使用空间分区或仅在必要时排序。
|
||||
|
||||
## 故障排除指南
|
||||
- **地图无法加载**:检查`MapModelComp`中的`resPrefab`路径是否正确,确保预制件存在于资源目录中。
|
||||
- **怪物未生成**:确认`MissionMonComp`是否监听了`FightReady`事件,检查`monsterQueue`是否正确填充。
|
||||
- **属性未按倍率调整**:确保`Mon.ts`中的`hero_init`方法正确接收并应用`strengthMultiplier`参数。
|
||||
- **转场无效**:验证`map_delivery.json`中的`pos`和`start`坐标格式是否正确,确保触发位置与玩家位置匹配。
|
||||
|
||||
**本节来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L35)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L239)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L108)
|
||||
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json#L1-L29)
|
||||
|
||||
## 结论
|
||||
本文档全面分析了Cocos游戏项目中的地图系统架构。系统采用ECS和MVC设计模式,实现了良好的代码分离和可扩展性。随机关卡生成逻辑灵活,支持动态调整怪物数量和强度。数据与表现层分离清晰,便于维护和迭代。通过合理使用配置文件,实现了关卡数据的外部化管理。整体架构设计合理,为游戏的长期发展奠定了坚实基础。
|
||||
383
.qoder/repowiki/zh/content/地图系统/地图视图/地图图层管理/光照效果实现.md
Normal file
383
.qoder/repowiki/zh/content/地图系统/地图视图/地图图层管理/光照效果实现.md
Normal file
@@ -0,0 +1,383 @@
|
||||
# 光照效果实现
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [light.ts](file://assets/script/game/map/view/map/layer/light.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [FlashSprite.ts](file://assets/script/game/map/FlashSprite.ts)
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts)
|
||||
- [map.json](file://assets/resources/config/map/map.json)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [项目概述](#项目概述)
|
||||
2. [光照效果架构](#光照效果架构)
|
||||
3. [核心组件分析](#核心组件分析)
|
||||
4. [遮罩层实现方案](#遮罩层实现方案)
|
||||
5. [后处理效果实现](#后处理效果实现)
|
||||
6. [视野范围控制机制](#视野范围控制机制)
|
||||
7. [地图分块加载联动](#地图分块加载联动)
|
||||
8. [性能优化与适配](#性能优化与适配)
|
||||
9. [高级视觉效果扩展](#高级视觉效果扩展)
|
||||
10. [最佳实践建议](#最佳实践建议)
|
||||
|
||||
## 项目概述
|
||||
|
||||
本项目是一个基于Cocos Creator的游戏,采用ECS架构设计,实现了肉鸽游戏风格的迷雾探索玩法。光照效果作为核心视觉系统的重要组成部分,负责控制玩家视野范围,营造神秘感和探索氛围。
|
||||
|
||||
### 技术栈特点
|
||||
- **引擎版本**: Cocos Creator
|
||||
- **架构模式**: ECS(Entity-Component-System)
|
||||
- **渲染技术**: 支持多种光照实现方案
|
||||
- **性能考量**: 针对移动端优化的设计
|
||||
|
||||
## 光照效果架构
|
||||
|
||||
光照效果系统采用分层架构设计,包含以下核心层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "光照效果系统架构"
|
||||
A[光照控制器] --> B[遮罩层管理器]
|
||||
A --> C[后处理效果处理器]
|
||||
B --> D[灰度图遮罩]
|
||||
B --> E[透明度渐变遮罩]
|
||||
C --> F[Shader处理]
|
||||
C --> G[SpriteMask处理]
|
||||
H[地图分块系统] --> A
|
||||
I[玩家位置系统] --> A
|
||||
J[相机跟随系统] --> A
|
||||
end
|
||||
subgraph "渲染管线"
|
||||
K[主摄像机] --> L[光照遮罩层]
|
||||
L --> M[游戏场景层]
|
||||
M --> N[UI层]
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [light.ts](file://assets/script/game/map/view/map/layer/light.ts#L1-L18)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
|
||||
## 核心组件分析
|
||||
|
||||
### 基础光照组件
|
||||
|
||||
当前项目中的基础光照组件位于[`light.ts`](file://assets/script/game/map/view/map/layer/light.ts#L1-L18),虽然目前处于空壳状态,但为未来的功能扩展预留了接口。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class LightComponent {
|
||||
+start() void
|
||||
+onLoad() void
|
||||
+update(deltaTime) void
|
||||
+createFogMask() Mask
|
||||
+updateVisibility(playerPos) void
|
||||
+applyShaderEffect() void
|
||||
}
|
||||
class MapViewScene {
|
||||
+camera Camera
|
||||
+layer Node
|
||||
+mapLayer MapLayer
|
||||
+entityLayer EntityLayer
|
||||
+isFollowPlayer boolean
|
||||
+ratio Vec2
|
||||
+init() void
|
||||
+update(dt) void
|
||||
}
|
||||
class MapLayer {
|
||||
+bgImg Sprite
|
||||
+init() void
|
||||
+clear() void
|
||||
+bgImage Sprite
|
||||
+width number
|
||||
+height number
|
||||
}
|
||||
LightComponent --> MapViewScene : "控制"
|
||||
MapViewScene --> MapLayer : "管理"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [light.ts](file://assets/script/game/map/view/map/layer/light.ts#L4-L18)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L15-L45)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L15-L46)
|
||||
|
||||
**章节来源**
|
||||
- [light.ts](file://assets/script/game/map/view/map/layer/light.ts#L1-L18)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L47)
|
||||
|
||||
### 地图视图管理系统
|
||||
|
||||
地图视图系统负责整体场景的渲染管理和光照效果的协调工作:
|
||||
|
||||
- **摄像机控制**: 实现玩家跟随和视野限制
|
||||
- **层级管理**: 确保光照效果正确叠加在游戏场景之上
|
||||
- **渲染优化**: 通过分层渲染减少不必要的绘制调用
|
||||
|
||||
**章节来源**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L15-L77)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L45)
|
||||
|
||||
## 遮罩层实现方案
|
||||
|
||||
### 方案一:灰度图遮罩层
|
||||
|
||||
灰度图遮罩是最经典的迷雾效果实现方式,通过调整纹理的灰度值来控制可见性。
|
||||
|
||||
#### 实现原理
|
||||
1. **纹理准备**: 使用黑白灰度图定义可见区域
|
||||
2. **Alpha混合**: 通过Shader实现灰度值到透明度的映射
|
||||
3. **动态更新**: 根据玩家位置实时更新遮罩纹理
|
||||
|
||||
#### 技术优势
|
||||
- **性能优异**: GPU原生支持,计算开销小
|
||||
- **视觉效果好**: 自然的渐变过渡
|
||||
- **易于调试**: 可直接编辑遮罩纹理
|
||||
|
||||
### 方案二:透明度渐变遮罩
|
||||
|
||||
基于透明度渐变的遮罩实现,适合需要复杂视觉效果的场景。
|
||||
|
||||
#### 实现特点
|
||||
- **渐变控制**: 支持多种渐变模式(圆形、矩形、不规则形状)
|
||||
- **多光源支持**: 可同时处理多个光源的遮罩效果
|
||||
- **边缘平滑**: 提供高质量的边缘处理
|
||||
|
||||
**章节来源**
|
||||
- [FlashSprite.ts](file://assets/script/game/map/FlashSprite.ts#L1-L28)
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L1-L49)
|
||||
|
||||
## 后处理效果实现
|
||||
|
||||
### Shader-Based光照效果
|
||||
|
||||
基于Shader的后处理效果提供了最灵活的光照控制能力:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as 玩家位置
|
||||
participant System as 光照系统
|
||||
participant Shader as Shader处理器
|
||||
participant Render as 渲染管线
|
||||
Player->>System : 位置更新
|
||||
System->>System : 计算视野范围
|
||||
System->>Shader : 传递参数
|
||||
Shader->>Shader : 执行光照计算
|
||||
Shader->>Render : 输出处理结果
|
||||
Render->>Player : 显示最终画面
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L198-L235)
|
||||
|
||||
#### Shader实现要点
|
||||
1. **顶点着色器**: 处理几何变换和光照坐标计算
|
||||
2. **片段着色器**: 实现复杂的光照算法和遮罩效果
|
||||
3. **纹理采样**: 优化纹理访问模式,减少带宽消耗
|
||||
|
||||
### SpriteMask实现方案
|
||||
|
||||
SpriteMask是一种轻量级的遮罩实现方式:
|
||||
|
||||
#### 优势特点
|
||||
- **简单易用**: 不需要编写Shader代码
|
||||
- **兼容性强**: 支持所有平台和设备
|
||||
- **调试方便**: 可直接在编辑器中预览效果
|
||||
|
||||
#### 适用场景
|
||||
- 移动设备优化
|
||||
- 快速原型开发
|
||||
- 简单的遮罩需求
|
||||
|
||||
**章节来源**
|
||||
- [FlashSprite.ts](file://assets/script/game/map/FlashSprite.ts#L15-L28)
|
||||
|
||||
## 视野范围控制机制
|
||||
|
||||
### 动态视野算法
|
||||
|
||||
视野范围控制是光照效果的核心功能,其实现涉及多个方面的协调:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[玩家位置检测] --> B{视野类型判断}
|
||||
B --> |静态视野| C[固定半径遮罩]
|
||||
B --> |动态视野| D[渐进式展开]
|
||||
B --> |追踪视野| E[跟随玩家移动]
|
||||
C --> F[遮罩纹理更新]
|
||||
D --> F
|
||||
E --> F
|
||||
F --> G[性能优化检查]
|
||||
G --> H{性能阈值}
|
||||
H --> |正常| I[应用最终效果]
|
||||
H --> |过载| J[降级处理]
|
||||
I --> K[渲染输出]
|
||||
J --> L[简化效果]
|
||||
L --> K
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L198-L262)
|
||||
|
||||
### 视野参数配置
|
||||
|
||||
| 参数名称 | 类型 | 默认值 | 说明 |
|
||||
|---------|------|--------|------|
|
||||
| 视野半径 | number | 300 | 玩家周围可见范围半径 |
|
||||
| 渐变强度 | number | 0.8 | 遮罩边缘的模糊程度 |
|
||||
| 更新频率 | number | 0.1s | 视野更新的时间间隔 |
|
||||
| 最大遮罩数量 | number | 4 | 同时存在的遮罩层数 |
|
||||
|
||||
**章节来源**
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L198-L262)
|
||||
|
||||
## 地图分块加载联动
|
||||
|
||||
### 分块加载机制
|
||||
|
||||
地图分块加载与光照效果的联动确保了游戏性能和视觉体验的平衡:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "地图分块系统"
|
||||
A[当前区块] --> B[已加载区域]
|
||||
C[相邻区块] --> D[预加载区域]
|
||||
E[远处区块] --> F[未加载区域]
|
||||
end
|
||||
subgraph "光照效果系统"
|
||||
G[视野中心] --> H[光照遮罩]
|
||||
H --> I[动态更新]
|
||||
I --> J[性能优化]
|
||||
end
|
||||
B --> H
|
||||
D --> H
|
||||
F -.-> H
|
||||
subgraph "联动逻辑"
|
||||
K[区块加载] --> L[光照初始化]
|
||||
M[区块卸载] --> N[光照清理]
|
||||
O[玩家移动] --> P[区块切换]
|
||||
P --> Q[光照重定位]
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L45)
|
||||
|
||||
### 动态更新策略
|
||||
|
||||
1. **渐进式加载**: 当玩家接近新区域时逐步加载光照数据
|
||||
2. **内存管理**: 及时释放远离玩家区域的光照资源
|
||||
3. **同步机制**: 确保光照效果与地图加载状态保持一致
|
||||
|
||||
**章节来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L20-L36)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L15-L45)
|
||||
|
||||
## 性能优化与适配
|
||||
|
||||
### 性能对比分析
|
||||
|
||||
| 实现方案 | CPU开销 | GPU开销 | 内存占用 | 兼容性 | 推荐场景 |
|
||||
|---------|---------|---------|----------|--------|----------|
|
||||
| Shader遮罩 | 低 | 中等 | 中等 | 高 | PC端、高端设备 |
|
||||
| SpriteMask | 中等 | 低 | 低 | 极高 | 移动端、低端设备 |
|
||||
| 后处理效果 | 中等 | 高 | 高 | 中等 | 主流设备 |
|
||||
|
||||
### 适配策略
|
||||
|
||||
#### 移动端优化
|
||||
- **降低分辨率**: 减少光照纹理的分辨率
|
||||
- **简化算法**: 使用更简单的遮罩算法
|
||||
- **帧率控制**: 动态调整光照更新频率
|
||||
|
||||
#### 高端设备优化
|
||||
- **增强效果**: 使用高质量的Shader和纹理
|
||||
- **多光源**: 支持复杂的多光源叠加效果
|
||||
- **实时阴影**: 实现动态阴影投射
|
||||
|
||||
**章节来源**
|
||||
- [FlashSprite.ts](file://assets/script/game/map/FlashSprite.ts#L1-L28)
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L1-L49)
|
||||
|
||||
## 高级视觉效果扩展
|
||||
|
||||
### 多光源叠加系统
|
||||
|
||||
扩展光照系统以支持多个光源的同时作用:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MultiLightSystem {
|
||||
+lights LightSource[]
|
||||
+addLight(source) void
|
||||
+removeLight(id) void
|
||||
+updateLights() void
|
||||
+combineEffects() Texture
|
||||
}
|
||||
class LightSource {
|
||||
+position Vec2
|
||||
+radius number
|
||||
+color Color
|
||||
+intensity number
|
||||
+shape Shape
|
||||
+calculateEffect() Effect
|
||||
}
|
||||
class ShadowCaster {
|
||||
+castShadow(light) Texture
|
||||
+calculateDepthMap() Texture
|
||||
+applySoftShadows() Texture
|
||||
}
|
||||
MultiLightSystem --> LightSource : "管理"
|
||||
LightSource --> ShadowCaster : "产生"
|
||||
ShadowCaster --> MultiLightSystem : "贡献"
|
||||
```
|
||||
|
||||
### 动态阴影实现
|
||||
|
||||
动态阴影系统能够根据光源位置和物体高度产生真实的阴影效果:
|
||||
|
||||
#### 实现步骤
|
||||
1. **深度缓冲**: 创建专门的深度纹理存储场景深度信息
|
||||
2. **阴影映射**: 将光源视角下的深度信息投影到屏幕空间
|
||||
3. **软阴影**: 应用阴影过滤算法产生柔和的边缘效果
|
||||
|
||||
### 区域高亮效果
|
||||
|
||||
为重要区域(如宝箱、传送点)添加特殊的高亮效果:
|
||||
|
||||
#### 效果类型
|
||||
- **脉冲高亮**: 周期性闪烁的高亮效果
|
||||
- **追踪高亮**: 跟随目标移动的持续高亮
|
||||
- **交互高亮**: 响应玩家操作的即时高亮
|
||||
|
||||
**章节来源**
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L198-L262)
|
||||
|
||||
## 最佳实践建议
|
||||
|
||||
### 开发规范
|
||||
|
||||
1. **组件分离**: 将光照效果与业务逻辑完全分离
|
||||
2. **参数化设计**: 提供丰富的配置参数以便调整
|
||||
3. **性能监控**: 实现运行时性能指标收集
|
||||
|
||||
### 测试策略
|
||||
|
||||
1. **多设备测试**: 在不同硬件配置下验证效果
|
||||
2. **性能基准**: 建立性能基线用于回归测试
|
||||
3. **用户体验测试**: 确保光照效果不会影响游戏体验
|
||||
|
||||
### 维护建议
|
||||
|
||||
1. **文档更新**: 及时更新光照系统的使用文档
|
||||
2. **版本兼容**: 保持与引擎版本的兼容性
|
||||
3. **社区反馈**: 积极响应开发者社区的需求
|
||||
|
||||
通过以上架构设计和实现方案,本光照效果系统能够满足肉鸽游戏的迷雾探索需求,同时具备良好的扩展性和性能表现。开发者可以根据具体项目需求选择合适的实现方案,并在此基础上进行功能扩展和优化。
|
||||
272
.qoder/repowiki/zh/content/地图系统/地图视图/地图图层管理/地图图层管理.md
Normal file
272
.qoder/repowiki/zh/content/地图系统/地图视图/地图图层管理/地图图层管理.md
Normal file
@@ -0,0 +1,272 @@
|
||||
# 地图图层管理
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts)
|
||||
- [light.ts](file://assets/script/game/map/view/map/layer/light.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
本文档系统阐述了Cocos游戏项目中地图图层管理系统的实现机制。重点分析MapLayer作为背景图层的基础实现,EntityLayer如何承载动态实体并实现Z轴层级控制,SkillLayer在技能特效渲染中的作用,以及light.ts实现光照效果的潜在扩展方式。同时详细解析各图层继承Component的结构设计,展示图层间协作模式与节点组织策略,并提供新增自定义图层、优化图层渲染顺序与内存管理的最佳实践。
|
||||
|
||||
## 项目结构
|
||||
地图图层管理系统位于`assets/script/game/map/`目录下,采用MVC架构模式组织代码。系统分为模型层(model)、视图层(view)和控制器层,其中图层相关实现集中在view目录下的map/layer子目录中。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "地图系统"
|
||||
Model[模型层\nMapModelComp]
|
||||
View[视图层\nMapViewComp/MapViewScene]
|
||||
Layers[图层组件\nMapLayer/EntityLayer/SkillLayer]
|
||||
end
|
||||
Model --> View
|
||||
View --> Layers
|
||||
Layers --> CC[CC引擎组件\nSprite/Node/Camera]
|
||||
```
|
||||
|
||||
**图层来源**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L10)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L10)
|
||||
|
||||
**章节来源**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L80)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L50)
|
||||
|
||||
## 核心组件
|
||||
地图图层管理系统由四个核心图层组件构成:MapLayer负责背景渲染,EntityLayer管理动态实体,SkillLayer处理技能特效,light.ts提供光照效果扩展。这些组件均继承自CC引擎的Component类,通过节点树结构组织,形成分层渲染体系。
|
||||
|
||||
**章节来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L47)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L39)
|
||||
|
||||
## 架构概述
|
||||
地图图层系统采用分层架构设计,通过MapViewScene统一管理各图层组件的生命周期和交互逻辑。系统实现了数据与视图的分离,通过ECS架构模式管理游戏实体状态。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Component {
|
||||
<<abstract>>
|
||||
}
|
||||
class MapLayer {
|
||||
-bgImg : Sprite
|
||||
+init() : void
|
||||
+clear() : void
|
||||
+bgImage : Sprite
|
||||
+width : number
|
||||
+height : number
|
||||
}
|
||||
class EntityLayer {
|
||||
-timer : Timer
|
||||
+update(dt : number)
|
||||
+clear() : void
|
||||
}
|
||||
class SkillLayer {
|
||||
-timer : Timer
|
||||
-light : Prefab
|
||||
+doSkill() : void
|
||||
+clear() : void
|
||||
}
|
||||
class light {
|
||||
+start() : void
|
||||
+onLoad() : void
|
||||
+update(deltaTime : number) : void
|
||||
}
|
||||
class MapViewScene {
|
||||
-camera : Camera
|
||||
-mapLayer : MapLayer
|
||||
-entityLayer : EntityLayer
|
||||
-SkillLayer : SkillLayer
|
||||
+init() : void
|
||||
+reset() : void
|
||||
}
|
||||
Component <|-- MapLayer
|
||||
Component <|-- EntityLayer
|
||||
Component <|-- SkillLayer
|
||||
Component <|-- light
|
||||
MapViewScene --> MapLayer
|
||||
MapViewScene --> EntityLayer
|
||||
MapViewScene --> SkillLayer
|
||||
```
|
||||
|
||||
**图层来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L47)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L39)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L1-L48)
|
||||
- [light.ts](file://assets/script/game/map/view/map/layer/light.ts#L1-L20)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### MapLayer分析
|
||||
MapLayer组件作为地图的背景图层,负责初始化纹理、适配尺寸和管理精灵帧。通过Sprite组件实现背景图像的渲染,利用UITransform组件控制图层尺寸。
|
||||
|
||||
#### 类图
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MapLayer {
|
||||
-bgImg : Sprite
|
||||
+init() : void
|
||||
+clear() : void
|
||||
+bgImage : Sprite
|
||||
+width : number
|
||||
+height : number
|
||||
}
|
||||
class Sprite {
|
||||
-spriteFrame : SpriteFrame
|
||||
-texture : Texture2D
|
||||
}
|
||||
class UITransform {
|
||||
-width : number
|
||||
-height : number
|
||||
}
|
||||
MapLayer --> Sprite : "包含"
|
||||
MapLayer --> UITransform : "使用"
|
||||
```
|
||||
|
||||
**图层来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L15-L47)
|
||||
|
||||
**章节来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L47)
|
||||
|
||||
### EntityLayer分析
|
||||
EntityLayer组件承载英雄与怪物等动态实体,通过子节点排序实现Z轴层级控制。采用定时器优化渲染更新频率,避免每帧都进行排序操作以提升性能。
|
||||
|
||||
#### 序列图
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant EntityLayer as EntityLayer
|
||||
participant Timer as Timer
|
||||
participant Node as Node.children
|
||||
participant Sort as zIndexSort
|
||||
EntityLayer->>Timer : update(dt)
|
||||
Timer-->>EntityLayer : 是否达到0.2秒间隔?
|
||||
alt 达到间隔
|
||||
EntityLayer->>Node : children.sort()
|
||||
Node->>Sort : 执行Z轴排序
|
||||
Sort-->>Node : 返回排序结果
|
||||
Node-->>EntityLayer : 完成排序
|
||||
end
|
||||
EntityLayer->>EntityLayer : 继续下一帧更新
|
||||
```
|
||||
|
||||
**图层来源**
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L39)
|
||||
- [Timer.ts](file://assets/script/game/common/config/BoxSet.ts#L1-L10)
|
||||
|
||||
**章节来源**
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L39)
|
||||
|
||||
### SkillLayer分析
|
||||
SkillLayer组件专门处理技能特效的渲染,通过预制体(Prefab)管理技能相关的视觉效果。组件设计支持事件驱动的技能触发机制,为技能系统的扩展提供了基础。
|
||||
|
||||
#### 流程图
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A([组件加载]) --> B{是否监听到\n"do_use_skill"事件?}
|
||||
B --> |是| C[执行doSkill方法]
|
||||
B --> |否| D[等待下一帧]
|
||||
C --> E[实例化技能特效预制体]
|
||||
E --> F[添加到场景节点树]
|
||||
F --> G[播放技能动画]
|
||||
G --> H[技能效果完成]
|
||||
H --> I[清理特效节点]
|
||||
I --> D
|
||||
D --> J{组件是否销毁?}
|
||||
J --> |是| K([组件卸载])
|
||||
J --> |否| B
|
||||
```
|
||||
|
||||
**图层来源**
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L1-L48)
|
||||
- [Prefab](file://assets/script/game/common/config/BoxSet.ts#L1-L10)
|
||||
|
||||
**章节来源**
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L1-L48)
|
||||
|
||||
### 光照系统分析
|
||||
light.ts文件定义了基础的光照组件,为地图系统提供了光照效果的扩展能力。虽然当前实现较为简单,但已具备完整的组件生命周期管理。
|
||||
|
||||
#### 状态图
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 初始化
|
||||
初始化 --> 加载中 : onLoad()
|
||||
加载中 --> 运行中 : start()
|
||||
运行中 --> 加载中 : 重新加载
|
||||
运行中 --> 更新中 : update()
|
||||
更新中 --> 运行中 : 完成更新
|
||||
运行中 --> 销毁 : 组件移除
|
||||
销毁 --> [*]
|
||||
```
|
||||
|
||||
**图层来源**
|
||||
- [light.ts](file://assets/script/game/map/view/map/layer/light.ts#L1-L20)
|
||||
|
||||
**章节来源**
|
||||
- [light.ts](file://assets/script/game/map/view/map/layer/light.ts#L1-L20)
|
||||
|
||||
## 依赖分析
|
||||
地图图层系统依赖于Oops插件框架提供的核心功能,包括资源管理、消息系统和ECS架构。各图层组件通过MapViewScene进行协调管理,形成清晰的依赖关系。
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[MapLayer] --> B[CC引擎]
|
||||
C[EntityLayer] --> B
|
||||
D[SkillLayer] --> B
|
||||
E[light] --> B
|
||||
F[MapViewScene] --> A
|
||||
F --> C
|
||||
F --> D
|
||||
F --> E
|
||||
G[Oops框架] --> F
|
||||
G --> C
|
||||
G --> D
|
||||
B --> H[Sprite]
|
||||
B --> I[Node]
|
||||
B --> J[Camera]
|
||||
```
|
||||
|
||||
**图层来源**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
|
||||
**章节来源**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
|
||||
## 性能考虑
|
||||
地图图层系统在设计时充分考虑了性能优化。EntityLayer和SkillLayer均采用定时器控制更新频率,避免不必要的每帧计算。MapLayer通过直接操作UITransform组件实现高效的尺寸适配。
|
||||
|
||||
系统建议的性能优化策略包括:
|
||||
1. 对于静态背景,使用MapLayer一次性初始化
|
||||
2. 动态实体的Z轴排序采用0.2秒间隔更新,平衡视觉效果与性能
|
||||
3. 技能特效使用对象池模式管理预制体实例,减少GC压力
|
||||
4. 光照效果可根据需要动态启用或禁用
|
||||
|
||||
## 故障排除指南
|
||||
当遇到地图图层相关问题时,可参考以下排查步骤:
|
||||
|
||||
**章节来源**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L45)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
|
||||
## 结论
|
||||
地图图层管理系统通过分层设计实现了关注点分离,各图层职责明确,便于维护和扩展。系统充分利用了CC引擎的节点组件体系,结合Oops框架的ECS架构,构建了一个高效、可扩展的地图渲染解决方案。未来可进一步优化Z轴排序算法,引入更复杂的光照模型,并完善技能特效的资源管理机制。
|
||||
615
.qoder/repowiki/zh/content/地图系统/地图视图/地图图层管理/地图基础图层.md
Normal file
615
.qoder/repowiki/zh/content/地图系统/地图视图/地图图层管理/地图基础图层.md
Normal file
@@ -0,0 +1,615 @@
|
||||
# 地图基础图层
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts)
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts)
|
||||
- [map.json](file://assets/resources/config/map/map.json)
|
||||
- [map_delivery.json](file://assets/resources/config/map/map_delivery.json)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能优化策略](#性能优化策略)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
MapLayer类是Cocos Creator游戏引擎中地图系统的核心组件,作为地图背景图层的基础实现。该类继承自cc.Component,提供了地图纹理资源的动态加载、精灵帧初始化、尺寸适配以及节点锚点校准等关键功能。通过与MapViewComp的紧密协作,MapLayer确保了在不同分辨率设备下的正确渲染和高效的性能表现。
|
||||
|
||||
本文档将深入解析MapLayer的实现机制,包括其生命周期管理、纹理资源处理流程、尺寸适配策略以及在地图系统中的注册与更新机制。同时,我们将探讨如何扩展MapLayer以支持多段滚动背景和动态材质更新,并提供实用的性能优化建议。
|
||||
|
||||
## 项目结构
|
||||
|
||||
地图系统的文件组织采用了模块化的架构设计,主要分为视图层(view)和模型层(model)两个核心部分:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "地图系统架构"
|
||||
GameMap[GameMap 游戏地图实体]
|
||||
MapModel[MapModelComp 地图模型组件]
|
||||
MapView[MapViewComp 地图视图组件]
|
||||
subgraph "视图层组件"
|
||||
MapViewScene[MapViewScene 地图场景逻辑]
|
||||
MapLayer[MapLayer 地图背景层]
|
||||
EntityLayer[EntityLayer 实体层]
|
||||
SkillLayer[SkillLayer 技能层]
|
||||
end
|
||||
subgraph "配置文件"
|
||||
MapConfig[map.json 地图配置]
|
||||
DeliveryConfig[map_delivery.json 传送点配置]
|
||||
end
|
||||
end
|
||||
GameMap --> MapModel
|
||||
GameMap --> MapView
|
||||
MapView --> MapViewScene
|
||||
MapViewScene --> MapLayer
|
||||
MapViewScene --> EntityLayer
|
||||
MapViewScene --> SkillLayer
|
||||
MapModel --> MapConfig
|
||||
MapModel --> DeliveryConfig
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L35)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L42)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L44)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L76)
|
||||
|
||||
**章节来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L35)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L42)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### MapLayer类设计
|
||||
|
||||
MapLayer作为地图背景图层的核心实现,具有以下关键特性:
|
||||
|
||||
| 属性/方法 | 类型 | 描述 | 默认值 |
|
||||
|-----------|------|------|--------|
|
||||
| bgImg | Sprite | 背景图像精灵组件 | null |
|
||||
| width | number | 图层宽度属性 | 动态计算 |
|
||||
| height | number | 图层高度属性 | 动态计算 |
|
||||
| init() | void | 初始化方法 | - |
|
||||
| clear() | void | 清理方法 | - |
|
||||
| bgImage | Sprite | 背景图像访问器 | - |
|
||||
|
||||
### 组件继承体系
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Component {
|
||||
+onLoad() void
|
||||
+start() void
|
||||
+update(dt : number) void
|
||||
+destroy() void
|
||||
}
|
||||
class MapLayer {
|
||||
-bgImg : Sprite
|
||||
+init() void
|
||||
+clear() void
|
||||
+bgImage : Sprite
|
||||
+width : number
|
||||
+height : number
|
||||
}
|
||||
class MapViewScene {
|
||||
+camera : Camera
|
||||
+layer : Node
|
||||
+mapLayer : MapLayer
|
||||
+floorLayer : Node
|
||||
+entityLayer : EntityLayer
|
||||
+SkillLayer : SkillLayer
|
||||
+isFollowPlayer : boolean
|
||||
+ratio : Vec2
|
||||
+onLoad() void
|
||||
+start() void
|
||||
+reset() void
|
||||
+init() void
|
||||
+update(dt : number) void
|
||||
}
|
||||
class EntityLayer {
|
||||
-timer : Timer
|
||||
+update(dt : number) void
|
||||
+clear() void
|
||||
}
|
||||
class SkillLayer {
|
||||
-timer : Timer
|
||||
+light : Prefab
|
||||
+onLoad() void
|
||||
+doSkill() void
|
||||
+update(dt : number) void
|
||||
+clear() void
|
||||
}
|
||||
Component <|-- MapLayer
|
||||
Component <|-- EntityLayer
|
||||
Component <|-- SkillLayer
|
||||
MapViewScene --> MapLayer : "包含"
|
||||
MapViewScene --> EntityLayer : "包含"
|
||||
MapViewScene --> SkillLayer : "包含"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L46)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L76)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L38)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L1-L47)
|
||||
|
||||
**章节来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L46)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L76)
|
||||
|
||||
## 架构概览
|
||||
|
||||
地图系统采用ECS(Entity-Component-System)架构模式,通过组件化设计实现了高度的灵活性和可扩展性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant GM as GameMap
|
||||
participant MM as MapModel
|
||||
participant MVC as MapViewComp
|
||||
participant MVS as MapViewScene
|
||||
participant ML as MapLayer
|
||||
participant BG as Background Sprite
|
||||
GM->>MM : 创建地图模型
|
||||
GM->>MVC : 加载地图视图
|
||||
MVC->>MVS : 初始化场景逻辑
|
||||
MVS->>ML : 注册地图层
|
||||
ML->>BG : 初始化背景精灵
|
||||
BG->>ML : 设置纹理资源
|
||||
ML->>MVS : 完成初始化
|
||||
MVS->>MVC : 场景就绪
|
||||
MVC->>GM : 视图组件激活
|
||||
Note over GM,BG : 地图初始化完成
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L25-L35)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L25-L35)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L50-L60)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L20-L25)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### MapLayer生命周期管理
|
||||
|
||||
MapLayer的生命周期管理遵循Cocos Creator的标准组件生命周期,通过init()方法进行初始化配置:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([组件加载]) --> OnInit["调用init()方法"]
|
||||
OnInit --> GetTransform["获取UITransform组件"]
|
||||
GetTransform --> CalcSize["计算宽度和高度"]
|
||||
CalcSize --> SetSize["设置节点尺寸"]
|
||||
SetSize --> Ready([初始化完成])
|
||||
Ready --> UpdateLoop{"游戏循环"}
|
||||
UpdateLoop --> UpdateLoop
|
||||
Ready --> ClearCall["调用clear()方法"]
|
||||
ClearCall --> ResetSprite["重置精灵帧"]
|
||||
ResetSprite --> Cleanup([清理完成])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L20-L30)
|
||||
|
||||
#### 初始化流程详解
|
||||
|
||||
MapLayer的init()方法负责设置图层的基本属性,主要包括:
|
||||
|
||||
1. **尺寸适配**:通过UITransform组件动态调整节点尺寸
|
||||
2. **锚点校准**:确保在不同分辨率下的正确对齐
|
||||
3. **纹理绑定**:建立与背景精灵的关联关系
|
||||
|
||||
#### 清理机制
|
||||
|
||||
clear()方法提供了优雅的资源清理机制:
|
||||
- 释放当前绑定的精灵帧资源
|
||||
- 防止内存泄漏
|
||||
- 支持动态切换地图内容
|
||||
|
||||
**章节来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L20-L35)
|
||||
|
||||
### 纹理资源动态加载
|
||||
|
||||
地图系统通过MapModelComp管理资源配置,支持动态加载不同地图的纹理资源:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph "资源配置"
|
||||
Config[map.json<br/>地图配置文件]
|
||||
Delivery[map_delivery.json<br/>传送点配置]
|
||||
end
|
||||
subgraph "资源加载"
|
||||
Model[MapModelComp<br/>模型组件]
|
||||
Loader[Oops资源管理器<br/>oops.res.load]
|
||||
Prefab[地图预制件<br/>resPrefab]
|
||||
end
|
||||
subgraph "实例化"
|
||||
Instantiate[实例化地图节点]
|
||||
AddToScene[添加到场景]
|
||||
RegisterLayers[注册图层组件]
|
||||
end
|
||||
Config --> Model
|
||||
Delivery --> Model
|
||||
Model --> Loader
|
||||
Loader --> Prefab
|
||||
Prefab --> Instantiate
|
||||
Instantiate --> AddToScene
|
||||
AddToScene --> RegisterLayers
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L15-L20)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L25-L35)
|
||||
- [map.json](file://assets/resources/config/map/map.json#L1-L11)
|
||||
|
||||
#### 资源加载策略
|
||||
|
||||
| 资源类型 | 加载方式 | 缓存策略 | 释放时机 |
|
||||
|----------|----------|----------|----------|
|
||||
| 地图预制件 | 异步加载 | 自动缓存 | 场景切换时 |
|
||||
| 纹理资源 | 按需加载 | 批量管理 | 地图销毁时 |
|
||||
| 配置文件 | 同步加载 | 内存常驻 | 应用退出时 |
|
||||
|
||||
**章节来源**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L15-L20)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L25-L35)
|
||||
|
||||
### 尺寸适配与节点锚点校准
|
||||
|
||||
MapLayer通过UITransform组件实现智能的尺寸适配:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
subgraph "尺寸计算"
|
||||
GetSprite["获取背景精灵"]
|
||||
GetTransform["读取UITransform"]
|
||||
CalcWidth["计算宽度"]
|
||||
CalcHeight["计算高度"]
|
||||
end
|
||||
subgraph "锚点校准"
|
||||
SetAnchor["设置锚点"]
|
||||
AdjustPosition["调整位置"]
|
||||
ValidateBounds["验证边界"]
|
||||
end
|
||||
subgraph "渲染优化"
|
||||
BatchRender["批处理渲染"]
|
||||
ReduceDrawCalls["减少绘制调用"]
|
||||
OptimizeMemory["优化内存使用"]
|
||||
end
|
||||
GetSprite --> GetTransform
|
||||
GetTransform --> CalcWidth
|
||||
GetTransform --> CalcHeight
|
||||
CalcWidth --> SetAnchor
|
||||
CalcHeight --> SetAnchor
|
||||
SetAnchor --> AdjustPosition
|
||||
AdjustPosition --> ValidateBounds
|
||||
ValidateBounds --> BatchRender
|
||||
BatchRender --> ReduceDrawCalls
|
||||
ReduceDrawCalls --> OptimizeMemory
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L30-L45)
|
||||
|
||||
#### 适配算法实现
|
||||
|
||||
MapLayer采用以下策略确保在不同设备上的正确显示:
|
||||
|
||||
1. **动态尺寸计算**:基于背景精灵的实际纹理尺寸
|
||||
2. **锚点智能定位**:自动调整节点锚点以适应不同的显示需求
|
||||
3. **边界验证**:确保渲染边界不会超出屏幕范围
|
||||
|
||||
**章节来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L30-L45)
|
||||
|
||||
### MapViewComp中的注册与更新策略
|
||||
|
||||
MapViewComp作为地图系统的协调中心,负责管理所有子图层的生命周期:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MVC as MapViewComp
|
||||
participant MVS as MapViewScene
|
||||
participant ML as MapLayer
|
||||
participant EL as EntityLayer
|
||||
participant SL as SkillLayer
|
||||
MVC->>MVS : 创建场景实例
|
||||
MVS->>ML : 注册地图层
|
||||
MVS->>EL : 注册实体层
|
||||
MVS->>SL : 注册技能层
|
||||
loop 游戏循环
|
||||
MVS->>ML : 更新背景
|
||||
MVS->>EL : 更新实体
|
||||
MVS->>SL : 更新技能
|
||||
ML->>ML : 处理纹理动画
|
||||
EL->>EL : 处理深度排序
|
||||
SL->>SL : 处理特效渲染
|
||||
end
|
||||
Note over MVC,SL : 地图系统运行中
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L25-L35)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L25-L45)
|
||||
|
||||
#### 图层初始化顺序
|
||||
|
||||
地图系统按照以下优先级顺序初始化各图层:
|
||||
|
||||
1. **背景层(MapLayer)**:最先初始化,确保基础渲染环境
|
||||
2. **实体层(EntityLayer)**:紧随其后,处理游戏对象渲染
|
||||
3. **技能层(SkillLayer)**:最后初始化,处理特效和技能动画
|
||||
|
||||
#### 渲染层级基础设定
|
||||
|
||||
| 图层类型 | 渲染层级 | Z-Index范围 | 主要职责 |
|
||||
|----------|----------|-------------|----------|
|
||||
| 背景层 | 最底层 | 0-10 | 地图背景渲染 |
|
||||
| 地面层 | 中间层 | 11-50 | 地面装饰物 |
|
||||
| 实体层 | 中间层 | 51-100 | 游戏实体对象 |
|
||||
| 技能层 | 最顶层 | 101+ | 技能特效动画 |
|
||||
|
||||
**章节来源**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L25-L45)
|
||||
|
||||
### 扩展MapLayer支持多段滚动背景
|
||||
|
||||
为了支持更复杂的游戏场景,可以扩展MapLayer以实现多段滚动背景:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MapLayer {
|
||||
+bgImg : Sprite
|
||||
+scrollSpeed : number
|
||||
+repeatMode : RepeatMode
|
||||
+init() void
|
||||
+update(dt : number) void
|
||||
+setScrollSpeed(speed : number) void
|
||||
+enableParallax(parallax : boolean) void
|
||||
}
|
||||
class MultiScrollLayer {
|
||||
-layers : MapLayer[]
|
||||
-parallaxFactor : number
|
||||
+addBackground(layer : MapLayer) void
|
||||
+removeBackground(layer : MapLayer) void
|
||||
+update(dt : number) void
|
||||
+setParallaxFactor(factor : number) void
|
||||
}
|
||||
class ParallaxEffect {
|
||||
+depth : number
|
||||
+speedMultiplier : number
|
||||
+offset : Vec2
|
||||
+applyEffect(sprite : Sprite) void
|
||||
}
|
||||
MapLayer <|-- MultiScrollLayer
|
||||
MultiScrollLayer --> ParallaxEffect : "使用"
|
||||
MultiScrollLayer --> MapLayer : "管理多个"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L46)
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L1-L49)
|
||||
|
||||
#### 动态材质更新机制
|
||||
|
||||
通过MoveUV组件可以实现动态UV动画效果:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始UV动画]) --> GetSprite["获取Sprite组件"]
|
||||
GetSprite --> InitRect["初始化矩形区域"]
|
||||
InitRect --> SetPackable["禁用打包优化"]
|
||||
SetPackable --> UpdateLoop{"更新循环"}
|
||||
UpdateLoop --> CheckWrapMode{"检查包装模式"}
|
||||
CheckWrapMode --> |变更| UpdateWrapMode["更新纹理包装模式"]
|
||||
CheckWrapMode --> |未变| CalculateOffset["计算偏移量"]
|
||||
UpdateWrapMode --> CalculateOffset
|
||||
CalculateOffset --> ApplyOffset["应用UV偏移"]
|
||||
ApplyOffset --> MarkDirty["标记渲染数据更新"]
|
||||
MarkDirty --> UpdateLoop
|
||||
UpdateLoop --> Stop([停止动画])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L25-L49)
|
||||
|
||||
**章节来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L1-L49)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
地图系统的依赖关系体现了清晰的分层架构:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "外部依赖"
|
||||
Cocos[Cocos Creator Engine]
|
||||
Oops[Oops Plugin Framework]
|
||||
ECS[ECS Framework]
|
||||
end
|
||||
subgraph "核心组件"
|
||||
MapLayer[MapLayer]
|
||||
MapViewComp[MapViewComp]
|
||||
MapViewScene[MapViewScene]
|
||||
MapModel[MapModelComp]
|
||||
end
|
||||
subgraph "辅助组件"
|
||||
EntityLayer[EntityLayer]
|
||||
SkillLayer[SkillLayer]
|
||||
MoveUV[MoveUV]
|
||||
end
|
||||
subgraph "配置系统"
|
||||
MapConfig[地图配置]
|
||||
DeliveryConfig[传送点配置]
|
||||
end
|
||||
Cocos --> MapLayer
|
||||
Cocos --> MapViewComp
|
||||
Cocos --> MapViewScene
|
||||
Cocos --> MapModel
|
||||
Cocos --> EntityLayer
|
||||
Cocos --> SkillLayer
|
||||
Cocos --> MoveUV
|
||||
Oops --> MapLayer
|
||||
Oops --> MapViewComp
|
||||
Oops --> MapViewScene
|
||||
Oops --> MapModel
|
||||
ECS --> MapLayer
|
||||
ECS --> MapViewComp
|
||||
ECS --> MapViewScene
|
||||
ECS --> MapModel
|
||||
MapConfig --> MapModel
|
||||
DeliveryConfig --> MapModel
|
||||
MapViewScene --> MapLayer
|
||||
MapViewScene --> EntityLayer
|
||||
MapViewScene --> SkillLayer
|
||||
MapLayer --> MoveUV
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L10)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L10)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L10)
|
||||
|
||||
### 组件耦合度分析
|
||||
|
||||
| 组件对 | 耦合类型 | 耦合强度 | 优化建议 |
|
||||
|--------|----------|----------|----------|
|
||||
| MapLayer ↔ MoveUV | 功能耦合 | 中等 | 提取通用接口 |
|
||||
| MapViewScene ↔ MapLayer | 依赖耦合 | 高 | 使用事件解耦 |
|
||||
| GameMap ↔ MapModel | 实体耦合 | 低 | 添加中间管理层 |
|
||||
|
||||
**章节来源**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L10)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L10)
|
||||
|
||||
## 性能优化策略
|
||||
|
||||
### 图集合并优化
|
||||
|
||||
通过合理组织纹理资源,可以显著提升渲染性能:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph "原始资源"
|
||||
T1[纹理1]
|
||||
T2[纹理2]
|
||||
T3[纹理3]
|
||||
T4[纹理4]
|
||||
end
|
||||
subgraph "图集合并"
|
||||
Atlas[纹理图集]
|
||||
Pack[打包算法]
|
||||
end
|
||||
subgraph "优化效果"
|
||||
Batch[批处理渲染]
|
||||
DrawCalls[减少绘制调用]
|
||||
Memory[优化内存使用]
|
||||
end
|
||||
T1 --> Pack
|
||||
T2 --> Pack
|
||||
T3 --> Pack
|
||||
T4 --> Pack
|
||||
Pack --> Atlas
|
||||
Atlas --> Batch
|
||||
Batch --> DrawCalls
|
||||
DrawCalls --> Memory
|
||||
```
|
||||
|
||||
#### 性能优化建议
|
||||
|
||||
1. **纹理打包策略**
|
||||
- 将频繁一起使用的纹理合并到同一图集中
|
||||
- 使用合理的图集大小(建议1024x1024或2048x2048)
|
||||
- 避免过度填充导致的内存浪费
|
||||
|
||||
2. **绘制批次优化**
|
||||
- 相同材质的精灵自动合并到同一绘制批次
|
||||
- 减少状态切换开销
|
||||
- 优化渲染顺序以提高缓存命中率
|
||||
|
||||
3. **内存管理**
|
||||
- 及时释放不再使用的纹理资源
|
||||
- 使用对象池管理临时对象
|
||||
- 监控内存使用情况,避免内存泄漏
|
||||
|
||||
### 动态加载优化
|
||||
|
||||
对于大型地图场景,建议采用分块加载策略:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([地图加载开始]) --> LoadCore["加载核心图层"]
|
||||
LoadCore --> LoadVisible["加载可见区域"]
|
||||
LoadVisible --> PreloadNearby["预加载邻近区域"]
|
||||
PreloadNearby --> Monitor["监控玩家位置"]
|
||||
Monitor --> PlayerMoved{"玩家移动?"}
|
||||
PlayerMoved --> |是| UnloadOld["卸载远离区域"]
|
||||
PlayerMoved --> |否| Monitor
|
||||
UnloadOld --> LoadNew["加载新区域"]
|
||||
LoadNew --> PreloadNearby
|
||||
Monitor --> End([加载完成])
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [MapLayer.ts](file://assets/script/game/view/map/layer/MapLayer.ts#L1-L46)
|
||||
- [MoveUV.ts](file://assets/script/game/view/MoveUV.ts#L1-L49)
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
| 问题类型 | 症状描述 | 可能原因 | 解决方案 |
|
||||
|----------|----------|----------|----------|
|
||||
| 纹理加载失败 | 背景显示为空白 | 资源路径错误 | 检查resPrefab配置 |
|
||||
| 尺寸适配异常 | 图层显示变形 | 锚点设置不当 | 验证UITransform配置 |
|
||||
| 性能下降 | 帧率降低 | 绘制批次过多 | 优化纹理打包策略 |
|
||||
| 内存泄漏 | 内存持续增长 | 资源未正确释放 | 检查clear()方法调用 |
|
||||
|
||||
### 调试技巧
|
||||
|
||||
1. **资源监控**
|
||||
- 使用Cocos Creator的Profiler监控渲染性能
|
||||
- 检查纹理内存使用情况
|
||||
- 监控绘制调用次数
|
||||
|
||||
2. **日志记录**
|
||||
- 在关键方法添加调试日志
|
||||
- 记录资源加载状态
|
||||
- 跟踪组件生命周期
|
||||
|
||||
3. **可视化调试**
|
||||
- 显示图层边界框
|
||||
- 标记关键节点位置
|
||||
- 可视化渲染顺序
|
||||
|
||||
**章节来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L25-L35)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L45-L60)
|
||||
|
||||
## 结论
|
||||
|
||||
MapLayer作为地图系统的核心组件,通过精心设计的架构实现了高效的地图渲染功能。其继承自cc.Component的生命周期管理确保了组件的正确初始化和清理,而动态纹理加载和精灵帧初始化流程则保证了资源的灵活使用。
|
||||
|
||||
通过与MapViewComp的紧密协作,MapLayer不仅实现了基本的地图背景渲染,还为扩展功能如多段滚动背景和动态材质更新奠定了坚实基础。合理的性能优化策略,包括图集合并和绘制批次减少,使得地图系统能够在各种设备上保持良好的性能表现。
|
||||
|
||||
未来的发展方向包括:
|
||||
- 进一步优化多段滚动背景的实现
|
||||
- 增强动态材质更新的功能
|
||||
- 实现更智能的资源加载策略
|
||||
- 提供更丰富的视觉效果支持
|
||||
|
||||
这些改进将使地图系统更加灵活和强大,为游戏开发提供更好的技术支持。
|
||||
170
.qoder/repowiki/zh/content/地图系统/地图视图/地图图层管理/实体图层管理.md
Normal file
170
.qoder/repowiki/zh/content/地图系统/地图视图/地图图层管理/实体图层管理.md
Normal file
@@ -0,0 +1,170 @@
|
||||
# 实体图层管理
|
||||
|
||||
<cite>
|
||||
**本文档引用文件**
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts)
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [timer.md](file://doc/core/common/timer.md)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [实体图层结构](#实体图层结构)
|
||||
3. [Z轴层级管理机制](#z轴层级管理机制)
|
||||
4. [定时器更新策略](#定时器更新策略)
|
||||
5. [ECS系统数据同步](#ecs系统数据同步)
|
||||
6. [性能优化方案](#性能优化方案)
|
||||
7. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
本文档深入解析EntityLayer作为动态实体容器的实现机制,重点阐述其如何承载英雄、怪物及其他可移动单位的可视化节点。文档将详细说明其通过addChild与zIndex控制子节点渲染顺序的Z轴层级管理机制,分析其内置的定时器更新策略,以及与ECS系统中BattleMoveComp的数据同步设计模式。同时,提供处理大量实体时的性能优化方案。
|
||||
|
||||
## 实体图层结构
|
||||
|
||||
EntityLayer作为游戏场景中的物体层,负责管理所有动态实体的可视化节点。该图层通过Cocos Creator的节点系统实现,作为场景中的一个特殊容器节点,专门用于承载英雄、怪物等可移动单位。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "场景层级结构"
|
||||
MapViewScene[地图场景]
|
||||
EntityLayer[实体图层]
|
||||
SkillLayer[技能图层]
|
||||
MapLayer[地图图层]
|
||||
end
|
||||
MapViewScene --> EntityLayer
|
||||
MapViewScene --> SkillLayer
|
||||
MapViewScene --> MapLayer
|
||||
EntityLayer --> HeroNode[英雄节点]
|
||||
EntityLayer --> MonsterNode[怪物节点]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L38)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L20)
|
||||
|
||||
**Section sources**
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L38)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L20)
|
||||
|
||||
## Z轴层级管理机制
|
||||
|
||||
EntityLayer通过精确的Z轴层级管理机制确保战斗单位在地形与特效间的正确叠加。该机制不直接依赖节点的z坐标,而是通过控制节点在父节点中的兄弟索引(sibling index)来实现渲染顺序的控制。
|
||||
|
||||
核心实现位于BattleMoveSystem中,通过updateRenderOrder方法动态调整所有单位的渲染层级:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始更新渲染层级]) --> FindUnits["查找所有HeroViewComp实体"]
|
||||
FindUnits --> FilterByFac["按阵营分组"]
|
||||
FilterByFac --> SortByX["按x坐标排序<br/>x坐标越小越靠后"]
|
||||
SortByX --> SetSiblingIndex["设置兄弟索引<br/>index越大层级越高"]
|
||||
SetSiblingIndex --> End([完成渲染层级更新])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L233-L262)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L50)
|
||||
|
||||
**Section sources**
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L233-L262)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L50)
|
||||
|
||||
## 定时器更新策略
|
||||
|
||||
EntityLayer采用智能的定时器更新策略,通过固定帧间隔批量刷新实体位置以降低渲染开销。该策略避免了每帧都进行深度排序可能带来的性能问题。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class EntityLayer {
|
||||
-timer : Timer
|
||||
+update(dt : number)
|
||||
+clear()
|
||||
}
|
||||
class Timer {
|
||||
+interval : number
|
||||
+update(dt : number) : boolean
|
||||
}
|
||||
EntityLayer --> Timer : "使用"
|
||||
```
|
||||
|
||||
EntityLayer中定义了一个间隔为0.2秒的Timer实例,理论上应该周期性地执行节点排序。然而,当前实现中相关代码被注释,表明开发者意识到每帧排序的性能开销问题,为未来优化预留了接口。
|
||||
|
||||
**Diagram sources**
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L38)
|
||||
- [timer.md](file://doc/core/common/timer.md#L79-L91)
|
||||
|
||||
**Section sources**
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L38)
|
||||
- [timer.md](file://doc/core/common/timer.md#L79-L91)
|
||||
|
||||
## ECS系统数据同步
|
||||
|
||||
系统采用实体-组件-系统(ECS)架构实现视图与逻辑的完全解耦。BattleMoveComp作为数据组件承载移动状态,而EntityLayer作为视图容器负责可视化呈现。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant BattleMoveSystem as BattleMoveSystem
|
||||
participant BattleMoveComp as BattleMoveComp
|
||||
participant HeroViewComp as HeroViewComp
|
||||
participant EntityLayer as EntityLayer
|
||||
BattleMoveSystem->>BattleMoveComp : 读取移动状态
|
||||
BattleMoveSystem->>HeroViewComp : 获取节点引用
|
||||
BattleMoveSystem->>HeroViewComp : 更新位置
|
||||
BattleMoveSystem->>BattleMoveSystem : updateRenderOrder()
|
||||
BattleMoveSystem->>HeroViewComp : setSiblingIndex()
|
||||
HeroViewComp->>EntityLayer : 节点层级更新
|
||||
```
|
||||
|
||||
当英雄或怪物实体被加载时,通过addChild方法将其节点添加到EntityLayer中,实现视图与逻辑的绑定:
|
||||
|
||||
**Section sources**
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L45-L55)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L48-L58)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L1-L34)
|
||||
|
||||
## 性能优化方案
|
||||
|
||||
### 对象池复用
|
||||
系统通过ECS框架内置的对象池机制实现组件和实体的高效复用。当实体被销毁时,其组件会被放入缓存池中,下次创建时优先从池中获取,避免频繁的内存分配与垃圾回收。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
ENTITY["实体"] {
|
||||
string name PK
|
||||
boolean active
|
||||
}
|
||||
COMPONENT["组件"] {
|
||||
string type PK
|
||||
boolean pooled
|
||||
}
|
||||
ENTITY_POOL["实体池"] {
|
||||
int capacity
|
||||
int count
|
||||
}
|
||||
COMPONENT_POOL["组件池"] {
|
||||
int capacity
|
||||
int count
|
||||
}
|
||||
ENTITY ||--o{ COMPONENT : "包含"
|
||||
ENTITY_POOL }o--|| ENTITY : "存储"
|
||||
COMPONENT_POOL }o--|| COMPONENT : "存储"
|
||||
```
|
||||
|
||||
### 可见性裁剪
|
||||
虽然当前代码未显式实现可见性裁剪,但在BattleMoveSystem中通过阵营分组过滤和距离检测,间接实现了部分裁剪功能。系统只对同阵营的单位进行渲染层级计算,减少了不必要的处理。
|
||||
|
||||
### 批量更新策略
|
||||
通过0.2秒的定时器间隔,系统可以批量处理多个实体的位置更新和层级排序,而不是每帧都执行,有效降低了CPU开销。
|
||||
|
||||
**Section sources**
|
||||
- [ecs.md](file://ecs.md#L29-L87)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L38)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L1-L34)
|
||||
|
||||
## 结论
|
||||
EntityLayer作为动态实体容器,通过精心设计的Z轴层级管理机制和定时器更新策略,有效平衡了视觉效果与性能开销。其与ECS系统的深度集成实现了视图与逻辑的完美解耦,为游戏的可维护性和扩展性奠定了坚实基础。未来的优化方向包括启用定时排序、实现完整的可见性裁剪以及进一步优化对象池策略。
|
||||
368
.qoder/repowiki/zh/content/地图系统/地图视图/地图图层管理/技能特效图层.md
Normal file
368
.qoder/repowiki/zh/content/地图系统/地图视图/地图图层管理/技能特效图层.md
Normal file
@@ -0,0 +1,368 @@
|
||||
# 技能特效图层
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/layer/SkillLayer.ts)
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts)
|
||||
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts)
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts)
|
||||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
|
||||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
SkillLayer是《英雄传说》项目中负责技能释放特效渲染的核心独立渲染层级。它作为技能动画与地图背景之间的隔离屏障,确保技能特效能够在正确的视觉层级中呈现,同时保持与施法者位置和朝向的精确同步。该系统采用ECS架构设计,支持多种特效类型(粒子系统、Spine动画)的集成,并提供了完整的生命周期管理机制。
|
||||
|
||||
## 项目结构
|
||||
|
||||
SkillLayer系统在项目中的组织结构体现了清晰的职责分离和模块化设计:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "地图视图层"
|
||||
MapView[MapViewScene]
|
||||
MapLayer[MapLayer]
|
||||
EntityLayer[EntityLayer]
|
||||
SkillLayer[SkillLayer]
|
||||
end
|
||||
subgraph "技能系统"
|
||||
SkillEnt[SkillEnt]
|
||||
SkillViewCom[SkillViewCom]
|
||||
AtkConCom[AtkConCom]
|
||||
SkillConComp[SkillConComp]
|
||||
end
|
||||
subgraph "配置系统"
|
||||
SkillSet[SkillSet]
|
||||
HeroAttrs[HeroAttrs]
|
||||
end
|
||||
MapView --> MapLayer
|
||||
MapView --> EntityLayer
|
||||
MapView --> SkillLayer
|
||||
SkillEnt --> SkillViewCom
|
||||
SkillViewCom --> AtkConCom
|
||||
SkillConComp --> SkillEnt
|
||||
SkillSet --> SkillViewCom
|
||||
SkillSet --> AtkConCom
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/layer/SkillLayer.ts#L1-L48)
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
|
||||
|
||||
**章节来源**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/layer/SkillLayer.ts#L1-L48)
|
||||
|
||||
## 核心组件
|
||||
|
||||
SkillLayer系统由以下核心组件构成:
|
||||
|
||||
### SkillLayer - 独立渲染层级
|
||||
作为技能特效的专用渲染容器,SkillLayer实现了以下关键功能:
|
||||
- **层级隔离**:确保技能特效不会干扰地图背景和其他UI元素
|
||||
- **深度排序**:支持基于Z轴位置的自动排序机制
|
||||
- **生命周期管理**:提供完整的创建、播放和销毁流程
|
||||
|
||||
### SkillViewCom - 视图层控制器
|
||||
负责技能特效的视觉表现和行为控制:
|
||||
- **位置同步**:与施法者位置保持实时同步
|
||||
- **动画播放**:协调各种特效动画的播放时机
|
||||
- **生命周期控制**:管理技能特效的完整生命周期
|
||||
|
||||
### AtkConCom - 攻击逻辑组件
|
||||
处理技能的物理效果和碰撞检测:
|
||||
- **伤害计算**:基于技能配置进行精确的伤害计算
|
||||
- **碰撞检测**:实现高效的2D碰撞检测机制
|
||||
- **效果触发**:支持多种技能效果类型的触发
|
||||
|
||||
**章节来源**
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/layer/SkillLayer.ts#L18-L48)
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L10-L156)
|
||||
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L14-L236)
|
||||
|
||||
## 架构概览
|
||||
|
||||
SkillLayer系统采用了分层架构设计,实现了视图层与业务逻辑的完全分离:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as 施法者
|
||||
participant SkillCon as 技能控制器
|
||||
participant SkillEnt as 技能实体
|
||||
participant SkillLayer as 技能图层
|
||||
participant AtkCon as 攻击组件
|
||||
participant Effect as 特效系统
|
||||
Player->>SkillCon : 发起技能请求
|
||||
SkillCon->>SkillEnt : 创建技能实体
|
||||
SkillEnt->>SkillLayer : 加载特效预制体
|
||||
SkillLayer->>Effect : 实例化特效节点
|
||||
Effect->>AtkCon : 初始化攻击组件
|
||||
AtkCon->>Effect : 播放特效动画
|
||||
Effect->>AtkCon : 触发碰撞检测
|
||||
AtkCon->>Effect : 销毁特效节点
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L50-L90)
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L77)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/layer/SkillLayer.ts#L25-L35)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### SkillLayer节点组织结构
|
||||
|
||||
SkillLayer作为独立的渲染层级,其节点组织结构体现了高效的空间管理和渲染优化:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class SkillLayer {
|
||||
-timer : Timer
|
||||
-light : Prefab
|
||||
+onLoad() : void
|
||||
+doSkill() : void
|
||||
+update(dt : number) : void
|
||||
+clear() : void
|
||||
}
|
||||
class EntityLayer {
|
||||
-timer : Timer
|
||||
+update(dt : number) : void
|
||||
+clear() : void
|
||||
}
|
||||
class MapViewScene {
|
||||
+camera : Camera
|
||||
+layer : Node
|
||||
+mapLayer : MapLayer
|
||||
+entityLayer : EntityLayer
|
||||
+SkillLayer : SkillLayer
|
||||
+isFollowPlayer : boolean
|
||||
}
|
||||
MapViewScene --> SkillLayer
|
||||
MapViewScene --> EntityLayer
|
||||
SkillLayer --|> Component
|
||||
EntityLayer --|> Component
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/layer/SkillLayer.ts#L18-L48)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L18-L37)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L15-L35)
|
||||
|
||||
SkillLayer的节点管理遵循以下原则:
|
||||
- **惰性加载**:仅在需要时创建特效节点
|
||||
- **批量清理**:定期清理无效的特效节点
|
||||
- **深度排序**:基于节点的Z轴位置进行自动排序
|
||||
|
||||
**章节来源**
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/layer/SkillLayer.ts#L1-L48)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L37)
|
||||
|
||||
### 技能生命周期管理
|
||||
|
||||
SkillLayer系统实现了完整的技能生命周期管理,确保特效的正确创建、播放和销毁:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([技能释放请求]) --> LoadPrefab[加载特效预制体]
|
||||
LoadPrefab --> InstantiateNode[实例化特效节点]
|
||||
InstantiateNode --> InitComponents[初始化组件]
|
||||
InitComponents --> SyncPosition[同步位置信息]
|
||||
SyncPosition --> PlayAnimation[播放特效动画]
|
||||
PlayAnimation --> CollisionCheck{碰撞检测}
|
||||
CollisionCheck --> |命中目标| ApplyDamage[应用伤害效果]
|
||||
CollisionCheck --> |未命中| ContinuePlay[继续播放]
|
||||
ApplyDamage --> CheckDuration{检查持续时间}
|
||||
ContinuePlay --> CheckDuration
|
||||
CheckDuration --> |达到上限| DestroyNode[销毁节点]
|
||||
CheckDuration --> |未达到| CollisionCheck
|
||||
DestroyNode --> CleanupResources[清理资源]
|
||||
CleanupResources --> End([生命周期结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L77)
|
||||
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L147-L186)
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L50-L80)
|
||||
|
||||
**章节来源**
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
|
||||
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L147-L186)
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L50-L80)
|
||||
|
||||
### SkillViewCom与AtkConCom协作机制
|
||||
|
||||
SkillViewCom和AtkConCom通过紧密的协作确保技能特效与施法者位置的精确同步:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant SV as SkillViewCom
|
||||
participant AC as AtkConCom
|
||||
participant Hero as 施法者
|
||||
participant Target as 目标对象
|
||||
Hero->>SV : 更新施法者位置
|
||||
SV->>SV : 同步节点位置
|
||||
SV->>AC : 传递位置信息
|
||||
AC->>AC : 计算目标轨迹
|
||||
AC->>AC : 播放特效动画
|
||||
AC->>Target : 触发碰撞检测
|
||||
Target->>AC : 反馈碰撞结果
|
||||
AC->>AC : 应用伤害效果
|
||||
AC->>SV : 请求销毁节点
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L120-L156)
|
||||
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L120-L147)
|
||||
|
||||
这种协作机制的优势包括:
|
||||
- **实时同步**:确保特效始终跟随施法者移动
|
||||
- **精确控制**:支持复杂的运动轨迹计算
|
||||
- **高效通信**:通过组件间的消息传递实现解耦
|
||||
|
||||
**章节来源**
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L120-L156)
|
||||
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L120-L147)
|
||||
|
||||
### 粒子系统与Spine动画集成
|
||||
|
||||
SkillLayer系统支持多种特效类型的无缝集成:
|
||||
|
||||
| 特效类型 | 实现方式 | 性能特点 | 使用场景 |
|
||||
|---------|---------|---------|---------|
|
||||
| 粒子系统 | Cocos Particle System | 高性能,适合大规模效果 | 火焰、爆炸、魔法阵 |
|
||||
| Spine动画 | Spine Runtime | 中等性能,适合复杂骨骼动画 | 英雄技能、特殊效果 |
|
||||
| 2D精灵 | Sprite Animation | 低性能,适合简单动画 | 基础攻击特效 |
|
||||
| 着色器效果 | Shader Effects | 高性能,适合全局效果 | 光晕、扭曲、渐变 |
|
||||
|
||||
**章节来源**
|
||||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L80-L147)
|
||||
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L58-L96)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
SkillLayer系统的依赖关系体现了清晰的分层架构:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "表现层"
|
||||
SkillLayer[SkillLayer]
|
||||
EntityLayer[EntityLayer]
|
||||
MapLayer[MapLayer]
|
||||
end
|
||||
subgraph "业务逻辑层"
|
||||
SkillEnt[SkillEnt]
|
||||
SkillViewCom[SkillViewCom]
|
||||
AtkConCom[AtkConCom]
|
||||
SkillConComp[SkillConComp]
|
||||
end
|
||||
subgraph "配置层"
|
||||
SkillSet[SkillSet]
|
||||
HeroAttrs[HeroAttrs]
|
||||
end
|
||||
subgraph "框架层"
|
||||
ECS[ECS框架]
|
||||
Oops[Oops框架]
|
||||
Cocos[Cocos引擎]
|
||||
end
|
||||
SkillLayer --> EntityLayer
|
||||
SkillLayer --> MapLayer
|
||||
SkillEnt --> SkillViewCom
|
||||
SkillViewCom --> AtkConCom
|
||||
SkillConComp --> SkillEnt
|
||||
SkillSet --> SkillViewCom
|
||||
SkillSet --> AtkConCom
|
||||
ECS --> SkillEnt
|
||||
ECS --> SkillViewCom
|
||||
ECS --> AtkConCom
|
||||
Oops --> SkillEnt
|
||||
Cocos --> SkillLayer
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/layer/SkillLayer.ts#L1-L15)
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L10)
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L1-L10)
|
||||
|
||||
**章节来源**
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/layer/SkillLayer.ts#L1-L15)
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L10)
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L1-L10)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
SkillLayer系统在设计时充分考虑了性能优化,特别是在高频技能释放场景下的内存管理:
|
||||
|
||||
### 内存波动管理策略
|
||||
|
||||
1. **资源预加载机制**
|
||||
- 在技能释放前预先加载特效资源
|
||||
- 使用对象池技术复用特效节点
|
||||
- 实现智能的资源卸载策略
|
||||
|
||||
2. **对象池管理**
|
||||
- 动态创建和回收特效节点
|
||||
- 避免频繁的垃圾回收操作
|
||||
- 优化内存分配和释放频率
|
||||
|
||||
3. **渲染优化**
|
||||
- 减少不必要的渲染调用
|
||||
- 实现高效的深度排序算法
|
||||
- 使用视锥剔除减少不可见对象的渲染
|
||||
|
||||
### 最佳实践建议
|
||||
|
||||
| 优化策略 | 实现方法 | 性能收益 | 适用场景 |
|
||||
|---------|---------|---------|---------|
|
||||
| 对象池复用 | 预先创建特效对象池 | 减少50%的内存分配 | 高频技能释放 |
|
||||
| 异步加载 | 技能释放前异步加载资源 | 提升首帧性能 | 大型特效资源 |
|
||||
| 分帧处理 | 将特效创建分散到多帧 | 避免卡顿 | 大量并发技能 |
|
||||
| 资源压缩 | 使用压缩格式存储特效资源 | 减少内存占用30% | 所有场景 |
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
1. **特效不显示或显示异常**
|
||||
- 检查SkillLayer是否正确添加到场景中
|
||||
- 验证特效预制体的加载路径是否正确
|
||||
- 确认特效节点的渲染层级设置
|
||||
|
||||
2. **技能特效与施法者不同步**
|
||||
- 检查SkillViewCom的位置同步逻辑
|
||||
- 验证AtkConCom的更新频率设置
|
||||
- 确认节点的父级变换矩阵
|
||||
|
||||
3. **内存泄漏问题**
|
||||
- 检查特效节点的销毁逻辑
|
||||
- 验证事件监听器的正确移除
|
||||
- 确认对象池的正确使用
|
||||
|
||||
**章节来源**
|
||||
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L211-L235)
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L140-L156)
|
||||
|
||||
## 结论
|
||||
|
||||
SkillLayer作为技能特效渲染的核心组件,成功实现了以下目标:
|
||||
|
||||
1. **架构优势**:采用ECS架构设计,实现了高度的模块化和可扩展性
|
||||
2. **性能优化**:通过对象池、异步加载等技术有效管理内存波动
|
||||
3. **功能完整性**:支持多种特效类型和复杂的技能效果
|
||||
4. **维护便利性**:清晰的职责分离使得系统易于维护和扩展
|
||||
|
||||
该系统为游戏提供了流畅的技能特效体验,同时为未来的功能扩展奠定了坚实的基础。通过合理的架构设计和性能优化策略,SkillLayer能够应对各种复杂的技能释放场景,确保游戏的高质量运行。
|
||||
269
.qoder/repowiki/zh/content/地图系统/地图视图/地图视图.md
Normal file
269
.qoder/repowiki/zh/content/地图系统/地图视图/地图视图.md
Normal file
@@ -0,0 +1,269 @@
|
||||
# 地图视图
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts)
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
- [map.json](file://assets/resources/config/map/map.json)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
本文档深入解析 `MapViewComp` 作为地图表现层的核心作用,涵盖地图预制体加载、地图图层管理(背景、实体、技能等)以及 UV 动画效果的实现。结合 `MapView.ts` 和 `MapViewScene.ts` 阐述地图场景的构建流程与节点组织结构。分析 `MapLayer.ts` 和 `EntityLayer.ts` 如何实现分层渲染与实体挂载。阐述 `MoveUV.ts` 实现的动态纹理偏移技术用于模拟地图流动效果。最后提供自定义地图视觉风格、添加新图层及优化渲染性能的实践指南。
|
||||
|
||||
## 项目结构
|
||||
项目结构清晰地将地图相关逻辑分离到 `assets/script/game/map/` 目录下,采用 MVC 模式组织代码。`model` 目录存放地图数据模型,`view` 目录存放视图组件和图层管理,`view/map/layer` 子目录进一步细化了不同图层的实现。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "地图系统"
|
||||
subgraph "模型层"
|
||||
MapModelComp[MapModelComp.ts]
|
||||
end
|
||||
subgraph "视图层"
|
||||
MapViewComp[MapViewComp.ts]
|
||||
MapViewScene[MapViewScene.ts]
|
||||
MoveUV[MoveUV.ts]
|
||||
subgraph "图层组件"
|
||||
MapLayer[MapLayer.ts]
|
||||
EntityLayer[EntityLayer.ts]
|
||||
SkillLayer[SkillLayer.ts]
|
||||
end
|
||||
end
|
||||
subgraph "控制层"
|
||||
GameMap[GameMap.ts]
|
||||
end
|
||||
end
|
||||
MapViewComp --> MapViewScene
|
||||
MapViewScene --> MapLayer
|
||||
MapViewScene --> EntityLayer
|
||||
MapViewScene --> SkillLayer
|
||||
MapViewComp --> MoveUV
|
||||
GameMap --> MapModelComp
|
||||
GameMap --> MapViewComp
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts)
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
|
||||
**Section sources**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts)
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
|
||||
## 核心组件
|
||||
`MapViewComp` 是地图表现层的核心组件,负责协调地图场景的初始化和生命周期管理。它通过 `MapViewScene` 组件访问各个地图图层,并在 `start` 方法中建立引用关系。`MapModelComp` 定义了地图的基本属性,如初始地图编号和地图显示预制体路径。`GameMap` 类作为 ECS 实体,整合了模型和视图组件,提供地图加载的入口方法。
|
||||
|
||||
**Section sources**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L45)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L43)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
|
||||
## 架构概述
|
||||
地图系统采用基于 ECS(Entity-Component-System)架构的设计模式,将地图数据(Model)、视图(View)和控制逻辑(Controller)分离。`GameMap` 实体持有 `MapModelComp` 和 `MapViewComp` 组件,实现了数据与表现的解耦。地图场景由 `MapViewScene` 组件管理,它通过属性装饰器关联了多个图层组件,包括 `MapLayer`(背景层)、`EntityLayer`(实体层)和 `SkillLayer`(技能层),形成了清晰的层次化结构。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class GameMap {
|
||||
+MapModel : MapModelComp
|
||||
+MapView : MapViewComp
|
||||
+load() : void
|
||||
}
|
||||
class MapModelComp {
|
||||
+id : number
|
||||
+resPrefab : string
|
||||
+reset() : void
|
||||
}
|
||||
class MapViewComp {
|
||||
+scene : MapViewScene
|
||||
+start() : void
|
||||
+update(dt : number) : void
|
||||
}
|
||||
class MapViewScene {
|
||||
+camera : Camera
|
||||
+mapLayer : MapLayer
|
||||
+entityLayer : EntityLayer
|
||||
+SkillLayer : SkillLayer
|
||||
+isFollowPlayer : boolean
|
||||
+ratio : Vec2
|
||||
+init() : void
|
||||
+update(dt : number) : void
|
||||
}
|
||||
class MapLayer {
|
||||
+bgImg : Sprite
|
||||
+init() : void
|
||||
+clear() : void
|
||||
+bgImage : Sprite
|
||||
+width : number
|
||||
+height : number
|
||||
}
|
||||
class EntityLayer {
|
||||
+timer : Timer
|
||||
+update(dt : number) : void
|
||||
+clear() : void
|
||||
}
|
||||
class SkillLayer {
|
||||
+light : Prefab
|
||||
+doSkill() : void
|
||||
+clear() : void
|
||||
}
|
||||
GameMap --> MapModelComp : "包含"
|
||||
GameMap --> MapViewComp : "包含"
|
||||
MapViewComp --> MapViewScene : "引用"
|
||||
MapViewScene --> MapLayer : "引用"
|
||||
MapViewScene --> EntityLayer : "引用"
|
||||
MapViewScene --> SkillLayer : "引用"
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L43)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L45)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L47)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L39)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L1-L48)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### MapViewComp 分析
|
||||
`MapViewComp` 组件作为地图视图的主控制器,负责地图场景的初始化和事件监听。在 `onLoad` 方法中,它可以监听全局事件,如角色添加或技能使用。`start` 方法中,它通过 `getComponent` 获取 `MapViewScene` 的引用,建立与地图场景的连接。该组件还包含一个 `Timer` 实例,可用于周期性任务的调度。
|
||||
|
||||
**Section sources**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L45)
|
||||
|
||||
### MapViewScene 分析
|
||||
`MapViewScene` 组件是地图场景的核心逻辑容器,它通过 Cocos Creator 的属性系统(`@property`)将场景中的各个节点和组件关联起来。这包括摄像机(`camera`)、背景层(`mapLayer`)、实体层(`entityLayer`)和技能层(`SkillLayer`)。`isFollowPlayer` 属性控制摄像机是否跟随玩家移动。`reset` 方法用于清理各个图层的状态,确保地图切换时的干净环境。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant LoadingView as LoadingViewComp
|
||||
participant GameMap as GameMap
|
||||
participant MapView as MapViewComp
|
||||
participant MapViewScene as MapViewScene
|
||||
LoadingView->>GameMap : map.load()
|
||||
GameMap->>Oops : oops.res.load(resPrefab)
|
||||
Oops-->>GameMap : Prefab
|
||||
GameMap->>GameMap : instantiate(res)
|
||||
GameMap->>GameMap : add(map.getChildByName("map").getComponent(MapViewComp))
|
||||
MapView->>MapView : start()
|
||||
MapView->>MapView : getComponent(MapViewScene)
|
||||
MapViewScene->>MapViewScene : 初始化各图层引用
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
- [LoadingViewComp.ts](file://assets/script/game/initialize/view/LoadingViewComp.ts#L1-L90)
|
||||
|
||||
### MapLayer 分析
|
||||
`MapLayer` 组件负责管理地图的背景图像。它通过 `@property(Sprite)` 装饰器引用一个 Sprite 组件(`bgImg`),用于显示地图背景。`init` 方法根据背景图的尺寸设置自身的宽高,`clear` 方法则用于清除当前的背景图片。`width` 和 `height` 属性通过访问 `bgImg` 的 `UITransform` 组件来获取实际尺寸。
|
||||
|
||||
**Section sources**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L47)
|
||||
|
||||
### EntityLayer 分析
|
||||
`EntityLayer` 组件管理地图上的所有游戏实体,如角色、怪物等。其 `update` 方法中包含一个定时器(`timer`),可用于定期执行深度排序等操作,以确保实体的正确渲染顺序。`clear` 方法遍历并清理所有子节点,为地图切换做准备。注释中提到深度排序可能成为性能瓶颈,建议在必要时优化为非每帧执行。
|
||||
|
||||
**Section sources**
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L39)
|
||||
|
||||
### MoveUV 分析
|
||||
`MoveUV` 组件实现了动态纹理偏移效果,用于模拟水流、云层移动等视觉效果。它通过 `moveSpeedX` 和 `moveSpeedY` 属性控制纹理在 X 和 Y 方向上的移动速度。在 `update` 方法中,它获取 `Sprite` 组件的 `spriteFrame`,修改其 `rect` 的 `x` 和 `y` 值,从而实现 UV 坐标的偏移。`wrapMode` 属性确保纹理在边缘处重复,形成无缝滚动效果。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([MoveUV.update]) --> GetSprite["获取Sprite组件"]
|
||||
GetSprite --> CheckWrapMode{"WrapMode变化?"}
|
||||
CheckWrapMode --> |是| UpdateWrap["更新纹理WrapMode"]
|
||||
CheckWrapMode --> |否| UpdateRect["更新Rect坐标"]
|
||||
UpdateWrap --> UpdateRect
|
||||
UpdateRect --> ApplyRect["设置spriteFrame.rect"]
|
||||
ApplyRect --> MarkUpdate["标记渲染数据更新"]
|
||||
MarkUpdate --> End([结束])
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L1-L50)
|
||||
|
||||
## 依赖分析
|
||||
地图系统依赖于 Cocos Creator 引擎的核心模块(如 `cc`),以及项目中的 `oops-plugin-framework` 框架。`MapViewComp` 和 `MapViewScene` 依赖于 `oops` 对象进行资源加载和消息通信。`EntityLayer` 和 `SkillLayer` 依赖于框架中的 `Timer` 类。各图层组件之间通过 `MapViewScene` 进行协调,没有直接的相互依赖,保证了模块的独立性。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
MapViewComp --> oops[Oops Framework]
|
||||
MapViewScene --> oops
|
||||
EntityLayer --> Timer[Timer Class]
|
||||
SkillLayer --> Timer
|
||||
SkillLayer --> oops
|
||||
MapViewComp --> MapViewScene
|
||||
MapViewScene --> MapLayer
|
||||
MapViewScene --> EntityLayer
|
||||
MapViewScene --> SkillLayer
|
||||
GameMap --> MapModelComp
|
||||
GameMap --> MapViewComp
|
||||
GameMap --> oops
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L45)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L39)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L1-L48)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
|
||||
**Section sources**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L45)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L39)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L1-L48)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
|
||||
## 性能考虑
|
||||
- **深度排序**: `EntityLayer` 和 `SkillLayer` 中的每帧深度排序可能成为性能瓶颈,尤其是在实体数量众多时。建议根据实际需求,将排序频率降低(如每0.2秒一次)或采用空间分区等更高效的排序算法。
|
||||
- **纹理重复**: `MoveUV` 组件通过修改 `spriteFrame.rect` 来实现动画,这是一种轻量级的方法,避免了创建额外的动画帧,对性能友好。
|
||||
- **资源加载**: `GameMap.load()` 方法异步加载地图预制体,避免了主线程阻塞,保证了游戏的流畅性。
|
||||
- **节点清理**: `MapViewScene.reset()` 方法显式清理各图层的子节点,防止内存泄漏。
|
||||
|
||||
## 故障排除指南
|
||||
- **地图未显示**: 检查 `MapModelComp.resPrefab` 路径是否正确,确认预制体资源已正确导入。
|
||||
- **UV动画无效**: 确保应用 `MoveUV` 组件的精灵(Sprite)的纹理(Texture)Wrap Mode 设置为 `REPEAT`,否则偏移效果将不可见。
|
||||
- **实体层排序异常**: 如果发现实体渲染顺序错误,检查 `EntityLayer.update()` 中的排序逻辑是否被正确执行,或尝试调整 `Timer` 的间隔。
|
||||
- **摄像机不跟随**: 确认 `MapViewScene.isFollowPlayer` 属性已启用,并检查摄像机跟随的逻辑是否在其他地方被实现(当前代码中未找到具体实现)。
|
||||
|
||||
**Section sources**
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts#L1-L43)
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L1-L50)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L1-L39)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
|
||||
## 结论
|
||||
本项目中的地图视图系统设计清晰,采用 MVC 和 ECS 模式实现了良好的代码组织和可维护性。`MapViewComp` 和 `MapViewScene` 协同工作,构建了地图场景的骨架。通过 `MapLayer`、`EntityLayer` 和 `SkillLayer` 等组件实现了分层渲染,便于管理和优化。`MoveUV` 组件提供了一种简单有效的动态纹理动画方案。开发者可以基于此架构轻松扩展新功能,如添加新的图层类型或实现更复杂的地图特效。
|
||||
495
.qoder/repowiki/zh/content/地图系统/地图视图/地图视图控制.md
Normal file
495
.qoder/repowiki/zh/content/地图系统/地图视图/地图视图控制.md
Normal file
@@ -0,0 +1,495 @@
|
||||
# 地图视图控制
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
|
||||
- [MapView.ts](file://assets/script/game/map/MapView.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [move.ts](file://assets/script/game/map/move.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
地图视图控制系统是Cocos Creator游戏引擎中负责地图渲染和用户交互的核心模块。该系统采用ECS(Entity-Component-System)架构模式,通过MapViewComp作为主要控制器,协调MapViewScene场景管理和各个视图层的渲染工作。系统实现了完整的地图生命周期管理,包括初始化、资源加载、事件监听、定时器管理等功能。
|
||||
|
||||
## 项目结构
|
||||
|
||||
地图视图控制系统的文件组织遵循清晰的层次结构:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "地图视图控制架构"
|
||||
GameMap["GameMap<br/>游戏地图实体"]
|
||||
MapViewComp["MapViewComp<br/>地图视图组件"]
|
||||
MapViewScene["MapViewScene<br/>地图场景逻辑"]
|
||||
subgraph "视图层"
|
||||
MapLayer["MapLayer<br/>地图背景层"]
|
||||
EntityLayer["EntityLayer<br/>实体层"]
|
||||
SkillLayer["SkillLayer<br/>技能特效层"]
|
||||
end
|
||||
subgraph "模型组件"
|
||||
MapModelComp["MapModelComp<br/>地图模型组件"]
|
||||
end
|
||||
subgraph "事件系统"
|
||||
GameEvent["GameEvent<br/>游戏事件定义"]
|
||||
end
|
||||
end
|
||||
GameMap --> MapViewComp
|
||||
MapViewComp --> MapViewScene
|
||||
MapViewScene --> MapLayer
|
||||
MapViewScene --> EntityLayer
|
||||
MapViewScene --> SkillLayer
|
||||
MapViewComp --> MapModelComp
|
||||
GameEvent --> MapViewComp
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L45)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
|
||||
**章节来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L45)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### GameMap - 游戏地图实体
|
||||
|
||||
GameMap是地图系统的根实体,继承自ecs.Entity,负责管理地图的完整生命周期。它通过ECS框架注册为游戏实体,包含MapModelComp和MapViewComp两个核心组件。
|
||||
|
||||
### MapViewComp - 地图视图控制器
|
||||
|
||||
MapViewComp作为地图表现层的主要控制器,承担以下职责:
|
||||
- 初始化地图场景环境
|
||||
- 管理资源加载流程
|
||||
- 处理生命周期事件
|
||||
- 协调与其他组件的交互
|
||||
|
||||
### MapViewScene - 场景逻辑管理器
|
||||
|
||||
MapViewScene负责具体的场景逻辑实现,包括:
|
||||
- 摄像机跟随逻辑
|
||||
- 层级结构管理
|
||||
- 场景状态控制
|
||||
- 更新循环处理
|
||||
|
||||
**章节来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L15-L36)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L12-L45)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L15-L77)
|
||||
|
||||
## 架构概览
|
||||
|
||||
地图视图控制系统采用分层架构设计,确保了良好的模块化和可维护性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant GM as GameMap
|
||||
participant MC as MapViewComp
|
||||
participant MS as MapViewScene
|
||||
participant ML as MapLayer
|
||||
participant EL as EntityLayer
|
||||
participant SL as SkillLayer
|
||||
GM->>MC : 创建地图实体
|
||||
MC->>MS : 获取场景组件
|
||||
MS->>ML : 初始化地图层
|
||||
MS->>EL : 初始化实体层
|
||||
MS->>SL : 初始化技能层
|
||||
MC->>MC : 启动事件监听
|
||||
MC->>MC : 启动定时器
|
||||
loop 游戏更新循环
|
||||
MC->>MS : 更新场景状态
|
||||
MS->>ML : 更新地图渲染
|
||||
MS->>EL : 更新实体渲染
|
||||
MS->>SL : 更新技能渲染
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L25-L36)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L28-L32)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L42-L77)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### MapViewComp - 地图视图控制器详解
|
||||
|
||||
MapViewComp是地图系统的核心控制器,实现了完整的生命周期管理和事件处理机制。
|
||||
|
||||
#### 生命周期管理
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([组件启动]) --> OnLoad["onLoad()<br/>监听全局事件"]
|
||||
OnLoad --> Start["start()<br/>获取场景实例"]
|
||||
Start --> InitScene["初始化场景<br/>scene = getComponent(MapViewScene)"]
|
||||
InitScene --> LoadData["load_data()<br/>加载数据"]
|
||||
LoadData --> UpdateLoop["update()<br/>主更新循环"]
|
||||
UpdateLoop --> Reset["reset()<br/>清理资源"]
|
||||
Reset --> End([组件销毁])
|
||||
UpdateLoop --> TimerCheck{"定时器检查"}
|
||||
TimerCheck --> |触发| TimerAction["执行定时任务"]
|
||||
TimerAction --> UpdateLoop
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L18-L45)
|
||||
|
||||
#### 事件监听与定时器管理
|
||||
|
||||
MapViewComp内部集成了Timer类来管理游戏定时器,提供了灵活的时间控制机制:
|
||||
|
||||
- **game_timer**: 主要游戏定时器,间隔为1秒
|
||||
- **EntityLayer.timer**: 实体层级定时器,间隔为0.2秒
|
||||
- **SkillLayer.timer**: 技能特效定时器,间隔为0.2秒
|
||||
|
||||
#### 资源加载机制
|
||||
|
||||
系统通过GameMap实体的load方法实现地图资源的异步加载:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant GM as GameMap
|
||||
participant OOPS as Oops资源系统
|
||||
participant Prefab as 地图预制件
|
||||
participant MC as MapViewComp
|
||||
GM->>OOPS : 加载地图资源
|
||||
OOPS->>Prefab : 获取地图预制件
|
||||
Prefab->>GM : 返回实例化对象
|
||||
GM->>MC : 添加地图视图组件
|
||||
MC->>MC : 初始化组件状态
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L25-L36)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L28-L32)
|
||||
|
||||
**章节来源**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L12-L45)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L25-L36)
|
||||
|
||||
### MapViewScene - 场景逻辑管理器
|
||||
|
||||
MapViewScene负责具体的场景逻辑实现,是地图渲染的核心调度器。
|
||||
|
||||
#### 场景节点结构
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MapViewScene {
|
||||
+Camera camera
|
||||
+Node layer
|
||||
+MapLayer mapLayer
|
||||
+Node floorLayer
|
||||
+EntityLayer entityLayer
|
||||
+SkillLayer SkillLayer
|
||||
+boolean isFollowPlayer
|
||||
+Vec2 ratio
|
||||
+onLoad() void
|
||||
+start() void
|
||||
+init() void
|
||||
+update(dt) void
|
||||
+reset() void
|
||||
+clear() void
|
||||
}
|
||||
class MapLayer {
|
||||
+Sprite bgImg
|
||||
+init() void
|
||||
+clear() void
|
||||
+width() number
|
||||
+height() number
|
||||
}
|
||||
class EntityLayer {
|
||||
+Timer timer
|
||||
+update(dt) void
|
||||
+clear() void
|
||||
}
|
||||
class SkillLayer {
|
||||
+Prefab light
|
||||
+Timer timer
|
||||
+onLoad() void
|
||||
+doSkill() void
|
||||
+update(dt) void
|
||||
+clear() void
|
||||
}
|
||||
MapViewScene --> MapLayer : "管理"
|
||||
MapViewScene --> EntityLayer : "管理"
|
||||
MapViewScene --> SkillLayer : "管理"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L15-L77)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L15-L47)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L18-L39)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L18-L48)
|
||||
|
||||
#### 摄像机跟随逻辑
|
||||
|
||||
MapViewScene实现了摄像机跟随玩家的功能,通过isFollowPlayer属性控制:
|
||||
|
||||
- **启用跟随**: 当isFollowPlayer为true时,摄像机会根据玩家位置自动调整
|
||||
- **比例转换**: 使用ratio属性在2D坐标和3D坐标之间进行转换
|
||||
- **平滑移动**: 通过update方法实现摄像机的平滑跟随效果
|
||||
|
||||
#### 层级管理
|
||||
|
||||
系统采用分层渲染架构,每一层都有特定的职责:
|
||||
|
||||
1. **floorLayer**: 地面层,负责地形和背景元素
|
||||
2. **entityLayer**: 实体层,负责游戏角色和物体
|
||||
3. **SkillLayer**: 技能特效层,负责技能动画和特效
|
||||
4. **mapLayer**: 地图背景层,负责静态地图纹理
|
||||
|
||||
**章节来源**
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L15-L77)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L15-L47)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L18-L39)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L18-L48)
|
||||
|
||||
### 视图层组件详解
|
||||
|
||||
#### MapLayer - 地图背景层
|
||||
|
||||
MapLayer专门负责地图背景的渲染和管理:
|
||||
|
||||
- **背景图片管理**: 通过bgImg属性管理地图背景精灵
|
||||
- **尺寸控制**: 提供width和height属性控制地图尺寸
|
||||
- **清理功能**: clear方法用于清除背景图片
|
||||
|
||||
#### EntityLayer - 实体层
|
||||
|
||||
EntityLayer负责游戏实体的渲染和管理:
|
||||
|
||||
- **深度排序**: 通过zIndexSort方法对实体进行深度排序
|
||||
- **定时更新**: 使用Timer进行定期的实体状态更新
|
||||
- **性能优化**: 可配置的更新频率以平衡性能和效果
|
||||
|
||||
#### SkillLayer - 技能特效层
|
||||
|
||||
SkillLayer专门处理技能特效和动画:
|
||||
|
||||
- **特效预制件**: 通过light属性管理技能特效预制件
|
||||
- **事件响应**: 响应技能使用事件播放特效
|
||||
- **清理机制**: 提供clear方法清理所有特效对象
|
||||
|
||||
**章节来源**
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L15-L47)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L18-L39)
|
||||
- [SkillLayer.ts](file://assets/script/game/map/view/map/layer/SkillLayer.ts#L18-L48)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
地图视图控制系统的依赖关系体现了清晰的分层架构:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "外部依赖"
|
||||
Cocos["Cocos Creator Engine"]
|
||||
Oops["Oops Framework"]
|
||||
ECS["ECS Framework"]
|
||||
end
|
||||
subgraph "核心组件"
|
||||
GameMap["GameMap"]
|
||||
MapViewComp["MapViewComp"]
|
||||
MapViewScene["MapViewScene"]
|
||||
end
|
||||
subgraph "视图层"
|
||||
MapLayer["MapLayer"]
|
||||
EntityLayer["EntityLayer"]
|
||||
SkillLayer["SkillLayer"]
|
||||
end
|
||||
subgraph "模型组件"
|
||||
MapModelComp["MapModelComp"]
|
||||
end
|
||||
subgraph "工具类"
|
||||
Timer["Timer"]
|
||||
GameEvent["GameEvent"]
|
||||
end
|
||||
Cocos --> GameMap
|
||||
Oops --> GameMap
|
||||
ECS --> GameMap
|
||||
GameMap --> MapViewComp
|
||||
MapViewComp --> MapViewScene
|
||||
MapViewScene --> MapLayer
|
||||
MapViewScene --> EntityLayer
|
||||
MapViewScene --> SkillLayer
|
||||
GameMap --> MapModelComp
|
||||
MapViewComp --> Timer
|
||||
MapViewComp --> GameEvent
|
||||
EntityLayer --> Timer
|
||||
SkillLayer --> Timer
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L10)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L11)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L10)
|
||||
|
||||
### 组件间通信
|
||||
|
||||
系统通过多种方式实现组件间的通信:
|
||||
|
||||
1. **事件系统**: 使用oops.message进行全局事件通信
|
||||
2. **组件引用**: 通过getComponent方法直接访问其他组件
|
||||
3. **实体管理**: 通过ecs.Entity管理组件关系
|
||||
4. **配置共享**: 通过SingletonModuleComp共享配置数据
|
||||
|
||||
**章节来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L1-L45)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts#L1-L77)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 内存管理
|
||||
|
||||
系统在多个层面实现了内存优化:
|
||||
|
||||
1. **组件复用**: 通过ECS框架实现组件的高效复用
|
||||
2. **延迟加载**: 地图资源采用异步加载策略
|
||||
3. **及时清理**: 在reset方法中清理不再需要的对象引用
|
||||
4. **定时器管理**: 合理配置定时器间隔避免过度计算
|
||||
|
||||
### 渲染优化
|
||||
|
||||
- **分层渲染**: 通过不同层级减少不必要的渲染计算
|
||||
- **批量操作**: 使用removeAllChildren等批量方法提高效率
|
||||
- **条件更新**: update方法中仅在必要时执行更新逻辑
|
||||
|
||||
### 事件处理优化
|
||||
|
||||
- **事件去重**: 避免重复监听相同事件
|
||||
- **及时解绑**: 在组件销毁时及时移除事件监听器
|
||||
- **弱引用**: 使用弱引用避免循环引用导致的内存泄漏
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 资源未释放问题
|
||||
|
||||
**问题描述**: 地图切换或重新加载时出现内存泄漏
|
||||
|
||||
**解决方案**:
|
||||
1. 在reset方法中添加资源清理逻辑
|
||||
2. 确保所有事件监听器都被正确移除
|
||||
3. 使用Timer的stop方法停止定时器
|
||||
|
||||
```typescript
|
||||
// 示例清理代码
|
||||
reset(): void {
|
||||
// 清理事件监听
|
||||
oops.message.offAll(this);
|
||||
|
||||
// 清理定时器
|
||||
this.game_timer.stop();
|
||||
|
||||
// 清理场景资源
|
||||
if (this.scene) {
|
||||
this.scene.reset();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 事件重复监听问题
|
||||
|
||||
**问题描述**: 地图多次加载导致事件监听器重复绑定
|
||||
|
||||
**解决方案**:
|
||||
1. 在onLoad方法中添加事件监听前的检查
|
||||
2. 使用唯一标识符管理事件监听器
|
||||
3. 在组件销毁时确保所有监听器被移除
|
||||
|
||||
```typescript
|
||||
// 示例事件监听解决方案
|
||||
async onLoad(){
|
||||
// 检查是否已存在监听器
|
||||
if (!this.eventListeners) {
|
||||
this.eventListeners = new Set();
|
||||
this.setupEventListeners();
|
||||
}
|
||||
}
|
||||
|
||||
setupEventListeners(): void {
|
||||
const events = [
|
||||
GameEvent.MAP_MOVE_END_LEFT,
|
||||
GameEvent.MAP_MOVE_END_RIGHT
|
||||
];
|
||||
|
||||
events.forEach(event => {
|
||||
oops.message.on(event, this.handleEvent, this);
|
||||
this.eventListeners.add(event);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### 定时器管理问题
|
||||
|
||||
**问题描述**: 定时器未正确停止导致持续运行
|
||||
|
||||
**解决方案**:
|
||||
1. 在组件销毁时停止所有定时器
|
||||
2. 使用try-catch块保护定时器操作
|
||||
3. 提供定时器状态检查方法
|
||||
|
||||
```typescript
|
||||
// 示例定时器管理
|
||||
class MapViewComp extends CCComp {
|
||||
private timers: Timer[] = [];
|
||||
|
||||
createTimer(interval: number): Timer {
|
||||
const timer = new Timer(interval);
|
||||
this.timers.push(timer);
|
||||
return timer;
|
||||
}
|
||||
|
||||
onDestroy(): void {
|
||||
// 停止所有定时器
|
||||
this.timers.forEach(timer => timer.stop());
|
||||
this.timers = [];
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 调试技巧
|
||||
|
||||
1. **日志记录**: 在关键方法中添加调试日志
|
||||
2. **状态检查**: 定期检查组件状态的一致性
|
||||
3. **性能监控**: 使用Cocos Creator的性能分析工具
|
||||
4. **单元测试**: 为关键功能编写单元测试
|
||||
|
||||
**章节来源**
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts#L25-L30)
|
||||
- [move.ts](file://assets/script/game/map/move.ts#L18-L25)
|
||||
|
||||
## 结论
|
||||
|
||||
地图视图控制系统展现了现代游戏开发中优秀的架构设计原则。通过ECS模式的应用,系统实现了高度的模块化和可扩展性。MapViewComp作为核心控制器,有效协调了场景逻辑、视图渲染和用户交互之间的关系。
|
||||
|
||||
系统的主要优势包括:
|
||||
|
||||
1. **清晰的分层架构**: 从实体到组件再到视图层的清晰分离
|
||||
2. **灵活的生命周期管理**: 完整的组件生命周期支持
|
||||
3. **高效的资源管理**: 异步加载和及时清理机制
|
||||
4. **强大的事件系统**: 基于消息传递的松耦合通信
|
||||
5. **完善的错误处理**: 全面的资源清理和异常处理机制
|
||||
|
||||
对于开发者而言,理解和掌握这套系统的设计理念和实现细节,有助于构建更加稳定和高性能的游戏应用。同时,系统提供的故障排除指南和最佳实践,为后续的维护和扩展奠定了坚实的基础。
|
||||
300
.qoder/repowiki/zh/content/地图系统/地图视图/地图视觉特效.md
Normal file
300
.qoder/repowiki/zh/content/地图系统/地图视图/地图视觉特效.md
Normal file
@@ -0,0 +1,300 @@
|
||||
# 地图视觉特效
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts)
|
||||
- [light.ts](file://assets/script/game/map/view/map/layer/light.ts)
|
||||
- [MapViewScene.ts](file://assets/script/game/map/view/MapViewScene.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
MoveUV组件是Cocos Creator游戏引擎中用于实现动态纹理滚动效果的核心组件。它通过动态修改SpriteFrame的rect偏移量,实现了流畅的纹理动画效果,广泛应用于模拟水流、移动地面、动态背景等视觉特效。该组件提供了灵活的速度控制和纹理包装模式设置,支持多种动画效果的实现。
|
||||
|
||||
## 项目结构
|
||||
|
||||
MoveUV组件位于地图视图模块中,与其他地图相关组件协同工作,形成完整的地图渲染系统。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "地图视图模块"
|
||||
MoveUV["MoveUV组件<br/>纹理滚动控制器"]
|
||||
MapLayer["MapLayer<br/>地图背景层"]
|
||||
EntityLayer["EntityLayer<br/>实体对象层"]
|
||||
Light["light<br/>光照效果"]
|
||||
end
|
||||
subgraph "地图模型"
|
||||
GameMap["GameMap<br/>游戏地图实体"]
|
||||
MapModel["MapModelComp<br/>地图模型组件"]
|
||||
end
|
||||
subgraph "渲染系统"
|
||||
Sprite["Sprite组件<br/>精灵渲染器"]
|
||||
SpriteFrame["SpriteFrame<br/>精灵帧"]
|
||||
Texture2D["Texture2D<br/>纹理资源"]
|
||||
end
|
||||
GameMap --> MapModel
|
||||
GameMap --> MoveUV
|
||||
MoveUV --> Sprite
|
||||
Sprite --> SpriteFrame
|
||||
SpriteFrame --> Texture2D
|
||||
MapLayer --> Sprite
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L1-L50)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L47)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L35)
|
||||
|
||||
**章节来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L1-L50)
|
||||
- [MapLayer.ts](file://assets/script/game/map/view/map/layer/MapLayer.ts#L1-L47)
|
||||
|
||||
## 核心组件
|
||||
|
||||
MoveUV组件是一个专门负责纹理滚动动画的脚本组件,具有以下核心特性:
|
||||
|
||||
### 主要功能特性
|
||||
- **动态UV坐标控制**:通过修改SpriteFrame的rect属性实现纹理偏移
|
||||
- **双轴速度控制**:独立控制X轴和Y轴的滚动速度
|
||||
- **多种包装模式**:支持REPEAT、MIRRORED_REPEAT、CLAMP_TO_EDGE等纹理包装方式
|
||||
- **高效渲染优化**:仅在必要时标记渲染数据更新,避免不必要的重绘
|
||||
|
||||
### 核心属性配置
|
||||
- `moveSpeedX`:X轴方向的滚动速度,正值向右,负值向左
|
||||
- `moveSpeedY`:Y轴方向的滚动速度,正值向上,负值向下
|
||||
- `wrapMode`:纹理包装模式,决定纹理超出边界时的行为
|
||||
|
||||
**章节来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L8-L15)
|
||||
|
||||
## 架构概览
|
||||
|
||||
MoveUV组件采用组件化设计,与Cocos Creator的渲染管线紧密集成,形成了高效的纹理动画系统。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Scene as "场景初始化"
|
||||
participant MoveUV as "MoveUV组件"
|
||||
participant Sprite as "Sprite组件"
|
||||
participant Render as "渲染系统"
|
||||
Scene->>MoveUV : onLoad()
|
||||
MoveUV->>Sprite : 获取Sprite组件
|
||||
Sprite-->>MoveUV : 返回Sprite实例
|
||||
MoveUV->>MoveUV : 初始化_rect变量
|
||||
MoveUV->>Sprite : 设置packable=false
|
||||
loop 每帧更新
|
||||
Scene->>MoveUV : update(dt)
|
||||
MoveUV->>MoveUV : 检查wrapMode变化
|
||||
MoveUV->>Sprite : 更新_rect坐标
|
||||
MoveUV->>Sprite : markForUpdateRenderData()
|
||||
Sprite->>Render : 触发渲染更新
|
||||
Render-->>Scene : 显示更新后的纹理
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L25-L49)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### MoveUV组件核心实现
|
||||
|
||||
MoveUV组件通过精确控制SpriteFrame的rect属性来实现纹理滚动效果,其核心算法如下:
|
||||
|
||||
#### 初始化阶段(onLoad)
|
||||
|
||||
组件在加载时执行以下初始化操作:
|
||||
|
||||
1. **组件获取验证**:确保当前节点包含有效的Sprite组件
|
||||
2. **初始状态设置**:复制原始SpriteFrame的rect作为起始坐标
|
||||
3. **性能优化配置**:禁用spriteFrame的packable属性以提高渲染效率
|
||||
|
||||
#### 动画更新机制(update)
|
||||
|
||||
每帧更新过程包含以下关键步骤:
|
||||
|
||||
1. **包装模式检查**:比较当前wrapMode与上次记录值,如有变化则更新纹理设置
|
||||
2. **UV坐标计算**:基于移动速度和时间增量计算新的坐标位置
|
||||
3. **渲染数据标记**:通知渲染系统更新纹理数据
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([update函数开始]) --> CheckWrapMode["检查wrapMode变化"]
|
||||
CheckWrapMode --> WrapChanged{"包装模式改变?"}
|
||||
WrapChanged --> |是| UpdateWrapMode["更新纹理包装模式"]
|
||||
WrapChanged --> |否| SkipWrap["跳过包装模式更新"]
|
||||
UpdateWrapMode --> CalcNewPos["计算新UV坐标<br/>x += moveSpeedX * dt<br/>y += moveSpeedY * dt"]
|
||||
SkipWrap --> CalcNewPos
|
||||
CalcNewPos --> UpdateRect["更新SpriteFrame.rect"]
|
||||
UpdateRect --> MarkRender["markForUpdateRenderData()"]
|
||||
MarkRender --> End([update函数结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L35-L49)
|
||||
|
||||
**章节来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L25-L49)
|
||||
|
||||
### 纹理包装模式详解
|
||||
|
||||
MoveUV组件支持三种主要的纹理包装模式,每种模式对应不同的视觉效果:
|
||||
|
||||
| 包装模式 | 值 | 视觉效果 | 应用场景 |
|
||||
|---------|---|---------|---------|
|
||||
| REPEAT | 1001 | 纹理重复平铺 | 流水、地面移动、背景循环 |
|
||||
| MIRRORED_REPEAT | 1002 | 镜像重复平铺 | 对称动画、特殊效果 |
|
||||
| CLAMP_TO_EDGE | 1000 | 边缘拉伸 | 单次动画、边缘处理 |
|
||||
|
||||
#### REPEAT模式的工作原理
|
||||
|
||||
当wrapMode设置为REPEAT时,纹理会在超出边界时自动重复平铺。MoveUV组件通过不断修改rect的x和y坐标,创造出无限循环的滚动效果:
|
||||
|
||||
- **水平滚动**:通过增加rect.x值实现从左到右的滚动
|
||||
- **垂直滚动**:通过增加rect.y值实现从下到上的滚动
|
||||
- **循环无缝**:由于REPEAT模式的存在,当纹理到达边界时会自动重新开始
|
||||
|
||||
**章节来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L13-L15)
|
||||
|
||||
### 性能优化策略
|
||||
|
||||
MoveUV组件采用了多项性能优化措施:
|
||||
|
||||
#### 渲染数据更新优化
|
||||
- **条件性标记**:仅在必要时调用`markForUpdateRenderData()`,避免频繁的渲染更新
|
||||
- **包装模式缓存**:通过`_currentWrapMode`变量避免重复设置相同的包装模式
|
||||
- **最小化操作**:每次更新只修改必要的rect坐标,减少计算开销
|
||||
|
||||
#### 内存管理优化
|
||||
- **packable禁用**:设置spriteFrame.packable为false,防止不必要的内存分配
|
||||
- **局部变量复用**:使用预定义的_rect变量,避免频繁的对象创建
|
||||
|
||||
**章节来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L30-L32)
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L47-L49)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
MoveUV组件与多个系统和组件存在密切的依赖关系:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "外部依赖"
|
||||
CC["Cocos Creator引擎"]
|
||||
Texture2D["Texture2D类"]
|
||||
Sprite["Sprite组件"]
|
||||
Rect["rect工具函数"]
|
||||
end
|
||||
subgraph "内部组件"
|
||||
MoveUV["MoveUV组件"]
|
||||
MapLayer["MapLayer地图层"]
|
||||
EntityLayer["EntityLayer实体层"]
|
||||
end
|
||||
CC --> Texture2D
|
||||
CC --> Sprite
|
||||
CC --> Rect
|
||||
MoveUV --> Texture2D
|
||||
MoveUV --> Sprite
|
||||
MoveUV --> Rect
|
||||
MapLayer --> MoveUV
|
||||
EntityLayer --> MoveUV
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L1-L7)
|
||||
|
||||
### 关键依赖说明
|
||||
|
||||
1. **Cocos Creator引擎**:MoveUV组件依赖于引擎提供的核心功能
|
||||
2. **Texture2D类**:用于设置纹理的包装模式
|
||||
3. **Sprite组件**:作为MoveUV的目标渲染对象
|
||||
4. **rect工具**:提供矩形区域的创建和操作功能
|
||||
|
||||
**章节来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L1-L7)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 渲染性能优化
|
||||
|
||||
MoveUV组件的设计充分考虑了渲染性能,采用了以下优化策略:
|
||||
|
||||
#### 减少渲染调用
|
||||
- **批量更新**:通过`markForUpdateRenderData()`统一标记渲染更新
|
||||
- **条件检查**:只有在包装模式发生变化时才更新纹理设置
|
||||
- **最小化操作**:每次更新只修改必要的rect坐标
|
||||
|
||||
#### 内存使用优化
|
||||
- **对象复用**:使用预定义的rect对象避免频繁创建
|
||||
- **资源管理**:正确设置spriteFrame的packable属性
|
||||
|
||||
### 性能监控建议
|
||||
|
||||
为了确保最佳性能,建议开发者注意以下几点:
|
||||
|
||||
1. **避免频繁切换包装模式**:包装模式的切换会触发额外的GPU操作
|
||||
2. **合理设置移动速度**:过高的速度可能导致视觉效果不自然
|
||||
3. **监控渲染调用频率**:确保不会出现过度的渲染更新
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 1. 纹理滚动不生效
|
||||
**可能原因**:
|
||||
- Sprite组件未正确添加到节点
|
||||
- MoveUV组件未正确挂载
|
||||
- 纹理资源未正确设置
|
||||
|
||||
**解决方案**:
|
||||
- 检查节点是否包含Sprite组件
|
||||
- 验证MoveUV组件已正确挂载
|
||||
- 确认纹理资源已正确加载
|
||||
|
||||
#### 2. 包装模式设置无效
|
||||
**可能原因**:
|
||||
- wrapMode属性值设置错误
|
||||
- 纹理格式不支持特定包装模式
|
||||
|
||||
**解决方案**:
|
||||
- 使用正确的枚举值(REPEAT、MIRRORED_REPEAT、CLAMP_TO_EDGE)
|
||||
- 检查纹理格式兼容性
|
||||
|
||||
#### 3. 性能问题
|
||||
**可能原因**:
|
||||
- 频繁的渲染数据更新
|
||||
- 不当的移动速度设置
|
||||
|
||||
**解决方案**:
|
||||
- 优化移动速度设置
|
||||
- 减少不必要的组件更新
|
||||
|
||||
**章节来源**
|
||||
- [MoveUV.ts](file://assets/script/game/map/view/MoveUV.ts#L26-L32)
|
||||
|
||||
## 结论
|
||||
|
||||
MoveUV组件是一个设计精良的地图视觉特效组件,通过巧妙地利用Cocos Creator的SpriteFrame系统,实现了高效且灵活的纹理滚动效果。其核心优势包括:
|
||||
|
||||
1. **简洁的API设计**:通过简单的属性配置即可实现复杂的动画效果
|
||||
2. **优秀的性能表现**:采用多种优化策略,确保流畅的运行性能
|
||||
3. **灵活的效果控制**:支持多种包装模式和速度配置
|
||||
4. **良好的集成性**:与Cocos Creator生态系统完美融合
|
||||
|
||||
该组件为游戏开发中的动态背景、流水效果、移动地面等视觉需求提供了标准化的解决方案,是地图视觉特效开发的重要工具。开发者可以基于MoveUV组件快速实现各种创意性的纹理动画效果,同时保持良好的性能表现。
|
||||
490
.qoder/repowiki/zh/content/地图系统/怪物系统/属性系统.md
Normal file
490
.qoder/repowiki/zh/content/地图系统/怪物系统/属性系统.md
Normal file
@@ -0,0 +1,490 @@
|
||||
# 属性系统
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
- [Mission.ts](file://assets/script/game/common/config/Mission.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
英雄属性系统是游戏战斗机制的核心组成部分,负责管理角色的基础属性、动态计算和战斗中的属性变化。该系统通过strengthMultiplier强度倍率实现了基于配置数据的动态属性缩放机制,支持HP、AP、DEF、SPEED等基础属性的精确计算,并提供了完整的buff/debuff管理系统。
|
||||
|
||||
系统采用模块化设计,将属性定义、计算逻辑、配置管理和运行时控制分离,确保了良好的可维护性和扩展性。通过HeroAttrs.ts中的getAttrs与getNeAttrs函数,系统建立了完整的属性容器构建逻辑,支持英雄和怪物的统一属性管理。
|
||||
|
||||
## 项目结构
|
||||
|
||||
属性系统的核心文件分布在以下目录结构中:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "配置层"
|
||||
A[HeroAttrs.ts] --> B[属性枚举定义]
|
||||
A --> C[属性类型配置]
|
||||
A --> D[职业成长配置]
|
||||
E[heroSet.ts] --> F[英雄配置数据]
|
||||
E --> G[怪物配置数据]
|
||||
end
|
||||
subgraph "实体层"
|
||||
H[Hero.ts] --> I[英雄实体]
|
||||
J[Mon.ts] --> K[怪物实体]
|
||||
end
|
||||
subgraph "视图层"
|
||||
L[HeroViewComp.ts] --> M[属性计算引擎]
|
||||
L --> N[Buff系统]
|
||||
L --> O[负面状态管理]
|
||||
end
|
||||
A --> L
|
||||
E --> H
|
||||
E --> J
|
||||
H --> L
|
||||
J --> L
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L546)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L152)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L780)
|
||||
|
||||
**章节来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L100)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L50)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 属性枚举系统
|
||||
|
||||
属性系统定义了完整的属性分类体系,涵盖基础生存、攻击、防御、特殊效果等多个维度:
|
||||
|
||||
| 属性类别 | 属性名称 | 类型 | 描述 |
|
||||
|---------|---------|------|------|
|
||||
| 基础生存 | HP_MAX | 数值型 | 最大生命值 |
|
||||
| 基础生存 | MP_MAX | 数值型 | 最大魔法值 |
|
||||
| 攻击属性 | AP | 数值型 | 攻击力 |
|
||||
| 攻击属性 | MAP | 数值型 | 魔法攻击力 |
|
||||
| 防御属性 | DEF | 数值型 | 物理防御 |
|
||||
| 防御属性 | MDEF | 数值型 | 魔法防御 |
|
||||
| 特殊效果 | SPEED | 百分比型 | 移动速度加成 |
|
||||
| 特殊效果 | CRITICAL | 百分比型 | 暴击率 |
|
||||
|
||||
### Buff类型系统
|
||||
|
||||
系统支持两种类型的Buff效果:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class BType {
|
||||
+VALUE : 0
|
||||
+RATIO : 1
|
||||
}
|
||||
class BuffInstance {
|
||||
+number value
|
||||
+BType BType
|
||||
+number remainTime
|
||||
}
|
||||
class HeroViewComp {
|
||||
+Record~number, Array~ BUFFS
|
||||
+Record~number, Array~ BUFFS_TEMP
|
||||
+recalculateSingleAttr(attrIndex)
|
||||
+addBuff(buffConf)
|
||||
+clearBuffs(attrIndex, isBuff)
|
||||
}
|
||||
HeroViewComp --> BuffInstance
|
||||
BuffInstance --> BType
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L5-L15)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L95-L110)
|
||||
|
||||
**章节来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L20-L100)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L72-L120)
|
||||
|
||||
## 架构概览
|
||||
|
||||
属性系统采用分层架构设计,实现了清晰的职责分离:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[配置层] --> B[计算层]
|
||||
B --> C[运行时层]
|
||||
C --> D[渲染层]
|
||||
A1[属性枚举] --> A
|
||||
A2[职业配置] --> A
|
||||
A3[Buff配置] --> A
|
||||
B1[属性计算] --> B
|
||||
B2[强度倍率] --> B
|
||||
B3[成长曲线] --> B
|
||||
C1[属性容器] --> C
|
||||
C2[Buff系统] --> C
|
||||
C3[负面状态] --> C
|
||||
D1[视觉效果] --> D
|
||||
D2[伤害显示] --> D
|
||||
D3[状态提示] --> D
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L546)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L780)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### hero_init方法中的强度倍率计算
|
||||
|
||||
hero_init方法是属性系统的核心入口,负责根据strengthMultiplier强度倍率进行动态属性计算:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as 客户端
|
||||
participant Mon as Monster
|
||||
participant Hero as Hero
|
||||
participant Calc as 属性计算器
|
||||
participant View as HeroViewComp
|
||||
Client->>Mon : hero_init(strengthMultiplier)
|
||||
Mon->>Calc : 计算基础属性
|
||||
Calc->>Calc : baseHp = hero.hp * strengthMultiplier
|
||||
Calc->>Calc : baseAp = hero.ap * strengthMultiplier
|
||||
Calc->>Calc : baseDef = hero.def * strengthMultiplier
|
||||
Mon->>View : 初始化属性容器
|
||||
View->>View : getAttrs()
|
||||
View->>View : getNeAttrs()
|
||||
View->>View : 设置基础属性
|
||||
View->>View : initAttrs()
|
||||
View-->>Client : 属性初始化完成
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L61-L108)
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L65-L100)
|
||||
|
||||
#### 强度倍率的应用机制
|
||||
|
||||
强度倍率通过以下方式影响属性计算:
|
||||
|
||||
1. **基础属性缩放**:`baseHp = hero.hp * strengthMultiplier`
|
||||
2. **攻击力调整**:`baseAp = hero.ap * strengthMultiplier`
|
||||
3. **防御力计算**:`baseDef = hero.def * strengthMultiplier`
|
||||
|
||||
这种设计允许系统根据关卡进度、难度系数等因素动态调整怪物强度,而无需修改英雄配置数据。
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L61-L108)
|
||||
- [Hero.ts](file://assets/script/game/hero/Hero.ts#L65-L100)
|
||||
|
||||
### hv.Attrs与hv.NeAttrs属性系统
|
||||
|
||||
#### 属性容器初始化流程
|
||||
|
||||
属性容器的初始化遵循严格的步骤序列:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[开始初始化] --> B[清空现有Buff]
|
||||
B --> C[获取英雄配置]
|
||||
C --> D[重置基础属性]
|
||||
D --> E[初始化其他属性]
|
||||
E --> F[加载初始Buff]
|
||||
F --> G[属性计算引擎就绪]
|
||||
D1[Attrs.HP_MAX = base_hp] --> D
|
||||
D2[Attrs.MP_MAX = base_mp] --> D
|
||||
D3[Attrs.DEF = base_def] --> D
|
||||
D4[Attrs.AP = base_ap] --> D
|
||||
D5[Attrs.MAP = base_map] --> D
|
||||
D6[Attrs.SPEED = base_speed] --> D
|
||||
D7[Attrs.DIS = base_dis] --> D
|
||||
E1[设置其他属性为0] --> E
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L120-L180)
|
||||
|
||||
#### 属性容器构建逻辑
|
||||
|
||||
getAttrs和getNeAttrs函数负责构建属性容器:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Attrs {
|
||||
<<enumeration>>
|
||||
HP_MAX : 0
|
||||
MP_MAX : 1
|
||||
AP : 10
|
||||
DEF : 20
|
||||
SPEED : 63
|
||||
+getAttrs() : object
|
||||
}
|
||||
class NeAttrs {
|
||||
<<enumeration>>
|
||||
IN_FROST : 0
|
||||
IN_STUN : 1
|
||||
IN_BURN : 2
|
||||
IN_POISON : 3
|
||||
+getNeAttrs() : object
|
||||
}
|
||||
class HeroViewComp {
|
||||
+any Attrs
|
||||
+any NeAttrs
|
||||
+initAttrs()
|
||||
+recalculateSingleAttr(attrIndex)
|
||||
}
|
||||
HeroViewComp --> Attrs
|
||||
HeroViewComp --> NeAttrs
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L16-L30)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L72-L120)
|
||||
|
||||
**章节来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L16-L30)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L120-L180)
|
||||
|
||||
### 怪物数据共享机制
|
||||
|
||||
怪物通过heroSet.ts中的英雄配置数据实现数据共享:
|
||||
|
||||
#### 怪物配置复用
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[HeroInfo配置] --> B[英雄数据]
|
||||
A --> C[怪物数据]
|
||||
B1[uuid: 5001] --> B
|
||||
B2[name: 刘邦] --> B
|
||||
B3[type: warrior] --> B
|
||||
B4[hp: 125] --> B
|
||||
B5[ap: 15] --> B
|
||||
C1[uuid: 5201] --> C
|
||||
C2[name: 兽人战士] --> C
|
||||
C3[type: warrior] --> C
|
||||
C4[hp: 25] --> C
|
||||
C5[ap: 5] --> C
|
||||
B -.->|复用| C
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L70-L152)
|
||||
|
||||
#### 怪物强度动态调整
|
||||
|
||||
系统通过RogueConfig.ts提供怪物强度的动态调整机制:
|
||||
|
||||
| 参数 | 默认值 | 说明 |
|
||||
|------|--------|------|
|
||||
| stageMultiplier | 1 + (stageNumber - 1) * 0.1 | 关卡倍率,每关增加10% |
|
||||
| levelMultiplier | 1 + (level - 1) * 0.05 | 等级倍率,每级增加5% |
|
||||
| totalMultiplier | stageMultiplier * levelMultiplier | 总强度倍率 |
|
||||
|
||||
**章节来源**
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L70-L152)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L180-L205)
|
||||
|
||||
### 属性计算引擎
|
||||
|
||||
#### 属性计算公式
|
||||
|
||||
系统采用双重计算模式,根据属性类型选择不同的计算公式:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[属性计算开始] --> B{属性类型判断}
|
||||
B --> |数值型| C[数值型计算]
|
||||
B --> |百分比型| D[百分比型计算]
|
||||
C --> C1[基础值 + 数值Buff]
|
||||
C1 --> C2[× (1 + 百分比Buff/100)]
|
||||
C2 --> C3[Math.floor结果)
|
||||
D --> D1[基础值 + 数值Buff]
|
||||
D1 --> D2[+ 百分比Buff]
|
||||
D2 --> D3[直接结果]
|
||||
C3 --> E[属性值规范化]
|
||||
D3 --> E
|
||||
E --> F[属性计算完成]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L250-L320)
|
||||
|
||||
#### Buff系统管理
|
||||
|
||||
Buff系统支持持久型和临时型两种Buff类型:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class BuffSystem {
|
||||
+Record~number, Array~ BUFFS
|
||||
+Record~number, Array~ BUFFS_TEMP
|
||||
+addBuff(buffConf)
|
||||
+removeBuff(attrIndex, value, isPermanent)
|
||||
+updateTemporaryBuffsDebuffs(dt)
|
||||
+recalculateSingleAttr(attrIndex)
|
||||
}
|
||||
class BuffConf {
|
||||
+number buff
|
||||
+BType BType
|
||||
+number value
|
||||
+number time
|
||||
+number chance
|
||||
}
|
||||
class BuffInstance {
|
||||
+number value
|
||||
+BType BType
|
||||
+number remainTime
|
||||
}
|
||||
BuffSystem --> BuffConf
|
||||
BuffSystem --> BuffInstance
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L180-L250)
|
||||
|
||||
**章节来源**
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L180-L350)
|
||||
|
||||
### 职业成长曲线系统
|
||||
|
||||
#### 职业属性增长配置
|
||||
|
||||
系统为每种职业定义了独特的属性成长曲线:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "战士职业成长"
|
||||
A1[力量→生命值: 3.0]
|
||||
A2[力量→攻击力: 1.5]
|
||||
A3[力量→防御力: 0.8]
|
||||
A4[敏捷→暴击率: 0.3]
|
||||
A5[精神→吸血: 0.4]
|
||||
end
|
||||
subgraph "刺客职业成长"
|
||||
B1[力量→生命值: 1.8]
|
||||
B2[力量→攻击力: 1.3]
|
||||
B3[力量→防御力: 0.3]
|
||||
B4[敏捷→暴击率: 1.0]
|
||||
B5[幸运→暴击率: 1.5]
|
||||
end
|
||||
subgraph "法师职业成长"
|
||||
C1[智力→魔法值: 2.0]
|
||||
C2[智力→魔法攻击: 1.8]
|
||||
C3[智力→魔法防御: 0.8]
|
||||
C4[智力→作用范围: 0.3]
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L266-L439)
|
||||
|
||||
#### 成长系数计算
|
||||
|
||||
系统提供了多种快捷方法来计算属性增长:
|
||||
|
||||
| 方法名 | 输入参数 | 输出 | 用途 |
|
||||
|--------|----------|------|------|
|
||||
| addStrength | heroType, strengthPoints | 属性增长映射 | 计算力量属性增长 |
|
||||
| addIntelligence | heroType, intelligencePoints | 属性增长映射 | 计算智力属性增长 |
|
||||
| addAgility | heroType, agilityPoints | 属性增长映射 | 计算敏捷属性增长 |
|
||||
| calculateTotalAttributeGains | heroType, baseAttrs | 总属性增长 | 计算多属性总增长 |
|
||||
|
||||
**章节来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L435-L544)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
属性系统的依赖关系呈现清晰的层次结构:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
A[HeroAttrs.ts] --> B[HeroViewComp.ts]
|
||||
C[heroSet.ts] --> D[Hero.ts]
|
||||
C --> E[Mon.ts]
|
||||
B --> D
|
||||
B --> E
|
||||
F[RogueConfig.ts] --> E
|
||||
G[Mission.ts] --> F
|
||||
A --> H[属性枚举]
|
||||
A --> I[属性类型]
|
||||
A --> J[职业配置]
|
||||
K[GameEvent.ts] --> B
|
||||
L[SkillSet.ts] --> B
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L10)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L20)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L15)
|
||||
|
||||
**章节来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L1-L10)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L10)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 属性计算优化策略
|
||||
|
||||
1. **延迟计算**:只在必要时重新计算属性值
|
||||
2. **批量更新**:合并多个属性变更操作
|
||||
3. **缓存机制**:避免重复计算相同属性
|
||||
4. **增量更新**:只更新受影响的属性
|
||||
|
||||
### 内存管理
|
||||
|
||||
- 使用对象池管理Buff实例
|
||||
- 及时清理过期的临时Buff
|
||||
- 避免属性容器的频繁重建
|
||||
|
||||
### 计算复杂度
|
||||
|
||||
属性计算的时间复杂度为O(n),其中n为活跃Buff的数量。系统通过以下方式优化性能:
|
||||
|
||||
- 使用索引快速定位属性
|
||||
- 批量处理相似类型的Buff
|
||||
- 延迟执行非关键属性计算
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 属性计算异常
|
||||
|
||||
**问题**:属性值超出预期范围
|
||||
**原因**:Buff叠加过多或计算公式错误
|
||||
**解决方案**:检查Buff配置,验证属性值规范化逻辑
|
||||
|
||||
#### 性能问题
|
||||
|
||||
**问题**:属性更新导致帧率下降
|
||||
**原因**:频繁的属性重新计算
|
||||
**解决方案**:实施属性变更批处理,减少不必要的重新计算
|
||||
|
||||
#### 数据同步问题
|
||||
|
||||
**问题**:客户端与服务器属性不一致
|
||||
**原因**:配置数据版本不匹配
|
||||
**解决方案**:实施配置版本控制,确保数据一致性
|
||||
|
||||
**章节来源**
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L315-L354)
|
||||
|
||||
## 结论
|
||||
|
||||
英雄属性系统通过strengthMultiplier强度倍率实现了灵活的动态属性计算机制,支持HP、AP、DEF、SPEED等基础属性的精确缩放。系统采用模块化设计,将属性定义、计算逻辑、配置管理和运行时控制分离,确保了良好的可维护性和扩展性。
|
||||
|
||||
通过HeroAttrs.ts中的getAttrs与getNeAttrs函数,系统建立了完整的属性容器构建逻辑,支持英雄和怪物的统一属性管理。职业成长曲线系统为不同职业提供了特色化的属性发展路径,增强了游戏的策略深度。
|
||||
|
||||
怪物通过heroSet.ts中的英雄配置数据实现数据共享,配合RogueConfig.ts中的强度倍率计算,实现了自定义属性成长曲线和难度系数调整功能。系统提供了丰富的配置选项和性能优化建议,为游戏开发提供了强大的属性管理基础设施。
|
||||
735
.qoder/repowiki/zh/content/地图系统/怪物系统/怪物实体/怪物实体.md
Normal file
735
.qoder/repowiki/zh/content/地图系统/怪物系统/怪物实体/怪物实体.md
Normal file
@@ -0,0 +1,735 @@
|
||||
# 怪物实体ECS架构实现深度解析
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [概述](#概述)
|
||||
2. [项目结构分析](#项目结构分析)
|
||||
3. [Monster类核心架构](#monster类核心架构)
|
||||
4. [ECS注册机制详解](#ecs注册机制详解)
|
||||
5. [load方法完整流程分析](#load方法完整流程分析)
|
||||
6. [BattleMoveComp组件集成](#battlemovemovecomp组件集成)
|
||||
7. [MonModelComp模型数据管理](#monmodelcomp模型数据管理)
|
||||
8. [系统架构与依赖关系](#系统架构与依赖关系)
|
||||
9. [开发示例与最佳实践](#开发示例与最佳实践)
|
||||
10. [常见错误与调试方法](#常见错误与调试方法)
|
||||
11. [总结](#总结)
|
||||
|
||||
## 概述
|
||||
|
||||
本文档深入解析Cocos Creator游戏项目中Monster类的ECS(Entity-Component-System)架构实现。Monster类作为游戏中的怪物实体,采用了现代游戏开发中流行的组件化架构模式,通过继承ecs.Entity并注册为`Monster`类型,实现了高度可扩展和可维护的游戏实体系统。
|
||||
|
||||
该架构的核心优势在于:
|
||||
- **组件化设计**:将怪物的不同功能分解为独立的组件
|
||||
- **类型安全**:利用TypeScript的类型系统确保组件正确使用
|
||||
- **性能优化**:通过组件缓存池和批量处理提升性能
|
||||
- **易于扩展**:支持动态添加和移除组件
|
||||
|
||||
## 项目结构分析
|
||||
|
||||
项目的ECS架构采用分层设计,主要包含以下层次:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "实体层"
|
||||
Monster[Monster实体]
|
||||
Hero[Hero实体]
|
||||
end
|
||||
subgraph "组件层"
|
||||
BattleMove[BattleMoveComp<br/>战斗移动组件]
|
||||
MonModel[MonModelComp<br/>怪物模型组件]
|
||||
HeroView[HeroViewComp<br/>英雄视图组件]
|
||||
Tal[TalComp<br/>天赋组件]
|
||||
end
|
||||
subgraph "系统层"
|
||||
BattleMoveSys[BattleMoveSystem<br/>移动系统]
|
||||
PositionSys[EcsPositionSystem<br/>位置系统]
|
||||
end
|
||||
subgraph "管理层"
|
||||
MissionMon[MissionMonComp<br/>任务怪物管理]
|
||||
RogueConfig[RogueConfig<br/>肉鸽配置]
|
||||
end
|
||||
Monster --> BattleMove
|
||||
Monster --> MonModel
|
||||
Monster --> Tal
|
||||
Monster --> HeroView
|
||||
BattleMoveSys --> BattleMove
|
||||
BattleMoveSys --> HeroView
|
||||
MissionMon --> Monster
|
||||
MissionMon --> RogueConfig
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L111)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L1-L272)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||||
|
||||
## Monster类核心架构
|
||||
|
||||
Monster类作为ECS架构中的核心实体,展现了现代游戏开发的最佳实践:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Monster {
|
||||
+MonModelComp HeroModel
|
||||
+HeroViewComp HeroView
|
||||
+BattleMoveComp BattleMove
|
||||
+init() void
|
||||
+destroy() void
|
||||
+load(pos, scale, uuid, is_boss, is_call, strengthMultiplier) void
|
||||
+hero_init(uuid, node, scale, box_group, is_boss, is_call, strengthMultiplier) void
|
||||
}
|
||||
class ecs_Entity {
|
||||
<<abstract>>
|
||||
+add(component) void
|
||||
+remove(component) void
|
||||
+get(component) Comp
|
||||
+has(component) boolean
|
||||
+destroy() void
|
||||
}
|
||||
class BattleMoveComp {
|
||||
+number direction
|
||||
+number targetX
|
||||
+boolean moving
|
||||
+reset() void
|
||||
}
|
||||
class MonModelComp {
|
||||
+reset() void
|
||||
}
|
||||
class HeroViewComp {
|
||||
+number scale
|
||||
+FacSet fac
|
||||
+HType type
|
||||
+boolean is_boss
|
||||
+number hero_uuid
|
||||
+string hero_name
|
||||
+number base_hp
|
||||
+number base_mp
|
||||
+number base_ap
|
||||
+number base_def
|
||||
+number hp
|
||||
+number mp
|
||||
+number ap
|
||||
+number def
|
||||
+Attrs attrs
|
||||
+Skills skills
|
||||
}
|
||||
Monster --|> ecs_Entity
|
||||
Monster --> BattleMoveComp
|
||||
Monster --> MonModelComp
|
||||
Monster --> HeroViewComp
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L18-L35)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L1-L16)
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts#L1-L20)
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L111)
|
||||
|
||||
## ECS注册机制详解
|
||||
|
||||
Monster类通过装饰器`@ecs.register('Monster')`完成ECS系统的注册,这是整个架构的基础:
|
||||
|
||||
### 注册机制特点
|
||||
|
||||
1. **类型标识**:通过字符串标识符'Monster'唯一标识实体类型
|
||||
2. **自动发现**:ECS系统能够自动发现和管理注册的实体类型
|
||||
3. **类型安全**:编译时确保实体类型的一致性
|
||||
|
||||
### 组件注册与关联
|
||||
|
||||
Monster实体在初始化时通过`init()`方法注册所需的组件:
|
||||
|
||||
```typescript
|
||||
protected init() {
|
||||
this.addComponents<ecs.Comp>(
|
||||
BattleMoveComp,
|
||||
MonModelComp,
|
||||
TalComp,
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
这种设计的优势:
|
||||
- **明确依赖**:清楚展示实体所需的所有组件
|
||||
- **生命周期管理**:组件的创建和销毁与实体同步
|
||||
- **性能优化**:避免重复创建相同类型的组件
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L25-L35)
|
||||
|
||||
## load方法完整流程分析
|
||||
|
||||
`load`方法是Monster实体的核心初始化方法,实现了从预制体加载到组件绑定的完整流程:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始load方法]) --> SetScale["设置scale=-1<br/>怪物朝向左侧"]
|
||||
SetScale --> GetScene["获取场景引用<br/>scene = smc.map.MapView.scene"]
|
||||
GetScene --> BuildPath["构建预制体路径<br/>path = 'game/heros/' + HeroInfo[uuid].path"]
|
||||
BuildPath --> LoadPrefab["加载预制体<br/>prefab = oops.res.get(path, Prefab)"]
|
||||
LoadPrefab --> Instantiate["实例化预制体<br/>node = instantiate(prefab)"]
|
||||
Instantiate --> SetParent["设置父节点<br/>node.parent = scene.entityLayer!.node!"]
|
||||
SetParent --> DisableCollider["禁用碰撞体<br/>collider.enabled = false"]
|
||||
DisableCollider --> EnableCollider["延迟启用碰撞体<br/>延迟一帧启用"]
|
||||
EnableCollider --> SetPosition["设置初始位置<br/>node.setPosition(pos)"]
|
||||
SetPosition --> CallInit["调用hero_init方法<br/>初始化怪物属性"]
|
||||
CallInit --> DispatchEvent["分发monster_load事件<br/>通知其他模块"]
|
||||
DispatchEvent --> InitMove["初始化移动参数<br/>设置向左移动"]
|
||||
InitMove --> UpdateCounter["更新怪物计数<br/>smc.vmdata.mission_data.mon_num++"]
|
||||
UpdateCounter --> End([完成])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L37-L65)
|
||||
|
||||
### 关键步骤详解
|
||||
|
||||
#### 1. 预制体动态加载
|
||||
```typescript
|
||||
var path = "game/heros/" + HeroInfo[uuid].path;
|
||||
var prefab: Prefab = oops.res.get(path, Prefab)!;
|
||||
var node = instantiate(prefab);
|
||||
```
|
||||
|
||||
这个过程展示了:
|
||||
- **配置驱动**:通过HeroInfo配置表动态确定预制体路径
|
||||
- **资源管理**:使用oops.res进行资源加载和缓存
|
||||
- **类型安全**:明确指定Prefab类型确保类型安全
|
||||
|
||||
#### 2. 碰撞体延迟启用机制
|
||||
```typescript
|
||||
const collider = node.getComponent(BoxCollider2D);
|
||||
if (collider) collider.enabled = false;
|
||||
```
|
||||
|
||||
这种设计考虑了:
|
||||
- **性能优化**:避免不必要的物理计算
|
||||
- **稳定性**:确保碰撞体在正确时机启用
|
||||
- **兼容性**:适应不同预制体的碰撞体配置
|
||||
|
||||
#### 3. 事件通知机制
|
||||
```typescript
|
||||
oops.message.dispatchEvent("monster_load", this);
|
||||
```
|
||||
|
||||
事件系统的作用:
|
||||
- **解耦**:减少组件间的直接依赖
|
||||
- **扩展性**:支持多个监听器响应同一事件
|
||||
- **异步处理**:允许异步执行相关逻辑
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L37-L65)
|
||||
|
||||
## BattleMoveComp组件集成
|
||||
|
||||
BattleMoveComp是Monster实体的核心移动组件,负责控制怪物的移动行为:
|
||||
|
||||
### 组件结构分析
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class BattleMoveComp {
|
||||
+number direction
|
||||
+number targetX
|
||||
+boolean moving
|
||||
+reset() void
|
||||
}
|
||||
class BattleMoveSystem {
|
||||
+filter() IMatcher
|
||||
+update(entity) void
|
||||
+checkEnemiesInFace(entity) boolean
|
||||
+updateRenderOrder(entity) void
|
||||
+validatePosition(newX, move) boolean
|
||||
}
|
||||
BattleMoveSystem --> BattleMoveComp : "管理"
|
||||
BattleMoveSystem --> HeroViewComp : "协作"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L1-L16)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L1-L272)
|
||||
|
||||
### 移动逻辑实现
|
||||
|
||||
BattleMoveSystem通过复杂的AI逻辑控制怪物移动:
|
||||
|
||||
#### 1. 基础移动控制
|
||||
```typescript
|
||||
const delta = (view.Attrs[Attrs.SPEED]/3) * this.dt * move.direction;
|
||||
const newX = view.node.position.x + delta;
|
||||
```
|
||||
|
||||
#### 2. 边界检测与停止
|
||||
```typescript
|
||||
if (this.validatePosition(newX, move)) {
|
||||
view.status_change("move");
|
||||
view.node.setPosition(newX, view.node.position.y, 0);
|
||||
} else {
|
||||
view.status_change("idle");
|
||||
move.moving = false;
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 敌人检测与反应
|
||||
```typescript
|
||||
const shouldStop = this.checkEnemiesInFace(e);
|
||||
if (shouldStop) {
|
||||
view.status_change("idle");
|
||||
return;
|
||||
}
|
||||
```
|
||||
|
||||
### 驱动怪物向左移动的逻辑
|
||||
|
||||
在Monster的load方法中,通过以下代码设置移动参数:
|
||||
|
||||
```typescript
|
||||
const move = this.get(BattleMoveComp);
|
||||
move.direction = -1; // 向左移动
|
||||
move.targetX = -800; // 左边界
|
||||
```
|
||||
|
||||
这种设计体现了:
|
||||
- **组件化控制**:移动逻辑完全封装在BattleMoveComp中
|
||||
- **灵活性**:可以在运行时动态修改移动参数
|
||||
- **可测试性**:便于单独测试移动逻辑
|
||||
|
||||
**章节来源**
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L1-L16)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L15-L272)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L55-L60)
|
||||
|
||||
## MonModelComp模型数据管理
|
||||
|
||||
MonModelComp虽然看似简单,但在ECS架构中扮演着重要的数据管理角色:
|
||||
|
||||
### 组件设计特点
|
||||
|
||||
```typescript
|
||||
@ecs.register('MonModel')
|
||||
export class MonModelComp extends ecs.Comp {
|
||||
reset() {
|
||||
// 目前为空实现
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 数据存储与管理策略
|
||||
|
||||
尽管MonModelComp目前没有复杂的数据存储,但它遵循了ECS架构的最佳实践:
|
||||
|
||||
1. **职责单一**:专注于怪物模型相关的数据管理
|
||||
2. **可扩展性**:预留了未来扩展的空间
|
||||
3. **一致性**:与其他组件保持相同的接口风格
|
||||
|
||||
### 属性重置机制
|
||||
|
||||
```typescript
|
||||
reset() {
|
||||
// 目前为空实现
|
||||
}
|
||||
```
|
||||
|
||||
这种设计考虑了:
|
||||
- **性能优化**:避免不必要的重置操作
|
||||
- **灵活性**:允许子类根据需要重写重置逻辑
|
||||
- **一致性**:保持与ecs.Comp基类的接口一致
|
||||
|
||||
**章节来源**
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts#L1-L20)
|
||||
|
||||
## 系统架构与依赖关系
|
||||
|
||||
Monster实体的完整生命周期涉及多个系统和组件的协作:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "输入层"
|
||||
Config[配置数据<br/>HeroInfo, MonSet]
|
||||
Resources[资源文件<br/>预制体, 图集]
|
||||
end
|
||||
subgraph "管理层"
|
||||
MissionMon[MissionMonComp<br/>任务管理器]
|
||||
RogueConfig[RogueConfig<br/>肉鸽配置]
|
||||
end
|
||||
subgraph "实体层"
|
||||
Monster[Monster实体]
|
||||
end
|
||||
subgraph "组件层"
|
||||
BattleMove[BattleMoveComp<br/>移动控制]
|
||||
MonModel[MonModelComp<br/>模型数据]
|
||||
HeroView[HeroViewComp<br/>视图管理]
|
||||
Tal[TalComp<br/>天赋系统]
|
||||
end
|
||||
subgraph "系统层"
|
||||
BattleMoveSys[BattleMoveSystem<br/>移动系统]
|
||||
PositionSys[EcsPositionSystem<br/>位置系统]
|
||||
end
|
||||
Config --> MissionMon
|
||||
Resources --> Monster
|
||||
RogueConfig --> MissionMon
|
||||
MissionMon --> Monster
|
||||
Monster --> BattleMove
|
||||
Monster --> MonModel
|
||||
Monster --> HeroView
|
||||
Monster --> Tal
|
||||
BattleMove --> BattleMoveSys
|
||||
HeroView --> BattleMoveSys
|
||||
BattleMoveSys --> PositionSys
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L111)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L1-L272)
|
||||
|
||||
### 关键依赖关系
|
||||
|
||||
1. **配置依赖**:Monster依赖HeroInfo配置表获取怪物数据
|
||||
2. **资源依赖**:依赖预制体资源进行实例化
|
||||
3. **系统依赖**:依赖BattleMoveSystem进行移动逻辑处理
|
||||
4. **事件依赖**:通过消息系统与其他模块通信
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L152)
|
||||
|
||||
## 开发示例与最佳实践
|
||||
|
||||
### 新增怪物实体类型示例
|
||||
|
||||
以下是新增一种新型态怪物的完整实现:
|
||||
|
||||
#### 1. 创建新的怪物类型配置
|
||||
|
||||
```typescript
|
||||
// 在heroSet.ts中添加新的怪物配置
|
||||
export const HeroInfo: Record<number, heroInfo> = {
|
||||
// ...
|
||||
5204: {uuid: 5204, name: "冰霜巨人", path: "mo2", fac: FacSet.MON, kind: 1,
|
||||
type: HType.warrior, lv: 1, hp: 50, mp: 120, ap: 8, map: 15, def: 10, mdef: 0,
|
||||
ap: 8, dis: 120, speed: 80, skills: [6006], buff: [], tal: [], info: "冰霜系怪物"},
|
||||
};
|
||||
```
|
||||
|
||||
#### 2. 创建专门的怪物实体类
|
||||
|
||||
```typescript
|
||||
@ecs.register('IceGiant')
|
||||
export class IceGiant extends ecs.Entity {
|
||||
IceModel!: MonModelComp;
|
||||
IceView!: HeroViewComp;
|
||||
IceMove!: BattleMoveComp;
|
||||
IceEffect!: IceEffectComp; // 新增冰霜效果组件
|
||||
|
||||
protected init() {
|
||||
this.addComponents<ecs.Comp>(
|
||||
BattleMoveComp,
|
||||
MonModelComp,
|
||||
IceEffectComp, // 添加新组件
|
||||
TalComp,
|
||||
);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 实现特定的加载逻辑
|
||||
|
||||
```typescript
|
||||
loadIceGiant(pos: Vec3, scale: number = 1, strengthMultiplier: number = 1.0) {
|
||||
// 调用通用加载逻辑
|
||||
this.load(pos, scale, 5204, false, false, strengthMultiplier);
|
||||
|
||||
// 特定于冰霜巨人的初始化
|
||||
const effect = this.get(IceEffectComp);
|
||||
effect.freezeDuration = 2.0; // 冻结持续时间
|
||||
effect.freezeChance = 0.3; // 冻结概率
|
||||
}
|
||||
```
|
||||
|
||||
### 配置预制体路径的最佳实践
|
||||
|
||||
1. **命名规范**:使用统一的命名约定
|
||||
```typescript
|
||||
// 推荐:mo1, mo2, mo3 表示不同的怪物类型
|
||||
// 不推荐:monster1, enemy1, badguy
|
||||
```
|
||||
|
||||
2. **资源组织**:按类型分类存放预制体
|
||||
```
|
||||
assets/resources/game/heros/
|
||||
├── mo1/ # 普通怪物
|
||||
├── mo2/ # 冰霜怪物
|
||||
├── mo3/ # 火焰怪物
|
||||
└── boss/ # Boss怪物
|
||||
```
|
||||
|
||||
3. **版本管理**:为不同版本的预制体建立目录结构
|
||||
```
|
||||
assets/resources/game/heros/v1.0/mo1/
|
||||
assets/resources/game/heros/v1.1/mo1/
|
||||
```
|
||||
|
||||
### 初始化参数配置指南
|
||||
|
||||
#### 基础属性配置
|
||||
|
||||
```typescript
|
||||
interface MonsterConfig {
|
||||
uuid: number;
|
||||
position: number; // 在MonSet中的位置索引
|
||||
type: MonsterType; // 怪物类型
|
||||
level: number; // 等级(1-5)
|
||||
strengthMultiplier: number; // 强度倍率
|
||||
isBoss?: boolean; // 是否为Boss
|
||||
isCall?: boolean; // 是否为召唤怪
|
||||
}
|
||||
```
|
||||
|
||||
#### 强度倍率计算
|
||||
|
||||
```typescript
|
||||
function calculateMonsterStrengthMultiplier(stageNumber: number, level: number): number {
|
||||
const stageMultiplier = 1 + (stageNumber - 1) * 0.1; // 每关增加10%
|
||||
const levelMultiplier = 1 + (level - 1) * 0.05; // 每级增加5%
|
||||
return stageMultiplier * levelMultiplier;
|
||||
}
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L130-L152)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L175-L190)
|
||||
|
||||
## 常见错误与调试方法
|
||||
|
||||
### 常见集成错误
|
||||
|
||||
#### 1. 组件注册错误
|
||||
|
||||
**错误表现**:
|
||||
```typescript
|
||||
// 错误:忘记注册组件
|
||||
export class Monster extends ecs.Entity {
|
||||
// 缺少组件声明
|
||||
// HeroModel!: MonModelComp;
|
||||
// HeroView!: HeroViewComp;
|
||||
// BattleMove!: BattleMoveComp;
|
||||
}
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 正确:在类中声明组件
|
||||
export class Monster extends ecs.Entity {
|
||||
HeroModel!: MonModelComp;
|
||||
HeroView!: HeroViewComp;
|
||||
BattleMove!: BattleMoveComp;
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 预制体加载失败
|
||||
|
||||
**错误表现**:
|
||||
```typescript
|
||||
// 错误:路径拼写错误
|
||||
var path = "game/heros/" + HeroInfo[uuid].path; // 可能导致加载失败
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 正确:添加错误处理和日志
|
||||
try {
|
||||
var path = "game/heros/" + HeroInfo[uuid].path;
|
||||
var prefab: Prefab = oops.res.get(path, Prefab);
|
||||
if (!prefab) {
|
||||
console.error(`预制体加载失败: ${path}`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`加载预制体时出错:`, error);
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 组件初始化顺序问题
|
||||
|
||||
**错误表现**:
|
||||
```typescript
|
||||
// 错误:在组件未注册前就尝试获取
|
||||
load() {
|
||||
const move = this.get(BattleMoveComp); // 可能在init之前调用
|
||||
move.direction = -1;
|
||||
}
|
||||
```
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 正确:确保在init之后调用
|
||||
protected init() {
|
||||
this.addComponents<ecs.Comp>(
|
||||
BattleMoveComp,
|
||||
MonModelComp,
|
||||
TalComp,
|
||||
);
|
||||
}
|
||||
|
||||
load() {
|
||||
// load方法会在init之后调用
|
||||
const move = this.get(BattleMoveComp);
|
||||
move.direction = -1;
|
||||
}
|
||||
```
|
||||
|
||||
### 调试方法
|
||||
|
||||
#### 1. 组件状态监控
|
||||
|
||||
```typescript
|
||||
// 在Monster类中添加调试方法
|
||||
debugPrintState() {
|
||||
console.log(`Monster状态:`, {
|
||||
hasBattleMove: this.has(BattleMoveComp),
|
||||
hasHeroView: this.has(HeroViewComp),
|
||||
hasMonModel: this.has(MonModelComp),
|
||||
battleMoveDirection: this.BattleMove?.direction,
|
||||
heroName: this.HeroView?.hero_name,
|
||||
hp: this.HeroView?.hp,
|
||||
mp: this.HeroView?.mp
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 生命周期跟踪
|
||||
|
||||
```typescript
|
||||
// 添加生命周期钩子
|
||||
protected init() {
|
||||
console.log('Monster init');
|
||||
super.init();
|
||||
}
|
||||
|
||||
destroy() {
|
||||
console.log('Monster destroy');
|
||||
super.destroy();
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 系统状态检查
|
||||
|
||||
```typescript
|
||||
// 在BattleMoveSystem中添加调试信息
|
||||
update(e: ecs.Entity) {
|
||||
const move = e.get(BattleMoveComp);
|
||||
const view = e.get(HeroViewComp);
|
||||
|
||||
console.log(`[${view.hero_name}] 位置: ${view.node.position.x.toFixed(1)}, 方向: ${move.direction}, 移动: ${move.moving}`);
|
||||
|
||||
// 原有逻辑...
|
||||
}
|
||||
```
|
||||
|
||||
#### 4. 性能监控
|
||||
|
||||
```typescript
|
||||
// 监控组件创建和销毁
|
||||
static createCount = 0;
|
||||
static destroyCount = 0;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
Monster.createCount++;
|
||||
console.log(`Monster创建总数: ${Monster.createCount}`);
|
||||
}
|
||||
|
||||
destroy() {
|
||||
Monster.destroyCount++;
|
||||
console.log(`Monster销毁总数: ${Monster.destroyCount}`);
|
||||
super.destroy();
|
||||
}
|
||||
```
|
||||
|
||||
### 性能优化建议
|
||||
|
||||
#### 1. 组件缓存池优化
|
||||
|
||||
```typescript
|
||||
// 利用ECS系统的组件缓存池
|
||||
const move = ecs.getComponent(BattleMoveComp);
|
||||
try {
|
||||
move.direction = -1;
|
||||
move.targetX = -800;
|
||||
} finally {
|
||||
ecs.releaseComponent(move);
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 批量处理优化
|
||||
|
||||
```typescript
|
||||
// 批量创建怪物
|
||||
function batchCreateMonsters(configs: MonsterConfig[]) {
|
||||
configs.forEach(config => {
|
||||
const monster = ecs.getEntity<Monster>(Monster);
|
||||
monster.load(
|
||||
v3(MonSet[config.position].pos),
|
||||
-1, // scale
|
||||
config.uuid,
|
||||
config.type === MonsterType.BOSS,
|
||||
false,
|
||||
config.strengthMultiplier
|
||||
);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 内存泄漏预防
|
||||
|
||||
```typescript
|
||||
// 确保正确清理事件监听器
|
||||
destroy() {
|
||||
oops.message.removeEventListener("monster_load", this.onMonsterLoad);
|
||||
super.destroy();
|
||||
}
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L30-L35)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L15-L50)
|
||||
|
||||
## 总结
|
||||
|
||||
Monster类的ECS架构实现展现了现代游戏开发中组件化设计的最佳实践。通过深入分析,我们可以看到:
|
||||
|
||||
### 架构优势
|
||||
|
||||
1. **高度模块化**:每个组件负责单一职责,便于维护和扩展
|
||||
2. **类型安全**:利用TypeScript确保组件使用的正确性
|
||||
3. **性能优化**:通过组件缓存池和批量处理提升性能
|
||||
4. **易于测试**:组件间松耦合,便于单元测试
|
||||
|
||||
### 设计亮点
|
||||
|
||||
1. **灵活的预制体加载机制**:支持动态配置和资源管理
|
||||
2. **智能的移动控制系统**:结合AI逻辑实现复杂的怪物行为
|
||||
3. **完善的事件通知机制**:支持模块间解耦通信
|
||||
4. **可扩展的配置系统**:支持多种怪物类型和强度配置
|
||||
|
||||
### 最佳实践总结
|
||||
|
||||
1. **严格遵循ECS原则**:组件职责单一,实体轻量化
|
||||
2. **合理使用装饰器**:通过`@ecs.register`简化组件注册
|
||||
3. **注重错误处理**:添加适当的异常处理和日志记录
|
||||
4. **性能优先**:充分利用组件缓存池和批量处理
|
||||
5. **文档完善**:为复杂逻辑添加详细的注释和文档
|
||||
|
||||
这套ECS架构不仅适用于怪物实体,也为游戏中的其他实体类型提供了可复用的设计模式。通过遵循这些设计原则和最佳实践,开发者可以构建出高性能、可维护的游戏系统。
|
||||
580
.qoder/repowiki/zh/content/地图系统/怪物系统/怪物实体/怪物实体初始化流程.md
Normal file
580
.qoder/repowiki/zh/content/地图系统/怪物系统/怪物实体/怪物实体初始化流程.md
Normal file
@@ -0,0 +1,580 @@
|
||||
# 怪物实体初始化流程
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/entityLayer.ts)
|
||||
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [概述](#概述)
|
||||
2. [项目结构分析](#项目结构分析)
|
||||
3. [核心组件架构](#核心组件架构)
|
||||
4. [Monster类load方法详解](#monster类load方法详解)
|
||||
5. [hero_init方法深度解析](#hero_init方法深度解析)
|
||||
6. [资源加载与预制体管理](#资源加载与预制体管理)
|
||||
7. [场景节点挂载机制](#场景节点挂载机制)
|
||||
8. [消息事件系统](#消息事件系统)
|
||||
9. [异常处理与调试策略](#异常处理与调试策略)
|
||||
10. [实际应用示例](#实际应用示例)
|
||||
11. [总结](#总结)
|
||||
|
||||
## 概述
|
||||
|
||||
Monster类是游戏中的核心怪物实体管理器,负责怪物的完整生命周期管理,包括预制体加载、属性初始化、技能配置、碰撞体控制等关键功能。本文档将深入解析Monster类中load方法的完整初始化流程,重点阐述其动态加载机制、属性调整逻辑以及与其他系统的集成方式。
|
||||
|
||||
## 项目结构分析
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "怪物系统架构"
|
||||
A[Monster类] --> B[load方法]
|
||||
A --> C[hero_init方法]
|
||||
B --> D[预制体加载]
|
||||
B --> E[节点挂载]
|
||||
B --> F[碰撞体控制]
|
||||
C --> G[属性初始化]
|
||||
C --> H[技能配置]
|
||||
C --> I[Buff系统]
|
||||
end
|
||||
subgraph "配置系统"
|
||||
J[HeroInfo配置] --> K[基础属性]
|
||||
J --> L[技能列表]
|
||||
M[SkillSet配置] --> N[技能数据]
|
||||
O[BoxSet配置] --> P[碰撞组]
|
||||
end
|
||||
subgraph "场景系统"
|
||||
Q[EntityLayer] --> R[节点管理]
|
||||
S[MapView] --> T[场景容器]
|
||||
end
|
||||
A --> J
|
||||
A --> M
|
||||
B --> Q
|
||||
B --> S
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L14-L110)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L70-L151)
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L110)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L151)
|
||||
|
||||
## 核心组件架构
|
||||
|
||||
Monster类采用ECS(Entity-Component-System)架构模式,继承自ecs.Entity基类,包含以下核心组件:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Monster {
|
||||
+HeroModel! MonModelComp
|
||||
+HeroView! HeroViewComp
|
||||
+BattleMove! BattleMoveComp
|
||||
+init() void
|
||||
+destroy() void
|
||||
+load(pos, scale, uuid, is_boss, is_call, strengthMultiplier) void
|
||||
+hero_init(uuid, node, scale, box_group, is_boss, is_call, strengthMultiplier) void
|
||||
}
|
||||
class MonModelComp {
|
||||
+reset() void
|
||||
}
|
||||
class HeroViewComp {
|
||||
+scale number
|
||||
+fac FacSet
|
||||
+type HType
|
||||
+is_boss boolean
|
||||
+box_group BoxSet
|
||||
+hero_uuid number
|
||||
+hero_name string
|
||||
+base_hp number
|
||||
+base_mp number
|
||||
+base_ap number
|
||||
+base_def number
|
||||
+skills Skill[]
|
||||
+Attrs Attrs
|
||||
+initAttrs() void
|
||||
}
|
||||
class BattleMoveComp {
|
||||
+direction number
|
||||
+targetX number
|
||||
}
|
||||
Monster --> MonModelComp : "包含"
|
||||
Monster --> HeroViewComp : "包含"
|
||||
Monster --> BattleMoveComp : "包含"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L14-L35)
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts#L10-L18)
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L14-L35)
|
||||
|
||||
## Monster类load方法详解
|
||||
|
||||
load方法是Monster类的核心初始化入口,负责完整的怪物实体创建流程:
|
||||
|
||||
### 方法签名与参数说明
|
||||
|
||||
| 参数名 | 类型 | 默认值 | 说明 |
|
||||
|--------|------|--------|------|
|
||||
| pos | Vec3 | Vec3.ZERO | 怪物初始位置坐标 |
|
||||
| scale | number | 1 | 怪物缩放比例 |
|
||||
| uuid | number | 1001 | 怪物唯一标识符 |
|
||||
| is_boss | boolean | false | 是否为Boss怪物 |
|
||||
| is_call | boolean | false | 是否为召唤怪物 |
|
||||
| strengthMultiplier | number | 1.0 | 强度倍率 |
|
||||
|
||||
### 完整初始化流程
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[开始load方法] --> B[设置缩放参数]
|
||||
B --> C[确定碰撞组]
|
||||
C --> D[获取场景引用]
|
||||
D --> E[构建资源路径]
|
||||
E --> F[加载预制体]
|
||||
F --> G{预制体加载成功?}
|
||||
G --> |否| H[抛出异常]
|
||||
G --> |是| I[创建节点实例]
|
||||
I --> J[设置父节点]
|
||||
J --> K[禁用碰撞体]
|
||||
K --> L[设置初始位置]
|
||||
L --> M[调用hero_init]
|
||||
M --> N[派发monster_load事件]
|
||||
N --> O[初始化移动参数]
|
||||
O --> P[更新怪物计数]
|
||||
P --> Q[结束]
|
||||
H --> R[错误处理]
|
||||
R --> Q
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L36-L60)
|
||||
|
||||
### 关键实现细节
|
||||
|
||||
#### 1. 动态资源路径构建
|
||||
```typescript
|
||||
// 资源路径格式:game/heros/{hero.path}
|
||||
var path = "game/heros/" + HeroInfo[uuid].path;
|
||||
```
|
||||
|
||||
#### 2. 碰撞体延迟启用机制
|
||||
```typescript
|
||||
// 先禁用碰撞体,延迟一帧启用
|
||||
const collider = node.getComponent(BoxCollider2D);
|
||||
if (collider) collider.enabled = false;
|
||||
```
|
||||
|
||||
#### 3. 缩放与方向控制
|
||||
```typescript
|
||||
// Boss怪物特殊处理
|
||||
let scale = -1; // 默认向左朝向
|
||||
if (is_boss) scale = 1; // Boss面向右侧
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L36-L60)
|
||||
|
||||
## hero_init方法深度解析
|
||||
|
||||
hero_init方法负责怪物的基础属性初始化和技能配置,是怪物能力系统的核心:
|
||||
|
||||
### 属性初始化流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MI as Monster Instance
|
||||
participant HV as HeroViewComp
|
||||
participant HI as HeroInfo
|
||||
participant SS as SkillSet
|
||||
participant AS as Attrs System
|
||||
MI->>HV : 获取HeroView组件
|
||||
MI->>HI : 查询怪物配置
|
||||
MI->>HV : 设置基础属性
|
||||
MI->>MI : 计算强度倍率属性
|
||||
MI->>SS : 遍历技能列表
|
||||
SS-->>MI : 返回技能配置
|
||||
MI->>HV : 添加技能到技能列表
|
||||
MI->>AS : 初始化属性系统
|
||||
MI->>HV : 调用initAttrs()
|
||||
MI->>MI : 添加到实体组件
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L61-L108)
|
||||
|
||||
### 强度倍率动态调整机制
|
||||
|
||||
hero_init方法的核心特性是根据strengthMultiplier参数动态调整怪物属性:
|
||||
|
||||
#### 基础属性计算公式
|
||||
```typescript
|
||||
// 根据强度倍率调整基础属性
|
||||
const baseHp = Math.floor(hero.hp * strengthMultiplier);
|
||||
const baseAp = Math.floor(hero.ap * strengthMultiplier);
|
||||
const baseDef = Math.floor(hero.def * strengthMultiplier);
|
||||
```
|
||||
|
||||
#### 属性倍率影响范围
|
||||
| 属性类型 | 基础值 | 强度倍率影响 | 说明 |
|
||||
|----------|--------|--------------|------|
|
||||
| HP | hero.hp | × strengthMultiplier | 生命值线性增长 |
|
||||
| AP | hero.ap | × strengthMultiplier | 物理攻击力线性增长 |
|
||||
| DEF | hero.def | × strengthMultiplier | 物理防御力线性增长 |
|
||||
| MP | hero.mp | 不受影响 | 魔法值保持不变 |
|
||||
|
||||
### 技能系统初始化
|
||||
|
||||
#### 技能配置转换
|
||||
```typescript
|
||||
// 将HeroInfo中的技能ID转换为完整的技能配置
|
||||
for (let i = 0; i < hero.skills.length; i++) {
|
||||
let skill = {
|
||||
uuid: SkillSet[hero.skills[i]].uuid,
|
||||
cd_max: SkillSet[hero.skills[i]].cd,
|
||||
cost: SkillSet[hero.skills[i]].cost,
|
||||
cd: 0
|
||||
}
|
||||
hv.skills.push(skill);
|
||||
}
|
||||
```
|
||||
|
||||
#### 技能冷却系统
|
||||
每个技能初始化时:
|
||||
- `cd_max`: 技能最大冷却时间
|
||||
- `cost`: 技能消耗值
|
||||
- `cd`: 当前冷却计时器(初始为0)
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L61-L108)
|
||||
|
||||
## 资源加载与预制体管理
|
||||
|
||||
### 资源加载机制
|
||||
|
||||
游戏采用Oops Framework的资源管理系统,通过oops.res.get方法加载预制体:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[资源请求] --> B[oops.res.get]
|
||||
B --> C{资源是否存在?}
|
||||
C --> |是| D[返回预制体]
|
||||
C --> |否| E[抛出错误]
|
||||
D --> F[实例化预制体]
|
||||
F --> G[返回节点实例]
|
||||
E --> H[异常处理]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L40-L42)
|
||||
|
||||
### 常见资源路径错误
|
||||
|
||||
#### 错误类型与解决方案
|
||||
|
||||
| 错误类型 | 症状 | 解决方案 |
|
||||
|----------|------|----------|
|
||||
| 路径不存在 | 预制体加载失败 | 检查HeroInfo配置中的path字段 |
|
||||
| 文件损坏 | 实例化时报错 | 重新导入预制体资源 |
|
||||
| 资源未打包 | 运行时找不到资源 | 确保资源已正确打包到构建中 |
|
||||
|
||||
### UUID越界检查
|
||||
|
||||
```typescript
|
||||
// UUID有效性验证
|
||||
let hero = HeroInfo[uuid];
|
||||
if (!hero) {
|
||||
console.error(`[Monster] 无效的怪物UUID: ${uuid}`);
|
||||
throw new Error(`怪物配置不存在: ${uuid}`);
|
||||
}
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L40-L42)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L70-L151)
|
||||
|
||||
## 场景节点挂载机制
|
||||
|
||||
### EntityLayer节点管理
|
||||
|
||||
EntityLayer作为场景中的物体层,负责管理所有动态物体的渲染顺序和生命周期:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
A[Scene] --> B[EntityLayer]
|
||||
B --> C[怪物节点]
|
||||
B --> D[技能特效]
|
||||
B --> E[UI元素]
|
||||
C --> F[Monster实例]
|
||||
F --> G[HeroViewComp]
|
||||
F --> H[MonModelComp]
|
||||
F --> I[BattleMoveComp]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L18-L38)
|
||||
|
||||
### 挂载流程详解
|
||||
|
||||
#### 1. 场景引用获取
|
||||
```typescript
|
||||
var scene = smc.map.MapView.scene;
|
||||
```
|
||||
|
||||
#### 2. 父节点设置
|
||||
```typescript
|
||||
node.parent = scene.entityLayer!.node!;
|
||||
```
|
||||
|
||||
#### 3. 深度排序机制
|
||||
EntityLayer实现了定时器驱动的深度排序:
|
||||
```typescript
|
||||
private timer: Timer = new Timer(0.2);
|
||||
update(dt: number) {
|
||||
this.timer.update(dt);
|
||||
// 深度排序逻辑
|
||||
}
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [EntityLayer.ts](file://assets/script/game/map/view/map/layer/EntityLayer.ts#L18-L38)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L44-L45)
|
||||
|
||||
## 消息事件系统
|
||||
|
||||
### monster_load事件派发
|
||||
|
||||
游戏通过oops.message系统实现松耦合的消息通信:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant M as Monster
|
||||
participant EM as Event Manager
|
||||
participant MC as MissionMonComp
|
||||
participant SM as Scene Manager
|
||||
M->>EM : dispatchEvent("monster_load", monster)
|
||||
EM->>MC : 通知怪物加载完成
|
||||
MC->>SM : 更新场景状态
|
||||
SM->>M : 可能的后续处理
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L56-L57)
|
||||
|
||||
### 事件监听与处理
|
||||
|
||||
#### MissionMonComp中的事件处理
|
||||
```typescript
|
||||
onLoad() {
|
||||
this.on(GameEvent.FightReady, this.fight_ready, this);
|
||||
this.on(GameEvent.NewWave, this.fight_ready, this);
|
||||
}
|
||||
```
|
||||
|
||||
#### 事件处理流程
|
||||
1. **FightReady事件**: 准备战斗阶段
|
||||
2. **NewWave事件**: 新一波怪物生成
|
||||
3. **monster_load事件**: 怪物实体加载完成
|
||||
|
||||
### 事件系统优势
|
||||
|
||||
| 优势 | 说明 | 应用场景 |
|
||||
|------|------|----------|
|
||||
| 松耦合 | 组件间无需直接依赖 | 怪物生成与场景管理 |
|
||||
| 可扩展 | 易于添加新的事件处理器 | 新增功能模块 |
|
||||
| 异步处理 | 支持异步事件流 | 怪物AI行为 |
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L56-L57)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L34-L40)
|
||||
|
||||
## 异常处理与调试策略
|
||||
|
||||
### 常见异常类型
|
||||
|
||||
#### 1. 资源加载异常
|
||||
```typescript
|
||||
try {
|
||||
var prefab: Prefab = oops.res.get(path, Prefab)!;
|
||||
var node = instantiate(prefab);
|
||||
} catch (error) {
|
||||
console.error(`[Monster] 预制体加载失败: ${path}`, error);
|
||||
// 回退到默认预制体或显示错误界面
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. UUID越界异常
|
||||
```typescript
|
||||
if (!HeroInfo[uuid]) {
|
||||
console.error(`[Monster] 未知的怪物UUID: ${uuid}`);
|
||||
// 使用默认怪物配置
|
||||
uuid = 5201; // 兽人战士作为默认值
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 节点层级缺失异常
|
||||
```typescript
|
||||
if (!scene.entityLayer || !scene.entityLayer.node) {
|
||||
console.error('[Monster] 场景实体层不存在');
|
||||
// 创建默认场景结构
|
||||
}
|
||||
```
|
||||
|
||||
### 调试策略
|
||||
|
||||
#### 1. 日志记录系统
|
||||
```typescript
|
||||
// 详细日志级别
|
||||
console.log("[Mon] mission_data.mon_num:", smc.vmdata.mission_data.mon_num);
|
||||
console.log("[Monster] 加载怪物:", uuid, "类型:", HeroInfo[uuid].type);
|
||||
```
|
||||
|
||||
#### 2. 断点调试技巧
|
||||
```typescript
|
||||
// 在关键位置设置断点
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
debugger;
|
||||
}
|
||||
```
|
||||
|
||||
#### 3. 性能监控
|
||||
```typescript
|
||||
// 性能计时器
|
||||
const startTime = performance.now();
|
||||
// ... 执行加载操作
|
||||
const endTime = performance.now();
|
||||
console.log(`[Monster] 加载耗时: ${endTime - startTime}ms`);
|
||||
```
|
||||
|
||||
### 异常恢复机制
|
||||
|
||||
#### 资源回退策略
|
||||
```typescript
|
||||
// 1. 尝试加载指定资源
|
||||
// 2. 如果失败,尝试加载备用资源
|
||||
// 3. 如果仍然失败,使用默认资源
|
||||
```
|
||||
|
||||
#### 配置验证
|
||||
```typescript
|
||||
// 验证HeroInfo配置完整性
|
||||
function validateHeroConfig(hero: heroInfo): boolean {
|
||||
return hero &&
|
||||
hero.hp > 0 &&
|
||||
hero.ap > 0 &&
|
||||
hero.def > 0 &&
|
||||
hero.skills.length > 0;
|
||||
}
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L36-L60)
|
||||
|
||||
## 实际应用示例
|
||||
|
||||
### 生成普通怪物
|
||||
|
||||
```typescript
|
||||
// 创建普通怪物实例
|
||||
let monster = ecs.getEntity<Monster>(Monster);
|
||||
let pos: Vec3 = v3(240, 100, 0);
|
||||
let scale = -1;
|
||||
|
||||
monster.load(
|
||||
pos, // 初始位置
|
||||
scale, // 缩放比例
|
||||
5201, // 兽人战士UUID
|
||||
false, // 非Boss
|
||||
false, // 非召唤
|
||||
1.0 // 强度倍率
|
||||
);
|
||||
```
|
||||
|
||||
### 生成Boss怪物
|
||||
|
||||
```typescript
|
||||
// 创建Boss怪物实例
|
||||
let boss = ecs.getEntity<Monster>(Monster);
|
||||
let bossPos: Vec3 = v3(400, 100, 0);
|
||||
|
||||
boss.load(
|
||||
bossPos, // Boss专用位置
|
||||
1, // 正向缩放
|
||||
5201, // 使用相同基础配置
|
||||
true, // Boss标志
|
||||
false, // 非召唤
|
||||
2.0 // 双倍强度
|
||||
);
|
||||
```
|
||||
|
||||
### MissionMonComp中的批量生成
|
||||
|
||||
```typescript
|
||||
// 在MissionMonComp中批量生成怪物
|
||||
private addMonster(
|
||||
uuid: number = 1001,
|
||||
i: number = 0,
|
||||
is_boss: boolean = false,
|
||||
is_call: boolean = false,
|
||||
lv: number = 1,
|
||||
strengthMultiplier: number = 1.0
|
||||
) {
|
||||
let mon = ecs.getEntity<Monster>(Monster);
|
||||
let scale = -1;
|
||||
let pos: Vec3 = v3(MonSet[i].pos);
|
||||
|
||||
mon.load(pos, scale, uuid, is_boss, is_call, strengthMultiplier);
|
||||
}
|
||||
```
|
||||
|
||||
### 强度倍率的实际效果
|
||||
|
||||
#### 基础属性对比表
|
||||
|
||||
| 属性类型 | 基础值(1.0倍) | 1.5倍 | 2.0倍 | 2.5倍 |
|
||||
|----------|---------------|-------|-------|-------|
|
||||
| HP | 25 | 37 | 50 | 62 |
|
||||
| AP | 5 | 7 | 10 | 12 |
|
||||
| DEF | 5 | 7 | 10 | 12 |
|
||||
| MP | 100 | 100 | 100 | 100 |
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L215-L239)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L120-L151)
|
||||
|
||||
## 总结
|
||||
|
||||
Monster类的load方法和hero_init方法构成了游戏怪物系统的核心基础设施,通过以下关键技术实现了灵活而强大的怪物生成机制:
|
||||
|
||||
### 核心技术特点
|
||||
|
||||
1. **动态资源加载**: 基于UUID的预制体动态加载,支持运行时配置
|
||||
2. **属性倍率系统**: 通过strengthMultiplier参数实现怪物强度的灵活调整
|
||||
3. **ECS架构模式**: 清晰的组件分离,便于维护和扩展
|
||||
4. **事件驱动通信**: 松耦合的消息系统,支持复杂的业务逻辑
|
||||
5. **异常处理机制**: 完善的错误处理和恢复策略
|
||||
|
||||
### 性能优化要点
|
||||
|
||||
- **预制体缓存**: 利用Oops Framework的资源管理系统
|
||||
- **延迟初始化**: 碰撞体的延迟启用减少初始化开销
|
||||
- **批量操作**: MissionMonComp中的批量怪物生成
|
||||
- **内存管理**: 及时清理不再使用的怪物实体
|
||||
|
||||
### 扩展建议
|
||||
|
||||
1. **配置系统增强**: 支持更多的怪物类型和属性变体
|
||||
2. **AI行为系统**: 集成更复杂的怪物AI逻辑
|
||||
3. **视觉效果**: 添加更多的怪物特效和动画
|
||||
4. **平衡性调整**: 提供更精细的难度调节机制
|
||||
|
||||
通过深入理解这些机制,开发者可以更好地维护和扩展游戏的怪物系统,为玩家提供更加丰富和有趣的游戏体验。
|
||||
270
.qoder/repowiki/zh/content/地图系统/怪物系统/怪物实体/怪物实体组件系统.md
Normal file
270
.qoder/repowiki/zh/content/地图系统/怪物系统/怪物实体/怪物实体组件系统.md
Normal file
@@ -0,0 +1,270 @@
|
||||
# 怪物实体组件系统
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
|
||||
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts)
|
||||
- [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts)
|
||||
- [Main.ts](file://assets/script/Main.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [引言](#引言)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概述](#架构概述)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖分析](#依赖分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 引言
|
||||
本文档详细说明了Cocos游戏项目中Monster实体的ECS(实体-组件-系统)机制,重点分析了在init方法中注册BattleMoveComp和MonModelComp组件的实现。文档深入解析了BattleMoveComp如何驱动怪物向左移动至目标X坐标(-800)的逻辑,结合BoxSet.MONSTER碰撞分组常量说明其在物理系统中的角色定义。同时阐述了MonModelComp作为数据容器的职责,包括属性重置机制与扩展字段设计原则,并提供开发示例和典型问题排查方法。
|
||||
|
||||
## 项目结构
|
||||
本项目采用基于功能模块的文件组织方式,核心游戏逻辑位于`assets/script/game`目录下,分为多个子模块如`hero`、`common`、`map`等。ECS相关组件和系统被组织在`common/ecs/position`路径下,体现了清晰的架构分层。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "Assets"
|
||||
subgraph "Script"
|
||||
subgraph "Game"
|
||||
Hero[hero模块]
|
||||
Common[common模块]
|
||||
Map[map模块]
|
||||
Initialize[initialize模块]
|
||||
end
|
||||
Main[Main.ts]
|
||||
end
|
||||
Resources[resources]
|
||||
end
|
||||
Hero --> |包含| Monster[Monster实体]
|
||||
Common --> |包含| ECS[ECS系统]
|
||||
Common --> |包含| Config[配置文件]
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
|
||||
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts)
|
||||
|
||||
**Section sources**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [Main.ts](file://assets/script/Main.ts)
|
||||
|
||||
## 核心组件
|
||||
Monster实体通过ECS架构实现了行为与数据的分离,其核心由BattleMoveComp(移动行为)和MonModelComp(数据模型)两个组件构成。这种设计模式使得组件可以独立开发、测试和复用,同时通过系统(System)统一管理组件间的交互逻辑。
|
||||
|
||||
**Section sources**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts)
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts)
|
||||
|
||||
## 架构概述
|
||||
游戏采用ECS(Entity-Component-System)架构模式,将游戏对象分解为实体(Entity)、组件(Component)和系统(System)三个核心概念。实体作为容器,持有多个组件;组件作为纯数据结构,存储特定功能的数据;系统则负责处理具有特定组件组合的实体,实现游戏逻辑。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Entity {
|
||||
+addComponent(comp)
|
||||
+removeComponent(comp)
|
||||
+getComponent(type)
|
||||
}
|
||||
class Component {
|
||||
<<abstract>>
|
||||
+reset()
|
||||
}
|
||||
class System {
|
||||
<<abstract>>
|
||||
+filter()
|
||||
+update(entity)
|
||||
}
|
||||
class Monster {
|
||||
-BattleMoveComp
|
||||
-MonModelComp
|
||||
-TalComp
|
||||
}
|
||||
class BattleMoveComp {
|
||||
+direction : number
|
||||
+targetX : number
|
||||
+moving : boolean
|
||||
}
|
||||
class MonModelComp {
|
||||
<<data container>>
|
||||
}
|
||||
class BattleMoveSystem {
|
||||
+filter()
|
||||
+update(entity)
|
||||
}
|
||||
Entity <|-- Monster
|
||||
Component <|-- BattleMoveComp
|
||||
Component <|-- MonModelComp
|
||||
System <|-- BattleMoveSystem
|
||||
Monster --> BattleMoveComp
|
||||
Monster --> MonModelComp
|
||||
BattleMoveSystem ..> BattleMoveComp : processes
|
||||
BattleMoveSystem ..> HeroViewComp : interacts with
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### Monster实体初始化机制
|
||||
Monster实体在初始化时通过`addComponents`方法注册了BattleMoveComp、MonModelComp和TalComp三个组件。这一过程遵循ECS框架的组件注册规范,确保实体具备必要的数据和行为能力。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant M as Monster
|
||||
participant ECS as ECS框架
|
||||
participant BMS as BattleMoveSystem
|
||||
M->>ECS : init()
|
||||
M->>ECS : addComponents(BattleMoveComp, MonModelComp, TalComp)
|
||||
ECS->>M : 返回组件实例引用
|
||||
M->>M : 设置HeroModel、HeroView、BattleMove成员变量
|
||||
M->>BMS : 系统检测到新实体
|
||||
BMS->>BMS : 将实体加入处理队列
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
|
||||
|
||||
**Section sources**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L15-L30)
|
||||
|
||||
### BattleMoveComp移动逻辑解析
|
||||
BattleMoveComp组件负责管理怪物的移动行为,其核心属性包括`direction`(移动方向)、`targetX`(目标X坐标)和`moving`(移动状态)。在Monster的`load`方法中,这些属性被初始化为向左移动至-800坐标。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始移动]) --> CheckState["检查游戏状态<br/>(play && !pause)"]
|
||||
CheckState --> |否| End([停止移动])
|
||||
CheckState --> |是| CheckStop["检查停止条件<br/>(is_stop, is_dead, isStun等)"]
|
||||
CheckStop --> |是| SetIdle["设置idle状态"] --> End
|
||||
CheckStop --> |否| CalculateDelta["计算位移增量<br/>delta = (SPEED/3) * dt * direction"]
|
||||
CalculateDelta --> CalculateNewX["计算新X坐标<br/>newX = currentX + delta"]
|
||||
CalculateNewX --> ValidatePos["验证位置有效性"]
|
||||
ValidatePos --> |有效| UpdatePos["更新节点位置"] --> SetMove["设置move状态"] --> End
|
||||
ValidatePos --> |无效| StopMoving["设置moving=false"] --> SetIdle --> End
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L1-L15)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L50-L270)
|
||||
|
||||
**Section sources**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L80-L90)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
|
||||
|
||||
### BoxSet.MONSTER碰撞分组角色
|
||||
BoxSet.MONSTER常量定义了怪物实体在物理系统中的碰撞分组标识,值为2。该常量不仅用于物理碰撞检测,还作为阵营标识参与游戏逻辑判断,如敌我识别、技能作用范围等。
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
BOXSET ||--o{ MONSTER : "包含"
|
||||
BOXSET ||--o{ HERO : "包含"
|
||||
BOXSET ||--o{ SKILL : "包含"
|
||||
BOXSET {
|
||||
int MONSTER
|
||||
int HERO
|
||||
int SKILL_TAG
|
||||
int ATK_RANGE
|
||||
}
|
||||
MONSTER {
|
||||
string name
|
||||
int group = 2
|
||||
}
|
||||
HERO {
|
||||
string name
|
||||
int group = 4
|
||||
}
|
||||
SKILL {
|
||||
string name
|
||||
int tag = 8
|
||||
}
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts#L5-L15)
|
||||
|
||||
**Section sources**
|
||||
- [BoxSet.ts](file://assets/script/game/common/config/BoxSet.ts)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L75-L80)
|
||||
|
||||
### MonModelComp数据容器职责
|
||||
MonModelComp作为纯粹的数据容器组件,遵循ECS框架的组件设计原则。其主要职责是存储怪物的持久化数据,通过reset方法实现组件回收时的状态重置,保证组件在对象池中的可重用性。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MonModelComp {
|
||||
<<data container>>
|
||||
+reset()
|
||||
}
|
||||
note right of MonModelComp
|
||||
作为数据容器,不包含业务逻辑
|
||||
所有数据操作由系统或其他组件完成
|
||||
reset方法确保组件回收时状态清零
|
||||
end note
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts#L1-L20)
|
||||
|
||||
**Section sources**
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts)
|
||||
|
||||
## 依赖分析
|
||||
Monster实体的组件系统存在明确的依赖关系,BattleMoveComp依赖于HeroViewComp的存在,因为移动逻辑需要操作视图节点的位置和状态。这种依赖关系通过BattleMoveSystem的filter方法声明,确保只有同时拥有这两个组件的实体才会被系统处理。
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[BattleMoveSystem] --> B[BattleMoveComp]
|
||||
A --> C[HeroViewComp]
|
||||
D[Monster] --> B
|
||||
D --> E[MonModelComp]
|
||||
D --> F[TalComp]
|
||||
D --> C
|
||||
style A fill:#f9f,stroke:#333
|
||||
style B fill:#bbf,stroke:#333
|
||||
style C fill:#bbf,stroke:#333
|
||||
style D fill:#9f9,stroke:#333
|
||||
style E fill:#f96,stroke:#333
|
||||
style F fill:#f96,stroke:#333
|
||||
```
|
||||
|
||||
**Diagram sources**
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L10-L15)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
|
||||
**Section sources**
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
|
||||
## 性能考虑
|
||||
ECS架构通过组件对象池机制有效减少了运行时的内存分配和垃圾回收压力。BattleMoveComp和MonModelComp的reset方法确保了组件在销毁时能够正确重置状态,使其可以安全地返回对象池供后续复用,从而提升整体性能表现。
|
||||
|
||||
## 故障排除指南
|
||||
### 组件注册遗漏
|
||||
当Monster实体缺少必要组件时,可能导致移动功能失效或数据丢失。检查`init`方法中的`addComponents`调用,确保所有必需组件都被正确注册。
|
||||
|
||||
**Section sources**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L15-L30)
|
||||
|
||||
### 依赖顺序错误
|
||||
BattleMoveSystem要求实体同时拥有BattleMoveComp和HeroViewComp才能正常工作。如果组件添加顺序不当或遗漏HeroViewComp,系统将无法处理该实体。确保在调用`hero_init`方法前已完成所有必要组件的注册。
|
||||
|
||||
**Section sources**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L100-L120)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L10-L15)
|
||||
|
||||
## 结论
|
||||
Monster实体的ECS实现展示了良好的架构设计,通过组件化分离了数据与行为,提高了代码的可维护性和可扩展性。BattleMoveComp的移动逻辑与BoxSet.MONSTER的碰撞分组协同工作,确保了怪物在游戏世界中的正确行为。开发者在扩展功能时应遵循相同的组件设计原则,确保系统的稳定性和一致性。
|
||||
427
.qoder/repowiki/zh/content/地图系统/怪物系统/怪物系统.md
Normal file
427
.qoder/repowiki/zh/content/地图系统/怪物系统/怪物系统.md
Normal file
@@ -0,0 +1,427 @@
|
||||
# 怪物系统
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
|
||||
Mon.ts文件定义了游戏中的怪物系统,采用ECS(Entity-Component-System)架构模式,通过继承Entity类并注册为`Monster`类型来实现怪物实体的管理和控制。该系统提供了完整的怪物生命周期管理,包括预制体动态加载、属性初始化、难度自适应调整以及移动行为控制等功能。
|
||||
|
||||
## 项目结构
|
||||
|
||||
怪物系统的文件组织结构体现了清晰的模块化设计:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "怪物系统模块"
|
||||
Mon[Mon.ts<br/>怪物实体类]
|
||||
MonModel[MonModelComp.ts<br/>怪物模型组件]
|
||||
BattleMove[BattleMoveComp.ts<br/>移动组件]
|
||||
end
|
||||
subgraph "配置系统"
|
||||
HeroSet[heroSet.ts<br/>英雄配置]
|
||||
HeroAttrs[HeroAttrs.ts<br/>属性配置]
|
||||
end
|
||||
subgraph "ECS系统"
|
||||
BattleMoveSys[BattleMoveSystem.ts<br/>移动系统]
|
||||
end
|
||||
Mon --> MonModel
|
||||
Mon --> BattleMove
|
||||
Mon --> HeroSet
|
||||
Mon --> HeroAttrs
|
||||
BattleMoveSys --> BattleMove
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L109)
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts#L1-L20)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L1-L16)
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L109)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L1-L152)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### Monster实体类
|
||||
|
||||
Monster类是怪物系统的核心实体类,继承自ECS框架的Entity基类,并注册为`Monster`类型。该类实现了怪物的完整生命周期管理:
|
||||
|
||||
- **组件管理**:自动添加BattleMoveComp和MonModelComp组件
|
||||
- **生命周期控制**:提供init和destroy方法管理实体状态
|
||||
- **预制体加载**:通过load方法动态加载怪物预制体
|
||||
- **属性初始化**:通过hero_init方法设置怪物基础属性
|
||||
|
||||
### BattleMoveComp移动组件
|
||||
|
||||
BattleMoveComp负责控制怪物的移动行为,包含以下关键属性:
|
||||
|
||||
- **direction**:移动方向(1向右,-1向左)
|
||||
- **targetX**:目标X坐标
|
||||
- **moving**:移动状态标识
|
||||
|
||||
### 属性系统
|
||||
|
||||
怪物系统采用统一的属性管理机制,支持:
|
||||
|
||||
- **基础属性**:HP、MP、AP、DEF等核心战斗属性
|
||||
- **百分比属性**:暴击率、闪避率等百分比型属性
|
||||
- **特殊属性**:吸血、燃烧概率等特殊效果属性
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L17-L40)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L3-L15)
|
||||
|
||||
## 架构概览
|
||||
|
||||
怪物系统采用ECS架构模式,实现了高度解耦的设计:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Monster {
|
||||
+MonModelComp HeroModel
|
||||
+HeroViewComp HeroView
|
||||
+BattleMoveComp BattleMove
|
||||
+init() void
|
||||
+destroy() void
|
||||
+load(pos, scale, uuid, is_boss, is_call, strengthMultiplier) void
|
||||
+hero_init(uuid, node, scale, box_group, is_boss, is_call, strengthMultiplier) void
|
||||
}
|
||||
class BattleMoveComp {
|
||||
+number direction
|
||||
+number targetX
|
||||
+boolean moving
|
||||
+reset() void
|
||||
}
|
||||
class MonModelComp {
|
||||
+reset() void
|
||||
}
|
||||
class HeroViewComp {
|
||||
+number scale
|
||||
+FacSet fac
|
||||
+HType type
|
||||
+boolean is_boss
|
||||
+number box_group
|
||||
+number hero_uuid
|
||||
+string hero_name
|
||||
+number base_hp
|
||||
+number base_mp
|
||||
+number base_ap
|
||||
+number base_def
|
||||
+number hp
|
||||
+number mp
|
||||
+object Attrs
|
||||
+object skills
|
||||
+initAttrs() void
|
||||
}
|
||||
Monster --> BattleMoveComp : "包含"
|
||||
Monster --> MonModelComp : "包含"
|
||||
Monster --> HeroViewComp : "包含"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L17-L40)
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L3-L15)
|
||||
- [MonModelComp.ts](file://assets/script/game/hero/MonModelComp.ts#L10-L19)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### load方法:预制体动态加载流程
|
||||
|
||||
load方法实现了怪物的完整初始化流程:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Client as "调用方"
|
||||
participant Monster as "Monster实体"
|
||||
participant Resources as "资源系统"
|
||||
participant Scene as "场景节点"
|
||||
participant BattleMove as "BattleMove组件"
|
||||
Client->>Monster : load(pos, scale, uuid, ...)
|
||||
Monster->>Resources : 获取预制体路径
|
||||
Resources-->>Monster : 返回Prefab资源
|
||||
Monster->>Scene : 实例化预制体
|
||||
Scene-->>Monster : 返回Node节点
|
||||
Monster->>Monster : 设置位置和缩放
|
||||
Monster->>Monster : hero_init初始化属性
|
||||
Monster->>BattleMove : 设置移动参数
|
||||
BattleMove->>BattleMove : direction = -1
|
||||
BattleMove->>BattleMove : targetX = -800
|
||||
Monster->>Client : dispatchEvent("monster_load")
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L35-L58)
|
||||
|
||||
#### 关键步骤解析:
|
||||
|
||||
1. **预制体路径构建**:根据uuid从HeroInfo配置中获取对应的预制体路径
|
||||
2. **实例化处理**:使用oops.res.get获取预制体并实例化
|
||||
3. **场景集成**:将实例化的节点添加到场景的entityLayer中
|
||||
4. **碰撞体管理**:先禁用碰撞体,延迟一帧再启用以避免初始化问题
|
||||
5. **位置设置**:根据传入的pos参数设置怪物初始位置
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L35-L58)
|
||||
|
||||
### hero_init方法:难度自适应属性系统
|
||||
|
||||
hero_init方法实现了基于strengthMultiplier的难度自适应属性调整:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始初始化]) --> GetHeroInfo["获取英雄配置信息"]
|
||||
GetHeroInfo --> SetBasicProps["设置基础属性"]
|
||||
SetBasicProps --> CalcStrength["计算强度倍率"]
|
||||
CalcStrength --> AdjustHP["调整HP = hero.hp × strengthMultiplier"]
|
||||
AdjustHP --> AdjustAP["调整AP = hero.ap × strengthMultiplier"]
|
||||
AdjustAP --> AdjustDEF["调整DEF = hero.def × strengthMultiplier"]
|
||||
AdjustDEF --> LoadSkills["加载技能配置"]
|
||||
LoadSkills --> InitAttrs["初始化属性系统"]
|
||||
InitAttrs --> Complete([初始化完成])
|
||||
style Start fill:#e1f5fe
|
||||
style Complete fill:#e8f5e8
|
||||
style CalcStrength fill:#fff3e0
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L60-L91)
|
||||
|
||||
#### 属性调整机制:
|
||||
|
||||
1. **基础属性计算**:
|
||||
- HP = hero.hp × strengthMultiplier(向下取整)
|
||||
- AP = hero.ap × strengthMultiplier(向下取整)
|
||||
- DEF = hero.def × strengthMultiplier(向下取整)
|
||||
|
||||
2. **技能系统集成**:
|
||||
- 遍历hero.skills数组
|
||||
- 从SkillSet配置中获取技能详细信息
|
||||
- 创建技能对象并添加到hv.skills数组
|
||||
|
||||
3. **属性系统初始化**:
|
||||
- 调用getAttrs()获取默认属性值
|
||||
- 调用getNeAttrs()获取负面状态属性
|
||||
- 设置各项属性的基础值和当前值
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L60-L91)
|
||||
|
||||
### BattleMoveComp组件:移动行为控制
|
||||
|
||||
BattleMoveComp组件驱动怪物向左移动的行为:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> Idle : 初始状态
|
||||
Idle --> Moving : 开始移动
|
||||
Moving --> Idle : 到达目标
|
||||
Moving --> Stopped : 遇到障碍
|
||||
Stopped --> Moving : 清除障碍
|
||||
Idle --> [*] : 销毁实体
|
||||
note right of Moving : direction = -1<br/>targetX = -800
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L3-L15)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L10-L271)
|
||||
|
||||
#### 移动参数配置:
|
||||
|
||||
- **direction = -1**:设置向左移动的方向
|
||||
- **targetX = -800**:设定左边界为目标位置
|
||||
- **moving = true**:启用移动状态
|
||||
|
||||
**章节来源**
|
||||
- [BattleMoveComp.ts](file://assets/script/game/common/ecs/position/BattleMoveComp.ts#L3-L15)
|
||||
|
||||
### 数据复用机制:HeroAttrs与heroSet配置
|
||||
|
||||
怪物系统通过HeroAttrs.ts和heroSet.ts实现英雄配置的数据复用:
|
||||
|
||||
#### HeroAttrs.ts属性系统
|
||||
|
||||
HeroAttrs.ts定义了完整的属性枚举和类型系统:
|
||||
|
||||
| 属性类别 | 属性名称 | 类型 | 描述 |
|
||||
|---------|---------|------|------|
|
||||
| 基础生存属性 | HP_MAX | VALUE | 最大生命值 |
|
||||
| 基础生存属性 | MP_MAX | VALUE | 最大魔法值 |
|
||||
| 攻击属性 | AP | VALUE | 攻击力 |
|
||||
| 攻击属性 | MAP | VALUE | 魔法攻击力 |
|
||||
| 防御属性 | DEF | VALUE | 物理防御 |
|
||||
| 特殊效果属性 | CRITICAL | RATIO | 暴击率 |
|
||||
| 增益效果属性 | SPEED | RATIO | 移动速度加成 |
|
||||
|
||||
#### heroSet.ts配置系统
|
||||
|
||||
heroSet.ts提供了怪物配置的集中管理:
|
||||
|
||||
- **HeroInfo配置表**:存储所有怪物的基础属性数据
|
||||
- **MonSet位置配置**:定义怪物在战场上的初始位置
|
||||
- **职业类型枚举**:支持warrior、remote、mage、support、assassin五种职业
|
||||
|
||||
**章节来源**
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts#L25-L105)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L60-L152)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
怪物系统的依赖关系体现了清晰的分层架构:
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "外部依赖"
|
||||
ECS[ECS框架]
|
||||
CC[Cocos Creator]
|
||||
Oops[Oops插件框架]
|
||||
end
|
||||
subgraph "核心模块"
|
||||
Monster[Monster实体]
|
||||
BattleMove[BattleMove组件]
|
||||
HeroView[HeroView组件]
|
||||
end
|
||||
subgraph "配置模块"
|
||||
HeroInfo[HeroInfo配置]
|
||||
HeroAttrs[属性配置]
|
||||
SkillSet[技能配置]
|
||||
end
|
||||
subgraph "系统模块"
|
||||
BattleMoveSys[BattleMoveSystem]
|
||||
SingletonModule[单例模块]
|
||||
end
|
||||
Monster --> ECS
|
||||
Monster --> CC
|
||||
Monster --> Oops
|
||||
Monster --> BattleMove
|
||||
Monster --> HeroView
|
||||
Monster --> HeroInfo
|
||||
Monster --> HeroAttrs
|
||||
Monster --> SkillSet
|
||||
BattleMoveSys --> BattleMove
|
||||
BattleMoveSys --> HeroView
|
||||
SingletonModule --> Monster
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L15)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L1-L10)
|
||||
|
||||
### 关键依赖说明:
|
||||
|
||||
1. **ECS框架依赖**:Monster类继承自ecs.Entity,BattleMoveComp继承自ecs.Comp
|
||||
2. **Cocos Creator依赖**:使用Node、Prefab、Vec3等Cocos类型
|
||||
3. **配置依赖**:依赖HeroInfo、HeroAttrs、SkillSet等配置模块
|
||||
4. **系统依赖**:依赖BattleMoveSystem进行移动逻辑处理
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L15)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L1-L10)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 内存管理优化
|
||||
|
||||
1. **组件化设计**:通过组件分离职责,避免单个类过于庞大
|
||||
2. **生命周期管理**:destroy方法确保正确清理组件引用
|
||||
3. **资源池化**:预制体实例化采用资源管理系统
|
||||
|
||||
### 性能优化策略
|
||||
|
||||
1. **批量更新**:BattleMoveSystem采用批量处理方式
|
||||
2. **条件检查**:在更新前进行状态检查,避免不必要的计算
|
||||
3. **边界检测**:使用validatePosition方法限制移动范围
|
||||
|
||||
### 扩展性设计
|
||||
|
||||
1. **配置驱动**:通过配置文件控制怪物属性和行为
|
||||
2. **组件扩展**:支持添加新的组件类型
|
||||
3. **系统扩展**:BattleMoveSystem可添加新的移动逻辑
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 1. 怪物无法正常移动
|
||||
|
||||
**问题现象**:怪物加载后静止不动
|
||||
|
||||
**排查步骤**:
|
||||
- 检查BattleMoveComp的moving属性是否为true
|
||||
- 验证targetX设置是否合理
|
||||
- 确认BattleMoveSystem是否正常运行
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 确保移动组件正确初始化
|
||||
const move = this.get(BattleMoveComp);
|
||||
move.moving = true;
|
||||
move.targetX = -800; // 设置合理的边界值
|
||||
```
|
||||
|
||||
#### 2. 属性计算错误
|
||||
|
||||
**问题现象**:怪物属性显示异常
|
||||
|
||||
**排查步骤**:
|
||||
- 检查strengthMultiplier参数是否正确传递
|
||||
- 验证HeroInfo配置中的基础属性值
|
||||
- 确认属性计算逻辑
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 确保属性计算正确
|
||||
const baseHp = Math.floor(hero.hp * strengthMultiplier);
|
||||
const baseAp = Math.floor(hero.ap * strengthMultiplier);
|
||||
const baseDef = Math.floor(hero.def * strengthMultiplier);
|
||||
```
|
||||
|
||||
#### 3. 预制体加载失败
|
||||
|
||||
**问题现象**:怪物无法显示模型
|
||||
|
||||
**排查步骤**:
|
||||
- 检查HeroInfo中的path配置是否正确
|
||||
- 验证资源路径是否存在
|
||||
- 确认资源是否已正确打包
|
||||
|
||||
**解决方案**:
|
||||
```typescript
|
||||
// 确保资源路径正确
|
||||
var path = "game/heros/" + HeroInfo[uuid].path;
|
||||
var prefab: Prefab = oops.res.get(path, Prefab)!;
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L35-L58)
|
||||
- [BattleMoveSystem.ts](file://assets/script/game/common/ecs/position/BattleMoveSystem.ts#L10-L50)
|
||||
|
||||
## 结论
|
||||
|
||||
Mon.ts文件实现了一个功能完整、架构清晰的怪物系统。通过ECS架构模式,系统实现了高度的模块化和可扩展性。主要特点包括:
|
||||
|
||||
1. **ECS架构优势**:通过组件化设计实现了职责分离和代码复用
|
||||
2. **难度自适应**:基于strengthMultiplier的属性调整机制提供了灵活的难度控制
|
||||
3. **数据复用**:通过HeroAttrs和heroSet配置系统实现了数据的集中管理
|
||||
4. **性能优化**:采用组件化和批量处理策略确保良好的运行性能
|
||||
5. **扩展性强**:支持添加新怪物类型、配置技能组合和实现召唤单位等扩展需求
|
||||
|
||||
该系统为游戏开发提供了坚实的基础,能够满足不同类型怪物的开发需求,同时保持了良好的维护性和扩展性。
|
||||
498
.qoder/repowiki/zh/content/地图系统/怪物系统/技能机制.md
Normal file
498
.qoder/repowiki/zh/content/地图系统/怪物系统/技能机制.md
Normal file
@@ -0,0 +1,498 @@
|
||||
# 技能机制
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts)
|
||||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts)
|
||||
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts)
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [概述](#概述)
|
||||
2. [核心组件架构](#核心组件架构)
|
||||
3. [技能初始化机制](#技能初始化机制)
|
||||
4. [技能控制系统](#技能控制系统)
|
||||
5. [技能数据结构](#技能数据结构)
|
||||
6. [技能释放流程](#技能释放流程)
|
||||
7. [技能类型与效果](#技能类型与效果)
|
||||
8. [开发指引](#开发指引)
|
||||
9. [常见问题与解决方案](#常见问题与解决方案)
|
||||
10. [总结](#总结)
|
||||
|
||||
## 概述
|
||||
|
||||
本游戏采用基于ECS(Entity-Component-System)架构的技能系统,通过多个核心组件协同工作,实现了复杂的技能机制。技能系统支持主动技能、被动技能、技能组合以及自定义技能行为,为战斗提供了丰富的策略深度。
|
||||
|
||||
## 核心组件架构
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Monster {
|
||||
+MonModelComp HeroModel
|
||||
+HeroViewComp HeroView
|
||||
+BattleMoveComp BattleMove
|
||||
+hero_init(uuid, node, scale, box_group, is_boss, is_call, strength_multiplier)
|
||||
+load(pos, scale, uuid, is_boss, is_call, strengthMultiplier)
|
||||
}
|
||||
class SkillConComp {
|
||||
+HeroView HeroView
|
||||
+HeroEntity HeroEntity
|
||||
+TALCOMP TALCOMP
|
||||
+skill_cd number
|
||||
+update(dt)
|
||||
+castSkill(config)
|
||||
+doSkill(config, is_wfuny, dmg)
|
||||
+selectTargets(t_num)
|
||||
}
|
||||
class SkillEnt {
|
||||
+load(startPos, parent, uuid, targetPos, caster, dmg)
|
||||
+destroy()
|
||||
}
|
||||
class HeroViewComp {
|
||||
+skills any[]
|
||||
+mp number
|
||||
+hp number
|
||||
+Attrs any[]
|
||||
+playSkillEffect(skill_id)
|
||||
+do_atked(remainingDamage, CAttrs, s_uuid)
|
||||
}
|
||||
class SkillSet {
|
||||
+uuid number
|
||||
+name string
|
||||
+SType SType
|
||||
+TGroup TGroup
|
||||
+ap number
|
||||
+cd number
|
||||
+cost number
|
||||
}
|
||||
Monster --> SkillConComp : "包含"
|
||||
SkillConComp --> HeroViewComp : "控制"
|
||||
SkillConComp --> SkillEnt : "创建"
|
||||
SkillEnt --> SkillViewCom : "加载"
|
||||
HeroViewComp --> SkillSet : "使用配置"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L1-L111)
|
||||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L1-L177)
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L1-L78)
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L1-L780)
|
||||
|
||||
## 技能初始化机制
|
||||
|
||||
### hero_init方法详解
|
||||
|
||||
`hero_init`方法是技能初始化的核心入口,负责根据英雄配置动态创建技能实例并设置各项参数。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["开始 hero_init"] --> B["获取英雄配置"]
|
||||
B --> C["初始化基础属性"]
|
||||
C --> D["遍历技能数组"]
|
||||
D --> E["创建技能对象"]
|
||||
E --> F["设置UUID、CD、消耗值"]
|
||||
F --> G["添加到技能列表"]
|
||||
G --> H["初始化属性系统"]
|
||||
H --> I["结束"]
|
||||
E --> E1["uuid: SkillSet[hero.skills[i]].uuid"]
|
||||
E --> E2["cd_max: SkillSet[hero.skills[i]].cd"]
|
||||
E --> E3["cost: SkillSet[hero.skills[i]].cost"]
|
||||
E --> E4["cd: 0"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L65-L85)
|
||||
|
||||
#### 技能初始化步骤
|
||||
|
||||
1. **英雄配置获取**:从`HeroInfo`中获取英雄基础数据
|
||||
2. **属性基础值设置**:根据强度倍率调整基础属性值
|
||||
3. **技能数组遍历**:逐个处理英雄配置中的技能UUID
|
||||
4. **技能对象创建**:为每个技能创建包含UUID、冷却时间、消耗值的对象
|
||||
5. **技能列表填充**:将创建的技能对象添加到`HeroView.skills`数组
|
||||
6. **属性系统初始化**:调用`initAttrs()`初始化完整属性系统
|
||||
|
||||
**节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L65-L85)
|
||||
|
||||
### 技能配置数据结构
|
||||
|
||||
技能配置通过`SkillSet`常量定义,支持多种技能类型和效果:
|
||||
|
||||
| 属性 | 类型 | 描述 | 示例值 |
|
||||
|------|------|------|--------|
|
||||
| uuid | number | 技能唯一标识符 | 6001, 6005 |
|
||||
| name | string | 技能显示名称 | "挥击", "火球术" |
|
||||
| SType | SType | 技能效果类型 | SType.damage, SType.heal |
|
||||
| TGroup | TGroup | 目标群体类型 | TGroup.Enemy, TGroup.Self |
|
||||
| ap | number | 攻击力百分比 | 100, 300 |
|
||||
| cd | number | 冷却时间(秒) | 1, 5 |
|
||||
| cost | number | 技能消耗值 | 0, 20 |
|
||||
| hit_num | number | 攻击目标数量 | 1, 3 |
|
||||
|
||||
**节来源**
|
||||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L80-L147)
|
||||
|
||||
## 技能控制系统
|
||||
|
||||
### SkillConComp组件功能
|
||||
|
||||
`SkillConComp`是技能系统的核心控制器,负责技能触发、冷却管理和释放流程。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as "玩家输入"
|
||||
participant SkillCon as "SkillConComp"
|
||||
participant HeroView as "HeroViewComp"
|
||||
participant SkillEnt as "SkillEnt"
|
||||
participant SkillView as "SkillViewCom"
|
||||
Player->>SkillCon : 技能触发请求
|
||||
SkillCon->>SkillCon : 检查冷却时间
|
||||
SkillCon->>SkillCon : 检查MP消耗
|
||||
SkillCon->>SkillCon : castSkill()
|
||||
SkillCon->>SkillCon : doSkill()
|
||||
SkillCon->>SkillCon : selectTargets()
|
||||
SkillCon->>SkillEnt : 创建技能实体
|
||||
SkillEnt->>SkillView : 加载技能视图
|
||||
SkillView->>SkillView : 执行技能动画
|
||||
SkillView->>SkillView : 处理碰撞检测
|
||||
SkillView->>HeroView : 造成伤害/效果
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L40-L110)
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L70)
|
||||
|
||||
#### 技能触发机制
|
||||
|
||||
技能触发遵循以下优先级和条件:
|
||||
|
||||
1. **状态检查**:确保角色未处于眩晕或冰冻状态
|
||||
2. **冷却检查**:技能CD时间超过最大值
|
||||
3. **资源检查**:MP值足够支付技能消耗
|
||||
4. **类型匹配**:技能类型为伤害类且角色处于攻击状态
|
||||
|
||||
**节来源**
|
||||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L38-L48)
|
||||
|
||||
### 冷却管理系统
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["update(dt)"] --> B{"游戏状态检查"}
|
||||
B --> |暂停/未开始| C["跳过更新"]
|
||||
B --> |正常| D["遍历技能列表"]
|
||||
D --> E["累积CD时间"]
|
||||
E --> F{"CD > CD_MAX AND MP >= COST?"}
|
||||
F --> |是| G["触发技能"]
|
||||
F --> |否| H["继续等待"]
|
||||
G --> I["重置CD = 0"]
|
||||
I --> J["扣除MP"]
|
||||
J --> K["播放技能效果"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L38-L48)
|
||||
|
||||
**节来源**
|
||||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L38-L48)
|
||||
|
||||
## 技能数据结构
|
||||
|
||||
### SkillSet配置系统
|
||||
|
||||
`SkillSet`提供了完整的技能数据结构定义,支持技能的完整生命周期管理。
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class SkillConfig {
|
||||
+uuid : number
|
||||
+name : string
|
||||
+sp_name : string
|
||||
+path : string
|
||||
+TGroup : TGroup
|
||||
+SType : SType
|
||||
+act : string
|
||||
+DTType : DTType
|
||||
+DType : DType
|
||||
+ap : number
|
||||
+cd : number
|
||||
+t_num : number
|
||||
+hit_num : number
|
||||
+hit : number
|
||||
+hitcd : number
|
||||
+speed : number
|
||||
+cost : number
|
||||
+with : number
|
||||
+buffs : BuffConf[]
|
||||
+neAttrs : NeAttrsConf[]
|
||||
+info : string
|
||||
}
|
||||
class BuffConf {
|
||||
+buff : Attrs
|
||||
+BType : BType
|
||||
+value : number
|
||||
+time : number
|
||||
+chance : number
|
||||
}
|
||||
class NeAttrsConf {
|
||||
+neAttrs : NeAttrs
|
||||
+value : number
|
||||
+time : number
|
||||
}
|
||||
SkillConfig --> BuffConf : "包含"
|
||||
SkillConfig --> NeAttrsConf : "包含"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L95-L147)
|
||||
|
||||
### 技能类型枚举
|
||||
|
||||
| SType值 | 类型名称 | 效果描述 | 使用场景 |
|
||||
|---------|----------|----------|----------|
|
||||
| 0 | damage | 造成伤害 | 主要攻击技能 |
|
||||
| 1 | heal | 治疗效果 | 辅助/回复技能 |
|
||||
| 2 | shield | 护盾效果 | 防御型技能 |
|
||||
| 3 | atk_speed | 攻击速度提升 | 增益技能 |
|
||||
| 4 | power_up | 力量提升 | 战斗强化技能 |
|
||||
| 5 | ap_up | 攻击力提升 | 输出增强技能 |
|
||||
| 10 | zhaohuan | 召唤技能 | 召唤物技能 |
|
||||
| 11 | buff | 通用增益 | 多功能增益技能 |
|
||||
|
||||
**节来源**
|
||||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L35-L50)
|
||||
|
||||
## 技能释放流程
|
||||
|
||||
### 技能实体创建流程
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant SkillCon as "SkillConComp"
|
||||
participant ECS as "ECS系统"
|
||||
participant SkillEnt as "SkillEnt"
|
||||
participant SkillView as "SkillViewCom"
|
||||
participant AtkCon as "AtkConCom"
|
||||
SkillCon->>ECS : 获取SkillEnt实体
|
||||
ECS-->>SkillCon : 返回SkillEnt实例
|
||||
SkillCon->>SkillEnt : load(startPos, parent, uuid, targetPos, caster, dmg)
|
||||
SkillEnt->>SkillEnt : 验证技能配置
|
||||
SkillEnt->>SkillEnt : 加载技能预制体
|
||||
SkillEnt->>SkillEnt : 设置节点属性
|
||||
SkillEnt->>SkillView : 添加SkillViewCom组件
|
||||
SkillView->>SkillView : 初始化技能参数
|
||||
SkillView->>SkillView : 创建AtkConCom实例
|
||||
SkillView->>AtkCon : 配置攻击组件
|
||||
AtkCon->>AtkCon : 执行具体技能逻辑
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L70)
|
||||
- [SkillViewCom.ts](file://assets/script/game/skill/SkillViewCom.ts#L60-L120)
|
||||
|
||||
### 目标选择算法
|
||||
|
||||
技能系统实现了智能的目标选择机制,支持多种目标选择策略:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["开始目标选择"] --> B{"是否有目标实体?"}
|
||||
B --> |否| C["返回默认位置"]
|
||||
B --> |是| D["获取所有目标实体"]
|
||||
D --> E["第一个目标:最前排"]
|
||||
E --> F["后续目标:随机选择"]
|
||||
F --> G["返回目标坐标数组"]
|
||||
E --> E1["计算最前排位置"]
|
||||
E1 --> E2["选择最近的实体"]
|
||||
F --> F1["随机选择实体"]
|
||||
F1 --> F2["重复选择可重复"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L115-L150)
|
||||
|
||||
**节来源**
|
||||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L115-L150)
|
||||
|
||||
## 技能类型与效果
|
||||
|
||||
### 伤害计算机制
|
||||
|
||||
技能造成的伤害通过多层计算确定:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["基础攻击力"] --> B["应用技能AP比例"]
|
||||
B --> C["计算最终伤害"]
|
||||
C --> D{"是否暴击?"}
|
||||
D --> |是| E["应用暴击伤害倍率"]
|
||||
D --> |否| F["普通伤害"]
|
||||
E --> G["应用穿透效果"]
|
||||
F --> G
|
||||
G --> H["应用护盾吸收"]
|
||||
H --> I["最终伤害值"]
|
||||
G --> G1["计算穿透衰减"]
|
||||
G1 --> G2["应用穿透属性"]
|
||||
H --> H1["检查护盾值"]
|
||||
H1 --> H2["计算吸收量"]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L650-L680)
|
||||
- [AtkConCom.ts](file://assets/script/game/skill/AtkConCom.ts#L130-L160)
|
||||
|
||||
### Buff系统集成
|
||||
|
||||
技能系统与Buff系统紧密集成,支持技能触发Buff效果:
|
||||
|
||||
| Buff类型 | BType | 效果 | 应用时机 |
|
||||
|----------|-------|------|----------|
|
||||
| 数值型 | VALUE | 直接数值加成 | 属性计算时 |
|
||||
| 百分比型 | RATIO | 百分比加成 | 属性计算时 |
|
||||
| 持久型 | - | 永久生效 | 持续应用 |
|
||||
| 临时型 | - | 按时间衰减 | 定时更新 |
|
||||
|
||||
**节来源**
|
||||
- [HeroViewComp.ts](file://assets/script/game/hero/HeroViewComp.ts#L150-L200)
|
||||
|
||||
## 开发指引
|
||||
|
||||
### 为怪物配置主动技能
|
||||
|
||||
1. **编辑heroSet.ts**:在`HeroInfo`中添加怪物配置
|
||||
2. **配置技能数组**:在`skills`字段中指定技能UUID
|
||||
3. **调整属性值**:根据怪物定位设置HP、MP、AP等属性
|
||||
4. **测试平衡性**:验证技能冷却和消耗的合理性
|
||||
|
||||
### 实现技能组合
|
||||
|
||||
```typescript
|
||||
// 示例:配置多重技能组合
|
||||
const monsterConfig = {
|
||||
uuid: 5201,
|
||||
name: "兽人战士",
|
||||
skills: [6001, 6005, 6006], // 多个技能
|
||||
// 其他属性...
|
||||
};
|
||||
|
||||
// 在技能触发时添加组合效果
|
||||
SkillConComp.prototype.comboSkills = function() {
|
||||
// 实现技能组合逻辑
|
||||
// 如:连续使用技能获得额外效果
|
||||
};
|
||||
```
|
||||
|
||||
### 自定义技能行为
|
||||
|
||||
1. **扩展SkillSet**:在`SkillSet`中添加新技能配置
|
||||
2. **实现特殊效果**:在`AtkConCom`中添加自定义逻辑
|
||||
3. **注册事件监听**:监听技能触发相关事件
|
||||
4. **测试兼容性**:确保新技能与现有系统兼容
|
||||
|
||||
**节来源**
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L120-L152)
|
||||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts#L80-L147)
|
||||
|
||||
## 常见问题与解决方案
|
||||
|
||||
### 技能同步问题
|
||||
|
||||
#### 问题描述
|
||||
多人游戏中技能释放不同步,导致战斗结果不一致。
|
||||
|
||||
#### 解决方案
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["技能释放请求"] --> B["客户端验证"]
|
||||
B --> C["发送服务器确认"]
|
||||
C --> D["服务器验证"]
|
||||
D --> E{"验证通过?"}
|
||||
E --> |是| F["广播技能效果"]
|
||||
E --> |否| G["拒绝请求"]
|
||||
F --> H["客户端同步显示"]
|
||||
G --> I["显示错误提示"]
|
||||
D --> D1["检查冷却时间"]
|
||||
D --> D2["检查资源充足"]
|
||||
D --> D3["检查状态允许"]
|
||||
```
|
||||
|
||||
#### 实现要点
|
||||
|
||||
1. **服务器端验证**:所有技能释放必须经过服务器验证
|
||||
2. **延迟补偿**:处理网络延迟导致的技能时间差
|
||||
3. **状态同步**:确保客户端和服务器状态一致
|
||||
4. **错误处理**:优雅处理同步失败的情况
|
||||
|
||||
### 性能优化建议
|
||||
|
||||
#### 技能实体管理
|
||||
|
||||
```typescript
|
||||
// 优化技能实体创建和销毁
|
||||
class SkillEntityManager {
|
||||
private pool: SkillEnt[] = [];
|
||||
|
||||
createSkill(config: SkillConfig): SkillEnt {
|
||||
let skill = this.pool.pop();
|
||||
if (!skill) {
|
||||
skill = ecs.getEntity<SkillEnt>(SkillEnt);
|
||||
}
|
||||
skill.load(...);
|
||||
return skill;
|
||||
}
|
||||
|
||||
recycleSkill(skill: SkillEnt): void {
|
||||
skill.reset();
|
||||
this.pool.push(skill);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 冷却时间优化
|
||||
|
||||
1. **批量更新**:每帧批量处理所有技能的CD更新
|
||||
2. **优先级调度**:优先处理重要技能的冷却检查
|
||||
3. **内存池**:复用技能对象减少GC压力
|
||||
|
||||
### 调试工具
|
||||
|
||||
#### 技能日志系统
|
||||
|
||||
```typescript
|
||||
class SkillDebugger {
|
||||
static logSkillExecution(skillId: number, params: any): void {
|
||||
console.log(`[Skill] 执行技能 ${skillId}`, {
|
||||
timestamp: Date.now(),
|
||||
params,
|
||||
performance: performance.now()
|
||||
});
|
||||
}
|
||||
|
||||
static logCooldownUpdate(skillId: number, currentCD: number, maxCD: number): void {
|
||||
console.log(`[Skill] 技能${skillId}冷却: ${currentCD}/${maxCD}`);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**节来源**
|
||||
- [SkillConComp.ts](file://assets/script/game/hero/SkillConComp.ts#L40-L60)
|
||||
- [SkillEnt.ts](file://assets/script/game/skill/SkillEnt.ts#L15-L30)
|
||||
|
||||
## 总结
|
||||
|
||||
本技能系统通过ECS架构实现了高度模块化和可扩展的设计,主要特点包括:
|
||||
|
||||
1. **模块化架构**:各组件职责明确,便于维护和扩展
|
||||
2. **灵活配置**:通过SkillSet实现技能的完全配置化
|
||||
3. **性能优化**:采用对象池和批量处理提高性能
|
||||
4. **扩展性强**:支持自定义技能类型和效果
|
||||
5. **网络友好**:内置同步机制确保多人游戏一致性
|
||||
|
||||
该系统为游戏战斗提供了坚实的技术基础,支持复杂技能组合和策略玩法,是构建高质量战斗体验的重要组成部分。
|
||||
503
.qoder/repowiki/zh/content/地图系统/肉鸽关卡配置/关卡生成规则.md
Normal file
503
.qoder/repowiki/zh/content/地图系统/肉鸽关卡配置/关卡生成规则.md
Normal file
@@ -0,0 +1,503 @@
|
||||
# 关卡生成规则
|
||||
|
||||
<cite>
|
||||
**本文档中引用的文件**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构概览](#项目结构概览)
|
||||
3. [核心组件分析](#核心组件分析)
|
||||
4. [关卡类型判定逻辑](#关卡类型判定逻辑)
|
||||
5. [怪物配置规则](#怪物配置规则)
|
||||
6. [动态数量计算机制](#动态数量计算机制)
|
||||
7. [强度倍率计算](#强度倍率计算)
|
||||
8. [事件系统集成](#事件系统集成)
|
||||
9. [GameMap集成调用](#gamemap集成调用)
|
||||
10. [配置修改指南](#配置修改指南)
|
||||
11. [性能优化考虑](#性能优化考虑)
|
||||
12. [总结](#总结)
|
||||
|
||||
## 简介
|
||||
|
||||
RogueConfig.ts是肉鸽模式的核心配置脚本,实现了动态关卡生成系统。该系统通过复杂的关卡类型判定逻辑、智能的怪物配置规则和渐进式的难度曲线,为玩家提供持续挑战的游戏体验。系统支持普通、精英、Boss和事件四种关卡类型,并具备完善的随机事件机制。
|
||||
|
||||
## 项目结构概览
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "关卡生成系统"
|
||||
RC[RogueConfig.ts<br/>核心配置脚本]
|
||||
MC[MissionMonComp.ts<br/>怪物管理组件]
|
||||
GM[GameMap.ts<br/>游戏地图]
|
||||
end
|
||||
subgraph "配置数据"
|
||||
SCR[StageConfigRules<br/>关卡配置规则]
|
||||
EC[EventConfig<br/>事件配置]
|
||||
EML[EliteMonsterList<br/>精英怪物列表]
|
||||
BML[BossMonsterList<br/>Boss怪物列表]
|
||||
end
|
||||
subgraph "运行时组件"
|
||||
ST[getStageType<br/>关卡类型判定]
|
||||
CMC[calculateMonsterCount<br/>数量计算]
|
||||
CMSM[calculateMonsterStrengthMultiplier<br/>强度计算]
|
||||
GSC[generateStageConfig<br/>关卡配置生成]
|
||||
end
|
||||
RC --> SCR
|
||||
RC --> EC
|
||||
RC --> EML
|
||||
RC --> BML
|
||||
RC --> ST
|
||||
RC --> CM
|
||||
RC --> CMSM
|
||||
RC --> GSC
|
||||
MC --> RC
|
||||
GM --> MC
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L311)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||||
|
||||
## 核心组件分析
|
||||
|
||||
### 关卡类型枚举系统
|
||||
|
||||
系统定义了四个主要的关卡类型,每种类型都有其独特的特征和配置规则:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StageType {
|
||||
<<enumeration>>
|
||||
+NORMAL : "normal"
|
||||
+ELITE : "elite"
|
||||
+BOSS : "boss"
|
||||
+EVENT : "event"
|
||||
}
|
||||
class MonsterType {
|
||||
<<enumeration>>
|
||||
+NORMAL : "normal"
|
||||
+ELITE : "elite"
|
||||
+BOSS : "boss"
|
||||
}
|
||||
class EventType {
|
||||
<<enumeration>>
|
||||
+TREASURE : "treasure"
|
||||
+TRAP : "trap"
|
||||
+BUFF : "buff"
|
||||
+DEBUFF : "debuff"
|
||||
}
|
||||
class StageConfigRules {
|
||||
+NORMAL : Config
|
||||
+ELITE : Config
|
||||
+BOSS : Config
|
||||
+EVENT : Config
|
||||
}
|
||||
StageType --> StageConfigRules : "使用"
|
||||
MonsterType --> StageConfigRules : "配置"
|
||||
EventType --> EventConfig : "触发"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L25-L52)
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L25-L52)
|
||||
|
||||
### 怪物配置表结构
|
||||
|
||||
系统维护了专门的怪物配置表,用于管理不同类型的怪物:
|
||||
|
||||
| 怪物类型 | 配置表 | 描述 |
|
||||
|---------|--------|------|
|
||||
| 普通怪物 | getMonList() | 基础怪物配置,通过HeroInfo过滤得到 |
|
||||
| 精英怪物 | EliteMonsterList | 特殊精英怪物列表,包含5201、5202、5203等 |
|
||||
| Boss怪物 | BossMonsterList | Boss怪物配置,目前包含5201、5202等 |
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L17-L32)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L32-L38)
|
||||
|
||||
## 关卡类型判定逻辑
|
||||
|
||||
### getStageType函数详解
|
||||
|
||||
getStageType函数是关卡类型判定的核心逻辑,采用分层决策树结构:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始关卡类型判定]) --> CheckEvent{"检查是否为5的倍数关卡且等级为3"}
|
||||
CheckEvent --> |是| ReturnEvent[返回EVENT类型]
|
||||
CheckEvent --> |否| CheckTen{"检查是否为10的倍数关卡"}
|
||||
CheckTen --> |是| CheckLevelTen{"检查等级"}
|
||||
CheckLevelTen --> |等级5| ReturnBoss[返回BOSS类型]
|
||||
CheckLevelTen --> |等级4| ReturnElite[返回ELITE类型]
|
||||
CheckLevelTen --> |其他| ReturnNormal[返回NORMAL类型]
|
||||
CheckTen --> |否| CheckLevel{"检查等级"}
|
||||
CheckLevel --> |等级5| ReturnElite2[返回ELITE类型]
|
||||
CheckLevel --> |其他| ReturnNormal2[返回NORMAL类型]
|
||||
ReturnEvent --> End([结束])
|
||||
ReturnBoss --> End
|
||||
ReturnElite --> End
|
||||
ReturnNormal --> End
|
||||
ReturnElite2 --> End
|
||||
ReturnNormal2 --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L129-L168)
|
||||
|
||||
### 特殊关卡规则详解
|
||||
|
||||
#### 事件关卡规则
|
||||
- **触发条件**:关卡号为5的倍数(5、10、15...)且玩家等级为3
|
||||
- **特点**:包含少量普通怪物,提供随机事件机会
|
||||
- **概率分布**:30%宝箱、25%陷阱、25%增益、20%减益
|
||||
|
||||
#### Boss关卡规则
|
||||
- **触发条件**:关卡号为10的倍数(10、20、30...)
|
||||
- **等级要求**:仅在特定等级触发
|
||||
- 第5级:Boss关卡
|
||||
- 第4级:精英关卡
|
||||
- 其他等级:普通关卡
|
||||
|
||||
#### 精英关卡规则
|
||||
- **触发条件**:玩家等级达到5级
|
||||
- **特点**:混合精英和普通怪物,提供更高挑战
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L129-L168)
|
||||
|
||||
## 怪物配置规则
|
||||
|
||||
### StageConfigRules配置体系
|
||||
|
||||
StageConfigRules提供了四类关卡的详细配置规则:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "普通关卡"
|
||||
NC[3个普通怪物<br/>基础数量: 3<br/>最小数量: 2<br/>最大数量: 6]
|
||||
end
|
||||
subgraph "精英关卡"
|
||||
EC1[2个精英怪物<br/>基础数量: 2<br/>最小数量: 1<br/>最大数量: 4]
|
||||
EC2[3个普通怪物<br/>基础数量: 3<br/>最小数量: 2<br/>最大数量: 5]
|
||||
end
|
||||
subgraph "Boss关卡"
|
||||
BC1[1个Boss怪物<br/>基础数量: 1<br/>最小数量: 1<br/>最大数量: 1]
|
||||
BC2[2个精英怪物<br/>基础数量: 2<br/>最小数量: 1<br/>最大数量: 3]
|
||||
BC3[2个普通怪物<br/>基础数量: 2<br/>最小数量: 1<br/>最大数量: 4]
|
||||
end
|
||||
subgraph "事件关卡"
|
||||
VC[2个普通怪物<br/>基础数量: 2<br/>最小数量: 1<br/>最大数量: 4]
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L54-L95)
|
||||
|
||||
### 怪物数量扩展机制
|
||||
|
||||
系统实现了智能的数量扩展算法,确保游戏体验的平衡性:
|
||||
|
||||
#### 扩展公式
|
||||
```
|
||||
实际数量 = 基础数量 + floor(关卡号 / 5)
|
||||
```
|
||||
|
||||
#### 数量范围控制
|
||||
- 使用`Math.max(minCount, Math.min(maxCount, count))`确保数量在合理范围内
|
||||
- 每5关递增1个怪物,避免突变式难度提升
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L54-L95)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L150-L168)
|
||||
|
||||
## 动态数量计算机制
|
||||
|
||||
### calculateMonsterCount函数实现
|
||||
|
||||
calculateMonsterCount函数负责根据关卡进度动态调整怪物数量:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Caller as 调用方
|
||||
participant CMC as calculateMonsterCount
|
||||
participant Formula as 数量计算公式
|
||||
Caller->>CMC : calculateMonsterCount(stageNumber, baseCount, minCount, maxCount)
|
||||
CMC->>Formula : increment = Math.floor(stageNumber / 5)
|
||||
Formula-->>CMC : 返回增量值
|
||||
CMC->>CMC : count = baseCount + increment
|
||||
CMC->>CMC : count = Math.max(minCount, Math.min(maxCount, count))
|
||||
CMC-->>Caller : 返回实际怪物数量
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L150-L168)
|
||||
|
||||
### 数量增长曲线分析
|
||||
|
||||
| 关卡范围 | 基础数量 | 增量 | 最终数量范围 |
|
||||
|---------|----------|------|-------------|
|
||||
| 1-4 | 3 | 0 | 3-6 |
|
||||
| 5-9 | 3 | 1 | 4-6 |
|
||||
| 10-14 | 3 | 2 | 5-6 |
|
||||
| 15+ | 3 | 3+ | 6 |
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L150-L168)
|
||||
|
||||
## 强度倍率计算
|
||||
|
||||
### calculateMonsterStrengthMultiplier函数
|
||||
|
||||
系统实现了双维度的强度倍率计算,综合考虑关卡进度和玩家等级:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始强度计算]) --> CalcStage["计算关卡倍率<br/>stageMultiplier = 1 + (stageNumber - 1) * 0.1"]
|
||||
CalcStage --> CalcLevel["计算等级倍率<br/>levelMultiplier = 1 + (level - 1) * 0.05"]
|
||||
CalcLevel --> Multiply["计算总倍率<br/>strengthMultiplier = stageMultiplier * levelMultiplier"]
|
||||
Multiply --> Return[返回强度倍率]
|
||||
Return --> End([结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L170-L178)
|
||||
|
||||
### 强度增长特性
|
||||
|
||||
#### 关卡维度
|
||||
- 每关增加10%的强度
|
||||
- 关卡1: 1.0x
|
||||
- 关卡5: 1.4x
|
||||
- 关卡10: 1.9x
|
||||
- 关卡20: 2.9x
|
||||
|
||||
#### 等级维度
|
||||
- 每级增加5%的强度
|
||||
- 等级1: 1.0x
|
||||
- 等级3: 1.1x
|
||||
- 等级5: 1.2x
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L170-L178)
|
||||
|
||||
## 事件系统集成
|
||||
|
||||
### 随机事件配置
|
||||
|
||||
EventConfig提供了完整的随机事件系统:
|
||||
|
||||
| 事件类型 | 触发概率 | 效果描述 |
|
||||
|---------|----------|----------|
|
||||
| TREASURE | 30% | 获得额外奖励(+50金币) |
|
||||
| TRAP | 25% | 受到一定伤害 |
|
||||
| BUFF | 25% | 获得临时增益效果 |
|
||||
| DEBUFF | 20% | 受到临时减益效果 |
|
||||
|
||||
### 事件触发机制
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MC as MissionMonComp
|
||||
participant RC as RogueConfig
|
||||
participant EC as EventConfig
|
||||
MC->>RC : getStageType(stageNumber, level)
|
||||
RC-->>MC : 返回关卡类型
|
||||
MC->>MC : 检查是否为EVENT类型
|
||||
alt 是事件关卡
|
||||
MC->>RC : getRandomEvent()
|
||||
RC->>EC : 遍历事件配置
|
||||
EC-->>RC : 返回事件类型
|
||||
RC-->>MC : 返回EventType
|
||||
MC->>MC : processRandomEvent()
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L97-L127)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L293-L310)
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L97-L127)
|
||||
|
||||
## GameMap集成调用
|
||||
|
||||
### MissionMonComp集成流程
|
||||
|
||||
MissionMonComp作为GameMap的核心组件,负责关卡生成的执行:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant GM as GameMap
|
||||
participant MC as MissionMonComp
|
||||
participant RC as RogueConfig
|
||||
GM->>MC : do_mon_wave()
|
||||
MC->>MC : 重置召唤状态
|
||||
MC->>RC : getStageType(currentStage, level)
|
||||
RC-->>MC : 返回关卡类型
|
||||
MC->>MC : 检查是否为事件关卡
|
||||
alt 是事件关卡
|
||||
MC->>RC : getRandomEvent()
|
||||
RC-->>MC : 返回事件类型
|
||||
end
|
||||
MC->>RC : getStageMonsterConfigs(currentStage, level)
|
||||
RC-->>MC : 返回怪物配置数组
|
||||
MC->>MC : generateMonstersFromStageConfig()
|
||||
MC->>MC : addToStageSpawnQueue()
|
||||
MC->>MC : spawnNextMonster()
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L95-L115)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L147-L169)
|
||||
|
||||
### 怪物生成队列管理
|
||||
|
||||
系统采用了队列化的怪物生成机制:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "怪物生成流程"
|
||||
A[生成怪物配置] --> B[添加到队列]
|
||||
B --> C[定时器检查]
|
||||
C --> D{是否暂停?}
|
||||
D --> |是| E[暂停计时]
|
||||
D --> |否| F[正常生成]
|
||||
F --> G[召唤计数+1]
|
||||
G --> H{达到5只?}
|
||||
H --> |是| I[进入暂停状态]
|
||||
H --> |否| J[继续生成]
|
||||
I --> K[暂停5秒]
|
||||
K --> L[恢复生成]
|
||||
E --> M[等待恢复]
|
||||
L --> J
|
||||
M --> N[暂停结束]
|
||||
N --> J
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L69-L105)
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L95-L115)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L147-L169)
|
||||
|
||||
## 配置修改指南
|
||||
|
||||
### 修改难度曲线
|
||||
|
||||
#### 调整怪物数量
|
||||
1. **修改基础数量**:直接修改StageConfigRules中各关卡的`count`值
|
||||
2. **调整数量范围**:修改`minCount`和`maxCount`限制
|
||||
3. **改变增长速率**:修改calculateMonsterCount函数中的增量公式
|
||||
|
||||
#### 调整强度倍率
|
||||
1. **修改关卡倍率**:调整calculateMonsterStrengthMultiplier函数中的`0.1`系数
|
||||
2. **修改等级倍率**:调整`0.05`系数
|
||||
3. **添加新维度**:可扩展新的强度计算因子
|
||||
|
||||
### 新增特殊关卡类型
|
||||
|
||||
#### 步骤1:定义关卡类型
|
||||
```typescript
|
||||
export enum StageType {
|
||||
// 现有类型...
|
||||
SPECIAL = "special" // 新增特殊关卡类型
|
||||
}
|
||||
```
|
||||
|
||||
#### 步骤2:添加配置规则
|
||||
```typescript
|
||||
export const StageConfigRules = {
|
||||
// 现有规则...
|
||||
[StageType.SPECIAL]: {
|
||||
description: "特殊关卡",
|
||||
monsters: [
|
||||
{ type: MonsterType.BOSS, count: 1, minCount: 1, maxCount: 1 },
|
||||
{ type: MonsterType.ELITE, count: 3, minCount: 2, maxCount: 4 }
|
||||
]
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
#### 步骤3:更新判定逻辑
|
||||
```typescript
|
||||
export function getStageType(stageNumber: number, level: number = 1): StageType {
|
||||
// 现有逻辑...
|
||||
|
||||
// 新增特殊关卡规则
|
||||
if (/* 特殊条件 */) {
|
||||
return StageType.SPECIAL;
|
||||
}
|
||||
|
||||
return /* 默认返回 */;
|
||||
}
|
||||
```
|
||||
|
||||
### 调整关卡频率
|
||||
|
||||
#### 修改事件关卡频率
|
||||
```typescript
|
||||
// 修改getStageType函数中的事件触发条件
|
||||
if (stageNumber % 5 === 0 && level === 3) {
|
||||
return StageType.EVENT;
|
||||
}
|
||||
```
|
||||
|
||||
#### 修改Boss关卡频率
|
||||
```typescript
|
||||
// 修改Boss关卡触发条件
|
||||
if (stageNumber % 10 === 0) {
|
||||
// Boss逻辑...
|
||||
}
|
||||
```
|
||||
|
||||
## 性能优化考虑
|
||||
|
||||
### 内存管理优化
|
||||
|
||||
1. **怪物配置缓存**:避免重复计算相同的关卡配置
|
||||
2. **事件概率预计算**:使用累积概率减少每次触发的计算开销
|
||||
3. **队列长度控制**:限制怪物生成队列的最大长度
|
||||
|
||||
### 计算性能优化
|
||||
|
||||
1. **早期退出机制**:在getStageType中使用早期返回
|
||||
2. **批量操作**:一次性生成所有怪物配置而非逐个生成
|
||||
3. **数值计算优化**:使用Math.floor替代更复杂的数学运算
|
||||
|
||||
### 内存使用监控
|
||||
|
||||
```typescript
|
||||
// 监控怪物队列大小
|
||||
console.log(`怪物队列大小: ${this.monsterQueue.length}`);
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
RogueConfig.ts实现了一个完整而灵活的肉鸽模式关卡生成系统。通过分层的关卡类型判定逻辑、智能的怪物配置规则和渐进式的难度曲线,为玩家提供了丰富的游戏体验。
|
||||
|
||||
### 主要特性
|
||||
|
||||
1. **动态关卡生成**:基于关卡号和玩家等级的智能判定
|
||||
2. **渐进式难度**:通过数量和强度倍率实现平滑的难度提升
|
||||
3. **随机事件系统**:增加游戏的不确定性和趣味性
|
||||
4. **模块化设计**:清晰的职责分离便于维护和扩展
|
||||
5. **性能优化**:合理的内存管理和计算优化
|
||||
|
||||
### 扩展建议
|
||||
|
||||
1. **新增关卡类型**:可根据游戏需求添加更多特殊关卡
|
||||
2. **动态配置加载**:支持运行时修改配置而不需重启
|
||||
3. **数据分析功能**:添加关卡统计数据收集和分析
|
||||
4. **多语言支持**:完善国际化支持
|
||||
|
||||
该系统为肉鸽游戏提供了坚实的技术基础,通过合理的配置和适当的扩展,可以满足各种游戏设计需求。
|
||||
435
.qoder/repowiki/zh/content/地图系统/肉鸽关卡配置/怪物配置体系.md
Normal file
435
.qoder/repowiki/zh/content/地图系统/肉鸽关卡配置/怪物配置体系.md
Normal file
@@ -0,0 +1,435 @@
|
||||
# 怪物配置体系
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [概述](#概述)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 概述
|
||||
|
||||
RogueConfig.ts是肉鸽模式中的核心怪物配置管理系统,提供了完整的怪物类型定义、关卡配置规则、强度计算机制和随机事件系统。该系统通过分层的配置结构实现了怪物的差异化管理,支持普通怪物、精英怪物和Boss怪物三种类型,并能够根据关卡进度动态调整怪物数量和强度。
|
||||
|
||||
系统的主要功能包括:
|
||||
- **怪物类型管理**:通过MonsterType枚举定义三种怪物类型
|
||||
- **关卡配置系统**:支持普通关卡、精英关卡、Boss关卡和事件关卡
|
||||
- **强度计算引擎**:基于关卡号和等级计算怪物强度倍率
|
||||
- **随机事件系统**:提供宝箱、陷阱、增益和减益事件
|
||||
- **程序化关卡生成**:支持怪物数量随关卡递增的动态配置
|
||||
|
||||
## 项目结构
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "怪物配置模块"
|
||||
RC[RogueConfig.ts<br/>核心配置管理]
|
||||
MC[MissionMonComp.ts<br/>怪物生成控制]
|
||||
end
|
||||
subgraph "数据源模块"
|
||||
HS[heroSet.ts<br/>英雄/怪物数据]
|
||||
Mon[Mon.ts<br/>怪物实体管理]
|
||||
end
|
||||
subgraph "配置系统"
|
||||
SC[StageConfigRules<br/>关卡配置规则]
|
||||
EM[EliteMonsterList<br/>精英怪物配置]
|
||||
BM[BossMonsterList<br/>Boss怪物配置]
|
||||
end
|
||||
RC --> SC
|
||||
RC --> EM
|
||||
RC --> BM
|
||||
MC --> RC
|
||||
MC --> Mon
|
||||
Mon --> HS
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L311)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L209)
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L50)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L35)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### 怪物类型枚举系统
|
||||
|
||||
系统定义了三个核心的怪物类型,通过枚举确保类型安全和可维护性:
|
||||
|
||||
| 怪物类型 | 描述 | 特征 |
|
||||
|---------|------|------|
|
||||
| NORMAL | 普通怪物 | 基础属性,随机选择 |
|
||||
| ELITE | 精英怪物 | 强化配置,固定列表 |
|
||||
| BOSS | Boss怪物 | 高强度,特殊配置 |
|
||||
|
||||
### 关卡类型系统
|
||||
|
||||
| 关卡类型 | 触发条件 | 怪物组成 |
|
||||
|---------|----------|----------|
|
||||
| NORMAL | 1-9关1-4级 | 普通怪物为主 |
|
||||
| ELITE | 1-9关5级/10关4级 | 精英+普通怪物 |
|
||||
| BOSS | 10关5级 | Boss+精英+普通怪物 |
|
||||
| EVENT | 每5关特殊事件 | 少量普通怪物 |
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L35-L55)
|
||||
|
||||
## 架构概览
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as 玩家
|
||||
participant MC as MissionMonComp
|
||||
participant RC as RogueConfig
|
||||
participant Mon as Monster
|
||||
participant HS as HeroSet
|
||||
Player->>MC : 开始关卡
|
||||
MC->>RC : getStageType(stage, level)
|
||||
RC-->>MC : 返回关卡类型
|
||||
MC->>RC : getStageMonsterConfigs(stage, level)
|
||||
RC->>RC : calculateMonsterStrengthMultiplier()
|
||||
RC->>RC : generateStageConfig()
|
||||
RC->>RC : getMonsterUUIDsByType()
|
||||
RC-->>MC : 返回怪物配置数组
|
||||
MC->>Mon : 创建怪物实例
|
||||
Mon->>HS : 加载怪物数据
|
||||
HS-->>Mon : 返回属性配置
|
||||
Mon-->>MC : 怪物实例完成
|
||||
MC-->>Player : 关卡准备就绪
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L269-L310)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 怪物类型管理系统
|
||||
|
||||
#### MonsterType枚举定义
|
||||
|
||||
系统通过清晰的枚举定义区分不同类型的怪物:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MonsterType {
|
||||
<<enumeration>>
|
||||
+NORMAL : "normal"
|
||||
+ELITE : "elite"
|
||||
+BOSS : "boss"
|
||||
}
|
||||
class StageType {
|
||||
<<enumeration>>
|
||||
+NORMAL : "normal"
|
||||
+ELITE : "elite"
|
||||
+BOSS : "boss"
|
||||
+EVENT : "event"
|
||||
}
|
||||
class EventType {
|
||||
<<enumeration>>
|
||||
+TREASURE : "treasure"
|
||||
+TRAP : "trap"
|
||||
+BUFF : "buff"
|
||||
+DEBUFF : "debuff"
|
||||
}
|
||||
MonsterType --> StageType : "映射到"
|
||||
StageType --> EventType : "可能触发"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L35-L55)
|
||||
|
||||
#### 怪物UUID获取机制
|
||||
|
||||
getMonsterUUIDsByType函数实现了根据不同怪物类型获取对应配置表的功能:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始获取怪物UUID]) --> CheckType{检查怪物类型}
|
||||
CheckType --> |NORMAL| GetNormal[调用getMonList获取普通怪物]
|
||||
CheckType --> |ELITE| GetElite[使用EliteMonsterList配置表]
|
||||
CheckType --> |BOSS| GetBoss[使用BossMonsterList配置表]
|
||||
CheckType --> |其他| ReturnEmpty[返回空数组]
|
||||
GetNormal --> FilterMonsters[过滤怪物数据]
|
||||
FilterMonsters --> ReturnUUIDs[返回UUID数组]
|
||||
GetElite --> ReturnEliteUUIDs[返回精英怪物UUID]
|
||||
GetBoss --> ReturnBossUUIDs[返回Boss怪物UUID]
|
||||
ReturnEmpty --> End([结束])
|
||||
ReturnUUIDs --> End
|
||||
ReturnEliteUUIDs --> End
|
||||
ReturnBossUUIDs --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L225-L247)
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L225-L247)
|
||||
|
||||
### 关卡配置系统
|
||||
|
||||
#### StageConfigRules配置表
|
||||
|
||||
系统通过StageConfigRules定义了四种关卡类型的怪物配置规则:
|
||||
|
||||
| 关卡类型 | 普通怪物 | 精英怪物 | Boss怪物 | 数量范围 |
|
||||
|---------|----------|----------|----------|----------|
|
||||
| NORMAL | 3-6只 | 0只 | 0只 | 基础3只递增 |
|
||||
| ELITE | 2-5只 | 1-4只 | 0只 | 混合配置 |
|
||||
| BOSS | 1-4只 | 1-3只 | 1只 | 高强度组合 |
|
||||
| EVENT | 1-4只 | 0只 | 0只 | 少量怪物 |
|
||||
|
||||
#### 强度计算引擎
|
||||
|
||||
calculateMonsterStrengthMultiplier函数实现了基于关卡进度的强度倍率计算:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始计算强度倍率]) --> CalcStage[计算关卡倍率<br/>stageMultiplier = 1 + (stage-1) * 0.1]
|
||||
CalcStage --> CalcLevel[计算等级倍率<br/>levelMultiplier = 1 + (level-1) * 0.05]
|
||||
CalcLevel --> Multiply[相乘得到最终倍率<br/>strengthMultiplier = stageMultiplier * levelMultiplier]
|
||||
Multiply --> Return[返回强度倍率]
|
||||
Return --> End([结束])
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L175-L180)
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L65-L132)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L175-L180)
|
||||
|
||||
### 怪物生成流程
|
||||
|
||||
#### getStageMonsterConfigs函数详解
|
||||
|
||||
该函数是怪物配置生成的核心,整合了关卡配置、强度计算和UUID选择:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Caller as 调用者
|
||||
participant Func as getStageMonsterConfigs
|
||||
participant Gen as generateStageConfig
|
||||
participant Calc as calculateMonsterStrengthMultiplier
|
||||
participant UUID as getMonsterUUIDsByType
|
||||
Caller->>Func : getStageMonsterConfigs(stage, level)
|
||||
Func->>Gen : 生成关卡配置
|
||||
Gen-->>Func : 返回怪物类型数组
|
||||
Func->>Calc : 计算强度倍率
|
||||
Calc-->>Func : 返回倍率值
|
||||
loop 遍历每个怪物类型
|
||||
Func->>UUID : 获取该类型UUID列表
|
||||
UUID-->>Func : 返回UUID数组
|
||||
Func->>Func : 随机选择UUID
|
||||
Func->>Func : 构建怪物配置对象
|
||||
end
|
||||
Func-->>Caller : 返回完整怪物配置数组
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L269-L310)
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L269-L310)
|
||||
|
||||
### 怪物数据源关联性
|
||||
|
||||
#### Mon.ts与heroSet.ts的数据绑定
|
||||
|
||||
怪物实体通过Mon.ts加载来自heroSet.ts的配置数据:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class Monster {
|
||||
+load(pos, scale, uuid, is_boss, strengthMultiplier)
|
||||
+hero_init(uuid, node, scale, box_group, is_boss, is_call, strengthMultiplier)
|
||||
-init()
|
||||
-destroy()
|
||||
}
|
||||
class HeroInfo {
|
||||
+uuid : number
|
||||
+name : string
|
||||
+path : string
|
||||
+fac : FacSet
|
||||
+type : HType
|
||||
+hp : number
|
||||
+mp : number
|
||||
+ap : number
|
||||
+def : number
|
||||
+skills : number[]
|
||||
}
|
||||
class MonModelComp {
|
||||
+base_hp : number
|
||||
+base_mp : number
|
||||
+base_ap : number
|
||||
+base_def : number
|
||||
+strengthMultiplier : number
|
||||
}
|
||||
Monster --> HeroInfo : "使用数据"
|
||||
Monster --> MonModelComp : "包含组件"
|
||||
MonModelComp --> HeroInfo : "应用属性"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L20-L110)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L80-L151)
|
||||
|
||||
**章节来源**
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts#L20-L110)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L80-L151)
|
||||
|
||||
### 随机事件系统
|
||||
|
||||
#### EventConfig配置表
|
||||
|
||||
系统提供了完整的随机事件配置,支持四种事件类型:
|
||||
|
||||
| 事件类型 | 触发概率 | 效果描述 |
|
||||
|---------|----------|----------|
|
||||
| TREASURE | 30% | 获得额外奖励 |
|
||||
| TRAP | 25% | 受到一定伤害 |
|
||||
| BUFF | 25% | 获得临时增益效果 |
|
||||
| DEBUFF | 20% | 受到临时减益效果 |
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L134-L165)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
```mermaid
|
||||
graph TD
|
||||
subgraph "外部依赖"
|
||||
ECS[ECS框架]
|
||||
Oops[Oops插件框架]
|
||||
CC[Cocos Creator]
|
||||
end
|
||||
subgraph "内部模块"
|
||||
RC[RogueConfig]
|
||||
MC[MissionMonComp]
|
||||
Mon[Monster实体]
|
||||
HS[HeroSet]
|
||||
end
|
||||
subgraph "配置数据"
|
||||
HeroInfo[HeroInfo配置]
|
||||
SkillSet[SkillSet配置]
|
||||
HeroAttrs[HeroAttrs配置]
|
||||
end
|
||||
RC --> HS
|
||||
MC --> RC
|
||||
MC --> Mon
|
||||
Mon --> HS
|
||||
Mon --> HeroInfo
|
||||
Mon --> SkillSet
|
||||
Mon --> HeroAttrs
|
||||
RC -.-> ECS
|
||||
MC -.-> Oops
|
||||
Mon -.-> CC
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L10)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L15)
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L10)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L15)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
### 怪物生成优化策略
|
||||
|
||||
1. **延迟加载**:怪物实体采用延迟初始化机制,避免一次性加载过多资源
|
||||
2. **随机选择优化**:使用Math.random()进行高效随机选择,避免复杂算法
|
||||
3. **配置缓存**:关卡配置结果被缓存在MissionMonComp中,减少重复计算
|
||||
4. **内存管理**:怪物实体销毁时正确释放组件和资源
|
||||
|
||||
### 强度计算优化
|
||||
|
||||
- 使用简单的数学运算替代复杂的属性计算
|
||||
- 强度倍率计算结果被缓存,避免重复计算
|
||||
- 关卡类型判断采用分支预测友好的条件语句
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 怪物配置不生效
|
||||
|
||||
**问题现象**:关卡中没有生成预期的怪物类型
|
||||
|
||||
**排查步骤**:
|
||||
1. 检查EliteMonsterList和BossMonsterList是否包含正确的UUID
|
||||
2. 验证getMonsterUUIDsByType函数的返回值
|
||||
3. 确认generateStageConfig生成的怪物类型数组
|
||||
|
||||
**解决方案**:
|
||||
- 在heroSet.ts中添加缺失的怪物UUID
|
||||
- 检查MonsterType枚举定义是否正确
|
||||
- 验证关卡配置规则中的怪物数量设置
|
||||
|
||||
#### 强度倍率异常
|
||||
|
||||
**问题现象**:怪物强度不符合预期的增长曲线
|
||||
|
||||
**排查步骤**:
|
||||
1. 检查calculateMonsterStrengthMultiplier函数的计算逻辑
|
||||
2. 验证关卡号和等级参数传递是否正确
|
||||
3. 确认基础属性值是否合理
|
||||
|
||||
**解决方案**:
|
||||
- 调整关卡倍率和等级倍率的计算公式
|
||||
- 检查HeroInfo中的基础属性配置
|
||||
- 验证强度倍率的应用逻辑
|
||||
|
||||
#### 随机事件不触发
|
||||
|
||||
**问题现象**:事件关卡中没有随机事件发生
|
||||
|
||||
**排查步骤**:
|
||||
1. 检查EventConfig的概率设置
|
||||
2. 验证getRandomEvent函数的随机性
|
||||
3. 确认事件处理逻辑是否正确
|
||||
|
||||
**解决方案**:
|
||||
- 调整事件概率分布,确保总和为1
|
||||
- 检查随机数生成器的实现
|
||||
- 验证事件处理函数的调用时机
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L175-L200)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L135-L169)
|
||||
|
||||
## 结论
|
||||
|
||||
RogueConfig.ts构建了一个完整而灵活的怪物配置体系,通过分层的设计实现了怪物类型的差异化管理和关卡的程序化生成。系统的三大核心特性——类型管理、强度计算和随机事件——为肉鸽模式提供了丰富的游戏体验。
|
||||
|
||||
### 主要优势
|
||||
|
||||
1. **类型安全**:通过枚举确保怪物类型的一致性
|
||||
2. **可扩展性**:配置表设计支持轻松添加新怪物类型
|
||||
3. **动态平衡**:强度计算机制保证游戏难度的渐进式提升
|
||||
4. **随机性**:事件系统增加了游戏的不确定性和趣味性
|
||||
|
||||
### 改进建议
|
||||
|
||||
1. **配置验证**:添加配置完整性检查机制
|
||||
2. **性能监控**:在大型关卡中监控怪物生成性能
|
||||
3. **平衡调整**:提供更精细的强度调节工具
|
||||
4. **可视化编辑**:开发关卡配置的可视化编辑器
|
||||
|
||||
该系统为肉鸽游戏提供了坚实的基础架构,支持开发者根据具体需求进行定制和扩展,是构建高质量肉鸽游戏的重要组件。
|
||||
592
.qoder/repowiki/zh/content/地图系统/肉鸽关卡配置/肉鸽关卡配置.md
Normal file
592
.qoder/repowiki/zh/content/地图系统/肉鸽关卡配置/肉鸽关卡配置.md
Normal file
@@ -0,0 +1,592 @@
|
||||
# 肉鸽关卡配置系统
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
|
||||
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
|
||||
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
|
||||
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [系统概述](#系统概述)
|
||||
2. [核心架构](#核心架构)
|
||||
3. [关卡类型系统](#关卡类型系统)
|
||||
4. [怪物类型体系](#怪物类型体系)
|
||||
5. [关卡配置规则](#关卡配置规则)
|
||||
6. [随机事件系统](#随机事件系统)
|
||||
7. [动态难度计算](#动态难度计算)
|
||||
8. [关卡生成流程](#关卡生成流程)
|
||||
9. [实际调用机制](#实际调用机制)
|
||||
10. [扩展指南](#扩展指南)
|
||||
11. [性能优化建议](#性能优化建议)
|
||||
12. [总结](#总结)
|
||||
|
||||
## 系统概述
|
||||
|
||||
肉鸽关卡配置系统是一个高度程序化的关卡生成框架,专为Roguelike游戏设计。该系统通过智能算法动态生成具有递增难度的关卡,支持多种怪物类型、随机事件和平衡性调整。
|
||||
|
||||
### 主要特性
|
||||
|
||||
- **程序化关卡生成**:基于关卡号和等级自动计算关卡配置
|
||||
- **动态难度曲线**:怪物数量和强度随关卡递增而增强
|
||||
- **多样化关卡类型**:普通关卡、精英关卡、Boss关卡、事件关卡
|
||||
- **随机事件系统**:包含奖励、陷阱、增益、减益等多种事件
|
||||
- **灵活配置管理**:支持快速调整难度曲线和平衡性
|
||||
|
||||
## 核心架构
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "配置层"
|
||||
A[RogueConfig.ts] --> B[StageType枚举]
|
||||
A --> C[MonsterType枚举]
|
||||
A --> D[EventType枚举]
|
||||
A --> E[StageConfigRules]
|
||||
A --> F[EventConfig]
|
||||
end
|
||||
subgraph "逻辑层"
|
||||
G[getStageType] --> H[calculateMonsterCount]
|
||||
G --> I[calculateMonsterStrengthMultiplier]
|
||||
H --> J[generateStageConfig]
|
||||
I --> J
|
||||
J --> K[getStageMonsterConfigs]
|
||||
end
|
||||
subgraph "应用层"
|
||||
L[MissionMonComp.ts] --> M[GameMap.ts]
|
||||
L --> N[Mon.ts]
|
||||
L --> O[MapModelComp.ts]
|
||||
end
|
||||
A --> G
|
||||
K --> L
|
||||
M --> O
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L311)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L50)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L40)
|
||||
|
||||
## 关卡类型系统
|
||||
|
||||
系统定义了四种主要的关卡类型,每种类型都有独特的配置特征和挑战性。
|
||||
|
||||
### StageType枚举结构
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class StageType {
|
||||
<<enumeration>>
|
||||
+NORMAL : "normal"
|
||||
+ELITE : "elite"
|
||||
+BOSS : "boss"
|
||||
+EVENT : "event"
|
||||
}
|
||||
class StageConfigRules {
|
||||
+NORMAL : NormalConfig
|
||||
+ELITE : EliteConfig
|
||||
+BOSS : BossConfig
|
||||
+EVENT : EventConfig
|
||||
}
|
||||
class NormalConfig {
|
||||
+description : "普通关卡"
|
||||
+monsters : MonsterGroup[]
|
||||
}
|
||||
class EliteConfig {
|
||||
+description : "精英关卡"
|
||||
+monsters : MonsterGroup[]
|
||||
}
|
||||
class BossConfig {
|
||||
+description : "Boss关卡"
|
||||
+monsters : MonsterGroup[]
|
||||
}
|
||||
class EventConfig {
|
||||
+description : "事件关卡"
|
||||
+monsters : MonsterGroup[]
|
||||
}
|
||||
StageType --> StageConfigRules : "映射到"
|
||||
StageConfigRules --> NormalConfig : "包含"
|
||||
StageConfigRules --> EliteConfig : "包含"
|
||||
StageConfigRules --> BossConfig : "包含"
|
||||
StageConfigRules --> EventConfig : "包含"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L35-L86)
|
||||
|
||||
### 关卡类型特征对比
|
||||
|
||||
| 关卡类型 | 怪物组成 | 数量范围 | 特殊规则 |
|
||||
|---------|---------|---------|---------|
|
||||
| 普通关卡 | 普通怪物 | 2-6只 | 基础难度,适合新手 |
|
||||
| 精英关卡 | 精英+普通 | 3-9只 | 中等难度,包含精英怪物 |
|
||||
| Boss关卡 | Boss+精英+普通 | 4-8只 | 高难度,包含Boss |
|
||||
| 事件关卡 | 普通怪物 | 1-4只 | 包含随机事件 |
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L47-L86)
|
||||
|
||||
## 怪物类型体系
|
||||
|
||||
系统采用分层的怪物分类体系,支持不同强度和行为特征的怪物配置。
|
||||
|
||||
### MonsterType枚举设计
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MonsterType {
|
||||
<<enumeration>>
|
||||
+NORMAL : "normal"
|
||||
+ELITE : "elite"
|
||||
+BOSS : "boss"
|
||||
}
|
||||
class MonsterConfig {
|
||||
+uuid : number
|
||||
+type : MonsterType
|
||||
+stageNumber : number
|
||||
+level : number
|
||||
+strengthMultiplier : number
|
||||
}
|
||||
class MonsterPool {
|
||||
+getMonsterUUIDsByType() : number[]
|
||||
+EliteMonsterList : number[]
|
||||
+BossMonsterList : number[]
|
||||
+getMonList() : number[]
|
||||
}
|
||||
MonsterType --> MonsterConfig : "生成"
|
||||
MonsterPool --> MonsterType : "提供"
|
||||
MonsterPool --> MonsterConfig : "包含"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L28-L34)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L240-L260)
|
||||
|
||||
### 怪物池配置
|
||||
|
||||
系统维护三个独立的怪物池,每个池包含特定类型的怪物:
|
||||
|
||||
- **普通怪物池**:使用 `getMonList()` 方法获取所有可用的普通怪物
|
||||
- **精英怪物池**:固定配置的精英怪物列表
|
||||
- **Boss怪物池**:固定配置的Boss怪物列表
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L18-L34)
|
||||
- [heroSet.ts](file://assets/script/game/game/common/config/heroSet.ts#L35-L40)
|
||||
|
||||
## 关卡配置规则
|
||||
|
||||
系统通过预定义的配置规则实现关卡的程序化生成,确保游戏体验的连贯性和挑战性。
|
||||
|
||||
### 配置规则结构
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A[关卡号] --> B{关卡类型判断}
|
||||
B --> |第5关且等级3| C[事件关卡]
|
||||
B --> |第10关| D{等级判断}
|
||||
B --> |其他| E{等级判断}
|
||||
D --> |等级5| F[Boss关卡]
|
||||
D --> |等级4| G[精英关卡]
|
||||
D --> |其他| H[普通关卡]
|
||||
E --> |等级5| I[精英关卡]
|
||||
E --> |其他| J[普通关卡]
|
||||
C --> K[生成怪物配置]
|
||||
F --> K
|
||||
G --> K
|
||||
H --> K
|
||||
I --> K
|
||||
J --> K
|
||||
K --> L[计算怪物数量]
|
||||
K --> M[计算强度倍率]
|
||||
L --> N[生成最终配置]
|
||||
M --> N
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L129-L168)
|
||||
|
||||
### 怪物数量计算算法
|
||||
|
||||
系统采用线性递增算法计算怪物数量:
|
||||
|
||||
```typescript
|
||||
// 计算公式:基础数量 + (关卡号 ÷ 5) 的整数部分
|
||||
const increment = Math.floor(stageNumber / 5);
|
||||
let count = baseCount + increment;
|
||||
|
||||
// 确保数量在最小值和最大值范围内
|
||||
count = Math.max(minCount, Math.min(maxCount, count));
|
||||
```
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L150-L175)
|
||||
|
||||
## 随机事件系统
|
||||
|
||||
系统提供了丰富的随机事件机制,为游戏增添不确定性和策略深度。
|
||||
|
||||
### EventType枚举
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class EventType {
|
||||
<<enumeration>>
|
||||
+TREASURE : "treasure"
|
||||
+TRAP : "trap"
|
||||
+BUFF : "buff"
|
||||
+DEBUFF : "debuff"
|
||||
}
|
||||
class EventConfig {
|
||||
+TREASURE : TreasureConfig
|
||||
+TRAP : TrapConfig
|
||||
+BUFF : BuffConfig
|
||||
+DEBUFF : DebuffConfig
|
||||
}
|
||||
class EventProbability {
|
||||
+TREASURE : 0.3
|
||||
+TRAP : 0.25
|
||||
+BUFF : 0.25
|
||||
+DEBUFF : 0.2
|
||||
}
|
||||
EventType --> EventConfig : "配置"
|
||||
EventConfig --> EventProbability : "概率分布"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L50-L75)
|
||||
|
||||
### 事件触发机制
|
||||
|
||||
事件系统采用累积概率算法确保公平性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as 玩家
|
||||
participant System as 事件系统
|
||||
participant RNG as 随机数生成器
|
||||
participant Effect as 效果处理器
|
||||
Player->>System : 进入事件关卡
|
||||
System->>RNG : 生成随机数(0-1)
|
||||
RNG-->>System : 返回随机值
|
||||
System->>System : 累积概率计算
|
||||
alt 随机数 ≤ 0.3
|
||||
System->>Effect : 触发宝藏事件
|
||||
Effect->>Player : 增加50金币
|
||||
else 随机数 ≤ 0.55
|
||||
System->>Effect : 触发陷阱事件
|
||||
Effect->>Player : 造成伤害
|
||||
else 随机数 ≤ 0.8
|
||||
System->>Effect : 触发增益事件
|
||||
Effect->>Player : 获得临时增益
|
||||
else 随机数 > 0.8
|
||||
System->>Effect : 触发减益事件
|
||||
Effect->>Player : 造成临时减益
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L295-L311)
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L50-L75)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L295-L311)
|
||||
|
||||
## 动态难度计算
|
||||
|
||||
系统实现了复杂的难度计算机制,确保游戏体验的渐进式挑战。
|
||||
|
||||
### 强度倍率计算
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[关卡号] --> B[阶段倍率计算]
|
||||
C[等级] --> D[等级倍率计算]
|
||||
B --> E[基础倍率 = 1 + (关卡号-1) × 0.1]
|
||||
D --> F[等级倍率 = 1 + (等级-1) × 0.05]
|
||||
E --> G[总倍率 = 阶段倍率 × 等级倍率]
|
||||
F --> G
|
||||
G --> H[应用到怪物属性]
|
||||
H --> I[HP = 基础HP × 总倍率]
|
||||
H --> J[AP = 基础AP × 总倍率]
|
||||
H --> K[DEF = 基础DEF × 总倍率]
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L177-L185)
|
||||
|
||||
### 难度曲线特征
|
||||
|
||||
| 关卡范围 | 等级要求 | 强度倍率 | 怪物数量 | 挑战特点 |
|
||||
|---------|---------|---------|---------|---------|
|
||||
| 1-9 | 1-4级 | 1.0-1.4 | 2-6只 | 渐进适应 |
|
||||
| 1-9 | 5级 | 1.4-1.8 | 3-6只 | 中等挑战 |
|
||||
| 10 | 1-3级 | 1.9-2.3 | 3-6只 | 高强度 |
|
||||
| 10 | 4级 | 2.4-2.8 | 3-6只 | 极限挑战 |
|
||||
| 10 | 5级 | 2.9-3.3 | 3-6只 | 终极考验 |
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L177-L185)
|
||||
|
||||
## 关卡生成流程
|
||||
|
||||
系统通过多层函数协作实现完整的关卡生成流程。
|
||||
|
||||
### 完整生成序列
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant MC as MissionComp
|
||||
participant RM as MissionMonComp
|
||||
participant RC as RogueConfig
|
||||
participant MM as MapModel
|
||||
participant M as Monster
|
||||
MC->>RM : do_mon_wave()
|
||||
RM->>RC : getStageType(stageNumber, level)
|
||||
RC-->>RM : StageType
|
||||
RM->>RC : getStageMonsterConfigs(stageNumber, level)
|
||||
RC->>RC : generateStageConfig()
|
||||
RC->>RC : calculateMonsterCount()
|
||||
RC->>RC : calculateMonsterStrengthMultiplier()
|
||||
RC-->>RM : 怪物配置数组
|
||||
RM->>RM : generateMonstersFromStageConfig()
|
||||
loop 每个怪物配置
|
||||
RM->>RM : addToStageSpawnQueue()
|
||||
end
|
||||
loop 怪物生成队列
|
||||
RM->>M : addMonster()
|
||||
M->>MM : 加载怪物资源
|
||||
MM-->>M : 怪物实例
|
||||
M-->>RM : 怪物实体
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L207-L247)
|
||||
|
||||
### 怪物生成队列管理
|
||||
|
||||
系统采用队列机制控制怪物生成节奏:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> 等待生成
|
||||
等待生成 --> 准备生成 : 怪物队列非空
|
||||
准备生成 --> 生成中 : spawnTimer >= spawnInterval
|
||||
生成中 --> 暂停检查 : 生成5只后
|
||||
生成中 --> 准备生成 : 继续生成
|
||||
暂停检查 --> 暂停中 : 需要暂停
|
||||
暂停检查 --> 准备生成 : 继续生成
|
||||
暂停中 --> 暂停结束 : pauseInterval时间到
|
||||
暂停结束 --> 准备生成 : 重置计数器
|
||||
准备生成 --> [*] : 队列为空
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L45-L85)
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L150-L180)
|
||||
|
||||
## 实际调用机制
|
||||
|
||||
系统在游戏运行时通过事件驱动的方式调用关卡配置功能。
|
||||
|
||||
### 调用时序图
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant GM as GameMap
|
||||
participant MC as MissionComp
|
||||
participant MMon as MissionMonComp
|
||||
participant RC as RogueConfig
|
||||
GM->>MC : 初始化游戏
|
||||
MC->>MC : data_init()
|
||||
MC->>MC : mission_start()
|
||||
MC->>MC : to_fight()
|
||||
MC->>MMon : fight_ready()
|
||||
MMon->>MMon : do_mon_wave()
|
||||
Note over MMon : 开始关卡生成流程
|
||||
MMon->>RC : getStageType(currentStage, level)
|
||||
MMon->>RC : getStageMonsterConfigs(currentStage, level)
|
||||
RC-->>MMon : 怪物配置数据
|
||||
MMon->>MMon : generateMonstersFromStageConfig()
|
||||
MMon->>MMon : addToStageSpawnQueue()
|
||||
loop 怪物生成循环
|
||||
MMon->>MMon : spawnNextMonster()
|
||||
MMon->>GM : addMonster()
|
||||
end
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L25-L35)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L75-L95)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L40-L50)
|
||||
|
||||
### 数据流传递
|
||||
|
||||
关卡配置数据通过以下路径传递:
|
||||
|
||||
1. **配置层**:RogueConfig.ts 提供基础配置
|
||||
2. **逻辑层**:MissionMonComp.ts 处理游戏逻辑
|
||||
3. **渲染层**:Mon.ts 负责怪物渲染和行为
|
||||
4. **状态层**:smc.vmdata.mission_data 管理游戏状态
|
||||
|
||||
**章节来源**
|
||||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L25-L35)
|
||||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L75-L95)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L40-L50)
|
||||
|
||||
## 扩展指南
|
||||
|
||||
### 添加新事件类型
|
||||
|
||||
要添加新的随机事件类型,请按照以下步骤操作:
|
||||
|
||||
1. **扩展EventType枚举**:
|
||||
```typescript
|
||||
export enum EventType {
|
||||
// 现有类型...
|
||||
NEW_EVENT = "new_event" // 新增事件类型
|
||||
}
|
||||
```
|
||||
|
||||
2. **更新EventConfig配置**:
|
||||
```typescript
|
||||
export const EventConfig = {
|
||||
// 现有配置...
|
||||
[EventType.NEW_EVENT]: {
|
||||
description: "新事件描述",
|
||||
probability: 0.15, // 新事件概率
|
||||
effect: "新事件效果"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
3. **在事件处理函数中添加逻辑**:
|
||||
```typescript
|
||||
private processRandomEvent() {
|
||||
switch (this.currentEvent) {
|
||||
// 现有事件处理...
|
||||
case EventType.NEW_EVENT:
|
||||
// 实现新事件逻辑
|
||||
break;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 调整难度曲线
|
||||
|
||||
可以通过修改以下参数来调整难度曲线:
|
||||
|
||||
1. **基础倍率调整**:
|
||||
```typescript
|
||||
// 修改 StageConfigRules 中的怪物配置
|
||||
[StageType.NORMAL]: {
|
||||
monsters: [
|
||||
{ type: MonsterType.NORMAL, count: 3, minCount: 2, maxCount: 6 }
|
||||
// count: 基础数量
|
||||
// minCount/maxCount: 数量范围限制
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
2. **强度倍率系数**:
|
||||
```typescript
|
||||
// 修改 calculateMonsterStrengthMultiplier 函数
|
||||
const stageMultiplier = 1 + (stageNumber - 1) * 0.15; // 增加每关倍率
|
||||
const levelMultiplier = 1 + (level - 1) * 0.08; // 增加每级倍率
|
||||
```
|
||||
|
||||
### 平衡精英/Boss关卡
|
||||
|
||||
1. **调整精英怪物配置**:
|
||||
```typescript
|
||||
export const EliteMonsterList = [
|
||||
5201, // 兽人战士
|
||||
5202, // 兽人刺客
|
||||
5203, // 兽人护卫
|
||||
// 添加更多精英怪物
|
||||
5204, // 新精英怪物
|
||||
5205 // 更强精英怪物
|
||||
];
|
||||
```
|
||||
|
||||
2. **优化Boss关卡配置**:
|
||||
```typescript
|
||||
[StageType.BOSS]: {
|
||||
description: "Boss关卡",
|
||||
monsters: [
|
||||
{ type: MonsterType.BOSS, count: 1, minCount: 1, maxCount: 1 },
|
||||
{ type: MonsterType.ELITE, count: 3, minCount: 2, maxCount: 4 }, // 增加精英数量
|
||||
{ type: MonsterType.NORMAL, count: 4, minCount: 2, maxCount: 6 } // 增加普通怪物
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 自定义怪物池
|
||||
|
||||
如果需要添加特定类型的怪物:
|
||||
|
||||
1. **扩展怪物池**:
|
||||
```typescript
|
||||
// 在 RogueConfig.ts 中
|
||||
export const CustomMonsterList = [
|
||||
5301, // 自定义怪物1
|
||||
5302, // 自定义怪物2
|
||||
5303 // 自定义怪物3
|
||||
];
|
||||
```
|
||||
|
||||
2. **在 getMonsterUUIDsByType 中添加分支**:
|
||||
```typescript
|
||||
case MonsterType.CUSTOM:
|
||||
return CustomMonsterList;
|
||||
```
|
||||
|
||||
## 性能优化建议
|
||||
|
||||
### 怪物生成优化
|
||||
|
||||
1. **批量生成**:使用对象池减少频繁的实例化
|
||||
2. **延迟加载**:怪物资源按需加载
|
||||
3. **队列管理**:合理控制生成频率避免性能峰值
|
||||
|
||||
### 内存管理
|
||||
|
||||
1. **及时清理**:战斗结束后立即清理怪物实体
|
||||
2. **资源卸载**:不再需要的资源及时卸载
|
||||
3. **缓存策略**:合理缓存常用的配置数据
|
||||
|
||||
### 配置优化
|
||||
|
||||
1. **预计算**:将静态配置在启动时预计算
|
||||
2. **分层加载**:按关卡需求分层加载配置
|
||||
3. **压缩存储**:使用紧凑的数据结构存储配置
|
||||
|
||||
## 总结
|
||||
|
||||
肉鸽关卡配置系统是一个设计精良的程序化关卡生成框架,具有以下核心优势:
|
||||
|
||||
### 技术亮点
|
||||
|
||||
- **模块化设计**:清晰的职责分离和接口定义
|
||||
- **可扩展性**:易于添加新类型和调整配置
|
||||
- **性能优化**:合理的算法设计和资源管理
|
||||
- **用户体验**:平衡的难度曲线和多样化的游戏体验
|
||||
|
||||
### 应用价值
|
||||
|
||||
该系统不仅适用于Roguelike游戏,也可作为其他类型游戏关卡生成的基础框架。其程序化的设计理念和灵活的配置机制为游戏开发提供了强大的工具支持。
|
||||
|
||||
通过深入理解和合理运用这套系统,开发者可以创造出具有深度策略性和持续挑战性的游戏体验,为玩家提供持久的游戏乐趣。
|
||||
342
.qoder/repowiki/zh/content/地图系统/肉鸽关卡配置/随机事件系统.md
Normal file
342
.qoder/repowiki/zh/content/地图系统/肉鸽关卡配置/随机事件系统.md
Normal file
@@ -0,0 +1,342 @@
|
||||
# 随机事件系统
|
||||
|
||||
<cite>
|
||||
**本文档引用的文件**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
|
||||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts)
|
||||
</cite>
|
||||
|
||||
## 目录
|
||||
1. [概述](#概述)
|
||||
2. [项目结构](#项目结构)
|
||||
3. [核心组件](#核心组件)
|
||||
4. [架构概览](#架构概览)
|
||||
5. [详细组件分析](#详细组件分析)
|
||||
6. [依赖关系分析](#依赖关系分析)
|
||||
7. [性能考虑](#性能考虑)
|
||||
8. [故障排除指南](#故障排除指南)
|
||||
9. [结论](#结论)
|
||||
|
||||
## 概述
|
||||
|
||||
随机事件系统是肉鸽模式(Roguelike)游戏的核心机制之一,它为玩家提供了不可预测的游戏体验。本文档详细分析了RogueConfig.ts中实现的随机事件机制,包括事件类型定义、概率配置、触发逻辑以及与游戏流程的集成方式。
|
||||
|
||||
该系统通过EventType枚举定义了四种基本事件类型:宝箱事件(Treasure)、陷阱事件(Trap)、增益事件(Buff)和减益事件(Debuff),并通过EventConfig配置对象实现了灵活的概率控制和效果描述。
|
||||
|
||||
## 项目结构
|
||||
|
||||
随机事件系统的核心文件位于游戏的地图模块中,主要包含以下关键组件:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "随机事件系统架构"
|
||||
RogueConfig["RogueConfig.ts<br/>核心配置与算法"]
|
||||
MissionMonComp["MissionMonComp.ts<br/>事件处理控制器"]
|
||||
GameEvent["GameEvent.ts<br/>事件通信系统"]
|
||||
HeroAttrs["HeroAttrs.ts<br/>属性系统"]
|
||||
end
|
||||
subgraph "UI反馈系统"
|
||||
GameUIConfig["GameUIConfig.ts<br/>界面配置"]
|
||||
MessageSystem["消息系统"]
|
||||
end
|
||||
RogueConfig --> MissionMonComp
|
||||
MissionMonComp --> GameEvent
|
||||
MissionMonComp --> HeroAttrs
|
||||
GameEvent --> MessageSystem
|
||||
MessageSystem --> GameUIConfig
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L311)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L50)
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L30)
|
||||
|
||||
## 核心组件
|
||||
|
||||
### EventType枚举定义
|
||||
|
||||
系统定义了四种基本的随机事件类型,每种类型都有明确的业务含义:
|
||||
|
||||
| 事件类型 | 描述 | 业务含义 |
|
||||
|---------|------|----------|
|
||||
| TREASURE | 宝箱事件 | 提供额外奖励,增加玩家收益 |
|
||||
| TRAP | 陷阱事件 | 造成伤害,增加游戏风险 |
|
||||
| BUFF | 增益事件 | 提供临时能力提升,改善玩家状态 |
|
||||
| DEBUFF | 减益事件 | 降低玩家能力,增加挑战难度 |
|
||||
|
||||
### EventConfig配置对象
|
||||
|
||||
每个事件类型都通过EventConfig对象进行详细配置,包含触发概率和效果描述:
|
||||
|
||||
| 配置项 | 宝箱事件 | 陷阱事件 | 增益事件 | 减益事件 |
|
||||
|--------|----------|----------|----------|----------|
|
||||
| 触发概率 | 30% | 25% | 25% | 20% |
|
||||
| 效果描述 | 获得额外奖励 | 受到一定伤害 | 获得临时增益效果 | 受到临时减益效果 |
|
||||
|
||||
### StageType事件关卡
|
||||
|
||||
事件关卡(StageType.EVENT)作为特殊的关卡类型,具有独特的触发条件和游戏流程融合方式。
|
||||
|
||||
**章节来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L40-L85)
|
||||
|
||||
## 架构概览
|
||||
|
||||
随机事件系统采用分层架构设计,确保了良好的模块化和可扩展性:
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Player as "玩家"
|
||||
participant MissionComp as "MissionMonComp"
|
||||
participant RogueConfig as "RogueConfig"
|
||||
participant GameEvent as "GameEvent系统"
|
||||
participant UI as "UI反馈"
|
||||
Player->>MissionComp : 进入关卡
|
||||
MissionComp->>RogueConfig : getStageType()
|
||||
RogueConfig-->>MissionComp : 返回关卡类型
|
||||
MissionComp->>RogueConfig : getRandomEvent()
|
||||
RogueConfig-->>MissionComp : 返回事件类型
|
||||
MissionComp->>MissionComp : processRandomEvent()
|
||||
MissionComp->>GameEvent : 触发事件
|
||||
GameEvent->>UI : 显示事件效果
|
||||
Note over Player,UI : 随机事件处理流程
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L280-L311)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### getRandomEvent函数实现
|
||||
|
||||
getRandomEvent函数是随机事件系统的核心算法,基于累积概率算法实现加权随机选择:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始随机事件选择]) --> InitRandom["生成随机数<br/>random = Math.random()"]
|
||||
InitRandom --> ResetCumulative["重置累积概率<br/>cumulativeProbability = 0"]
|
||||
ResetCumulative --> LoopEvents["遍历EventConfig中的事件类型"]
|
||||
LoopEvents --> AddProbability["累积概率<br/>cumulativeProbability += probability"]
|
||||
AddProbability --> CheckCondition{"random <= cumulativeProbability?"}
|
||||
CheckCondition --> |是| ReturnEvent["返回事件类型"]
|
||||
CheckCondition --> |否| NextEvent["检查下一个事件"]
|
||||
NextEvent --> LoopEvents
|
||||
ReturnEvent --> End([结束])
|
||||
style Start fill:#e1f5fe
|
||||
style End fill:#e8f5e8
|
||||
style ReturnEvent fill:#fff3e0
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L280-L311)
|
||||
|
||||
该算法的关键特性:
|
||||
- **累积概率计算**:通过逐步累加各事件的概率,实现加权随机选择
|
||||
- **边界条件处理**:确保所有事件都有被选中的机会
|
||||
- **性能优化**:O(n)时间复杂度,其中n为事件类型数量
|
||||
|
||||
### getStageType关卡类型判断
|
||||
|
||||
关卡类型判断逻辑实现了复杂的触发条件:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([开始关卡类型判断]) --> CheckStageNumber{"stageNumber % 5 == 0?"}
|
||||
CheckStageNumber --> |是| CheckLevel{"level == 3?"}
|
||||
CheckLevel --> |是| ReturnEvent["返回EVENT类型"]
|
||||
CheckLevel --> |否| ContinueCheck["继续检查"]
|
||||
CheckStageNumber --> |否| CheckTen{"stageNumber % 10 == 0?"}
|
||||
CheckTen --> |是| CheckTenLevel{"level == 5?"}
|
||||
CheckTenLevel --> |是| ReturnBoss["返回BOSS类型"]
|
||||
CheckTenLevel --> |否| CheckFour{"level == 4?"}
|
||||
CheckFour --> |是| ReturnElite["返回ELITE类型"]
|
||||
CheckFour --> |否| ReturnNormal["返回NORMAL类型"]
|
||||
CheckTen --> |否| CheckOneToNine{"1 <= stageNumber <= 9?"}
|
||||
CheckOneToNine --> |是| CheckFive{"level == 5?"}
|
||||
CheckFive --> |是| ReturnElite2["返回ELITE类型"]
|
||||
CheckFive --> |否| ReturnNormal2["返回NORMAL类型"]
|
||||
ContinueCheck --> CheckTen
|
||||
ReturnEvent --> End([结束])
|
||||
ReturnBoss --> End
|
||||
ReturnElite --> End
|
||||
ReturnNormal --> End
|
||||
ReturnElite2 --> End
|
||||
ReturnNormal2 --> End
|
||||
style Start fill:#e1f5fe
|
||||
style End fill:#e8f5e8
|
||||
style ReturnEvent fill:#fff3e0
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L140-L170)
|
||||
|
||||
### 事件处理流程
|
||||
|
||||
事件处理通过MissionMonComp组件实现,包含完整的生命周期管理:
|
||||
|
||||
```mermaid
|
||||
classDiagram
|
||||
class MissionMonComp {
|
||||
-currentEvent : EventType | null
|
||||
-eventProcessed : boolean
|
||||
+do_mon_wave() : void
|
||||
+processRandomEvent() : void
|
||||
-generateMonstersFromStageConfig() : void
|
||||
-addToStageSpawnQueue() : void
|
||||
}
|
||||
class EventType {
|
||||
<<enumeration>>
|
||||
TREASURE
|
||||
TRAP
|
||||
BUFF
|
||||
DEBUFF
|
||||
}
|
||||
class RogueConfig {
|
||||
+getRandomEvent() : EventType | null
|
||||
+getStageType() : StageType
|
||||
+calculateMonsterCount() : number
|
||||
+calculateMonsterStrengthMultiplier() : number
|
||||
}
|
||||
MissionMonComp --> EventType : "使用"
|
||||
MissionMonComp --> RogueConfig : "调用"
|
||||
RogueConfig --> EventType : "返回"
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L15-L35)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L40-L85)
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L169)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L280-L311)
|
||||
|
||||
## 依赖关系分析
|
||||
|
||||
随机事件系统的依赖关系体现了清晰的分层架构:
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
subgraph "外部依赖"
|
||||
ECS[ECS框架]
|
||||
OopsFramework[Oops Framework]
|
||||
GameEngine[Cocos Creator引擎]
|
||||
end
|
||||
subgraph "核心模块"
|
||||
RogueConfig[RogueConfig.ts]
|
||||
MissionMonComp[MissionMonComp.ts]
|
||||
GameEvent[GameEvent.ts]
|
||||
end
|
||||
subgraph "配置模块"
|
||||
HeroAttrs[HeroAttrs.ts]
|
||||
GameUIConfig[GameUIConfig.ts]
|
||||
end
|
||||
ECS --> MissionMonComp
|
||||
OopsFramework --> GameEvent
|
||||
GameEngine --> ECS
|
||||
RogueConfig --> MissionMonComp
|
||||
MissionMonComp --> GameEvent
|
||||
GameEvent --> GameUIConfig
|
||||
HeroAttrs --> MissionMonComp
|
||||
style RogueConfig fill:#e3f2fd
|
||||
style MissionMonComp fill:#f3e5f5
|
||||
style GameEvent fill:#e8f5e8
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L15)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L20)
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L20)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L20)
|
||||
|
||||
## 性能考虑
|
||||
|
||||
随机事件系统在设计时充分考虑了性能优化:
|
||||
|
||||
### 算法复杂度分析
|
||||
- **getRandomEvent函数**:O(n)时间复杂度,其中n为事件类型数量
|
||||
- **getStageType函数**:O(1)时间复杂度,固定条件判断
|
||||
- **事件处理**:单次事件处理时间复杂度为O(1)
|
||||
|
||||
### 内存使用优化
|
||||
- 事件配置采用静态常量定义,避免运行时内存分配
|
||||
- 事件类型使用枚举,减少字符串比较开销
|
||||
- 事件状态管理简洁,避免不必要的状态保存
|
||||
|
||||
### 扩展性设计
|
||||
- 新增事件类型只需修改EventType枚举和EventConfig配置
|
||||
- 事件效果处理采用switch语句,便于添加新的处理逻辑
|
||||
- 关卡类型判断逻辑支持未来扩展新的触发条件
|
||||
|
||||
## 故障排除指南
|
||||
|
||||
### 常见问题及解决方案
|
||||
|
||||
#### 事件触发概率异常
|
||||
**问题描述**:事件触发概率不符合预期
|
||||
**可能原因**:
|
||||
- EventConfig中的概率设置错误
|
||||
- 累积概率计算逻辑异常
|
||||
|
||||
**解决方案**:
|
||||
1. 检查EventConfig中各事件的概率总和是否为1
|
||||
2. 验证getRandomEvent函数的累积概率计算逻辑
|
||||
3. 添加调试日志输出随机数和累积概率值
|
||||
|
||||
#### 事件关卡触发时机错误
|
||||
**问题描述**:事件关卡在非预期关卡触发
|
||||
**可能原因**:
|
||||
- getStageType函数的关卡判断逻辑错误
|
||||
- 关卡参数传递不正确
|
||||
|
||||
**解决方案**:
|
||||
1. 检查关卡号和等级参数的传递
|
||||
2. 验证getStageType函数中的模运算逻辑
|
||||
3. 添加关卡类型判断的日志输出
|
||||
|
||||
#### 事件效果未生效
|
||||
**问题描述**:事件发生但效果未体现
|
||||
**可能原因**:
|
||||
- 事件处理逻辑缺失
|
||||
- UI反馈未正确触发
|
||||
|
||||
**解决方案**:
|
||||
1. 检查MissionMonComp中的processRandomEvent函数
|
||||
2. 验证GameEvent系统的事件分发机制
|
||||
3. 确认UI层的消息接收和处理逻辑
|
||||
|
||||
**章节来源**
|
||||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L120-L169)
|
||||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L280-L311)
|
||||
|
||||
## 结论
|
||||
|
||||
随机事件系统通过精心设计的架构和算法,为肉鸽模式游戏提供了丰富且可控的随机体验。系统的主要优势包括:
|
||||
|
||||
### 设计优势
|
||||
- **模块化架构**:清晰的职责分离,便于维护和扩展
|
||||
- **灵活的概率控制**:支持动态调整事件触发概率
|
||||
- **完善的事件处理**:从触发到效果呈现的完整流程
|
||||
- **良好的性能表现**:高效的算法实现和内存使用
|
||||
|
||||
### 扩展建议
|
||||
1. **新增事件类型**:可以轻松添加复活、传送等新事件类型
|
||||
2. **概率动态调整**:可以根据游戏进程动态调整事件概率
|
||||
3. **事件效果增强**:支持更复杂的事件效果和组合效果
|
||||
4. **UI反馈完善**:集成更丰富的视觉和音效反馈
|
||||
|
||||
### 最佳实践
|
||||
- 保持事件概率的平衡性,避免过于极端的结果
|
||||
- 提供清晰的事件效果说明,帮助玩家理解游戏机制
|
||||
- 实现事件历史记录功能,增加游戏的策略深度
|
||||
- 建立完善的测试机制,确保事件系统的稳定性
|
||||
|
||||
该随机事件系统为肉鸽游戏提供了坚实的基础,通过合理的扩展和优化,可以进一步提升游戏的趣味性和挑战性。
|
||||
Reference in New Issue
Block a user