/** * @file GameMap.ts * @description 游戏地图 ECS 实体 * * 职责: * 1. 作为地图模块的 **ECS 根实体**,聚合 MapModelComp(数据层)与 MapViewComp(视图层)。 * 2. 在 init 阶段仅注册 MapModelComp(纯数据,不依赖节点)。 * 3. 显式调用 load() 时,异步加载地图预制(Prefab),实例化后将 MapViewComp 挂载到实体上。 * * 设计说明: * - 视图层的挂载延后到 load() 完成后,确保 Prefab 加载成功且节点树就绪。 * - 实例化的地图节点被添加至 oops.game.root,作为场景显示层的子节点。 * - MapViewComp 从预制体中名为 "map" 的子节点上获取。 * * 依赖: * - MapModelComp(model/MapModelComp.ts)—— 存放地图资源路径等数据配置 * - MapViewComp(view/MapViewComp.ts)—— 地图视图逻辑 * - oops.res —— 资源加载 * - oops.game.root —— 全局显示根节点 */ /* * @Author: dgflash * @Date: 2022-02-12 11:02:21 * @LastEditors: dgflash * @LastEditTime: 2022-08-04 15:20:55 */ import { instantiate, Prefab } from "cc"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { MapModelComp } from "./model/MapModelComp"; import { MapViewComp } from "./view/MapViewComp"; /** 游戏地图 ECS 实体 */ @ecs.register(`GameMap`) export class GameMap extends ecs.Entity { /** 地图数据模型组件(通过 ECS 自动注入) */ MapModel!: MapModelComp; /** 地图视图组件(通过 ECS 自动注入,load() 完成后可用) */ MapView!: MapViewComp; /** * ECS 实体初始化:注册数据层组件。 * 视图层在 load() 中异步挂载。 */ protected init(): void { this.addComponents( MapModelComp); } /** * 加载地图显示资源: * 1. 通过 MapModel.resPrefab 路径加载 Prefab。 * 2. 实例化预制体并挂载到全局根节点。 * 3. 从预制体中提取 MapViewComp 并通过 this.add() 注册到实体。 */ load() { oops.res.load(this.MapModel.resPrefab, Prefab, (err: Error | null, res: Prefab) => { if (err) { console.error(err); } var map = instantiate(res); map.parent = oops.game.root; this.add(map.getChildByName("map").getComponent(MapViewComp)); }); } }