behavior-eden-coco-plugin/dist/runtime/core/BehaviorSource.js

78 lines
2.8 KiB
JavaScript
Raw Permalink Normal View History

2023-09-20 17:32:11 +00:00
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BehaviorSource = void 0;
const index_1 = require("../node/index");
const decorator_1 = require("./decorator");
const utils_1 = require("./utils");
/***
* 主要用来解析json文件生成行为树对象
*/
class BehaviorSource {
constructor() {
this.rootNode = null;
}
parse(content = {}) {
var _a;
try {
// root节点已存在代表已经成功解析过
if (this.rootNode) {
return;
}
const nodes = content.nodes;
if (!(nodes === null || nodes === void 0 ? void 0 : nodes.length)) {
throw new Error("节点数据不存在");
}
const nodesMap = new Map();
for (const node of nodes) {
nodesMap.set(node.id, node);
}
/***
* 建树数据层面
*/
const root = (0, utils_1.buildTree)(nodes);
if (!root) {
throw new Error("根节点不存在");
}
/***
* 建树对象层面
*/
const postOrderNodes = (0, utils_1.postOrder)(root);
// 节点id和对象的映射
const nodeIdInstanceMap = new Map();
// 倒序遍历
for (let i = 0; i < postOrderNodes.length; i++) {
const node = postOrderNodes[i];
// 获取节点对应的class
const cls = decorator_1.nodeClsMap.get(node.type);
if (!cls) {
throw new Error("节点class不存在");
}
// 实例化
const instance = new cls();
const nodeData = nodesMap.get(node.id);
// 保存node data
instance.data = nodeData;
// composite设置设置abortType
if (instance instanceof index_1.Composite) {
instance.abortType = nodeData.abortType;
}
// 父节点
if ((_a = node.children) === null || _a === void 0 ? void 0 : _a.length) {
// 倒序遍历可以保证子节点的初始化在父节点之前
const children = node.children.map((child) => nodeIdInstanceMap.get(child.id));
instance.setChildren(children);
}
nodeIdInstanceMap.set(node.id, instance);
// 最后一项是根节点
if (i === postOrderNodes.length - 1) {
this.rootNode = instance;
}
}
}
catch (e) {
console.error(e);
}
}
}
exports.BehaviorSource = BehaviorSource;