503 lines
15 KiB
Markdown
503 lines
15 KiB
Markdown
# 地图模型
|
||
|
||
<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的设计理念和实现细节,开发者可以更好地利用这一组件,构建更加复杂和有趣的游戏世界。 |