(function() { var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined'; var __module = nodeEnv ? module : {exports:{}}; var __filename = 'preview-scripts/assets/script/manager/AStarHelper.js'; var __require = nodeEnv ? function (request) { return cc.require(request); } : function (request) { return __quick_compile_project__.require(request, __filename); }; function __define (exports, require, module) { if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict"; cc._RF.push(module, '83acaZ/3VxKhrCaH84XJEHJ', 'AStarHelper'); // script/manager/AStarHelper.ts "use strict"; /* * @Author: gyw * @Date: 2019-09-09 * @Desc: A*寻路 * tilemap专用 */ Object.defineProperty(exports, "__esModule", { value: true }); exports.AStarHelper = void 0; var AStarHelper = /** @class */ (function () { function AStarHelper() { } //其中的MAP.arr是二维数组 AStarHelper.searchRoad = function (map, start_x, start_y, end_x, end_y, colliderTiles) { if (start_x == end_x && start_y == end_y) return null; var layerSize = map.getLayerSize(); var rows = layerSize.width; //行 var cols = layerSize.height; //列 // let rows = PathMgr.getInstance().mapJson.length; //行 // let cols = PathMgr.getInstance().mapJson[0].length; //列 var openList = [], //开启列表 closeList = [], //关闭列表 result = [], //结果数组 result_index; //结果数组在开启列表中的序号 openList.push({ x: start_x, y: start_y, G: 0 }); //把当前点加入到开启列表中,并且G是0 do { var currentPoint = openList.pop(); closeList.push(currentPoint); // if (Math.abs(currentPoint.x - start_x) > 10 || Math.abs(currentPoint.y - start_y) > 10) continue; var surroundPoint = this.SurroundPoint(currentPoint); for (var i in surroundPoint) { var item = surroundPoint[i]; //获得周围的八个点 if (item.x >= 0 && //判断是否在地图上 item.y >= 0 && item.x < rows && item.y < cols && (this.checkCell(map, item.x, item.y) == 0 || this.checkCell(map, item.x, item.y) == 65) && //判断是否是障碍物 0代表是空位 this.existList(item, closeList) == -100 //判断是否在关闭列表中 && (!colliderTiles || !colliderTiles[item.x] || !colliderTiles[item.x][item.y])) { //g 到父节点的位置 //如果是上下左右位置的则g等于10,斜对角的就是14 var g = currentPoint.G + ((currentPoint.x - item.x) * (currentPoint.y - item.y) == 0 ? 10 : 14); if (this.existList(item, openList) == -100) { //如果不在开启列表中 //计算H,通过水平和垂直距离进行确定 item['H'] = Math.abs(end_x - item.x) * 10 + Math.abs(end_y - item.y) * 10; item['G'] = g; item['F'] = item['H'] + item['G']; item['parent'] = currentPoint; openList.push(item); } else { //存在在开启列表中,比较目前的g值和之前的g的大小 var index = this.existList(item, openList); //如果当前点的g更小 if (g < openList[index].G) { openList[index].parent = currentPoint; openList[index].G = g; openList[index].F = g + openList[index].H; } } } } //如果开启列表空了,没有通路,结果为空 if (openList.length == 0) { break; } openList.sort(this.sortF); //这一步是为了循环回去的时候,找出 F 值最小的, 将它从 "开启列表" 中移掉 } while ((result_index = this.existList({ x: end_x, y: end_y }, openList)) == -100); //判断结果列表是否为空 if (result_index == -100 || result_index == void 0) { result = []; } else { var currentObj = openList[result_index]; do { //把路劲节点添加到result当中 result.unshift({ x: currentObj.x, y: currentObj.y }); currentObj = currentObj.parent; } while (currentObj.x != start_x || currentObj.y != start_y); } return result; }; //用F值对数组排序 AStarHelper.sortF = function (a, b) { return b.F - a.F; }; //获取周围八个点的值 AStarHelper.SurroundPoint = function (curPoint) { var x = curPoint.x, y = curPoint.y; return [ { x: x - 1, y: y - 1 }, { x: x, y: y - 1 }, { x: x + 1, y: y - 1 }, { x: x + 1, y: y }, { x: x + 1, y: y + 1 }, { x: x, y: y + 1 }, { x: x - 1, y: y + 1 }, { x: x - 1, y: y } ]; }; //判断点是否存在在列表中,是的话返回的是序列号 AStarHelper.existList = function (point, list) { for (var i in list) { if (point.x == list[i].x && point.y == list[i].y) { return i; } } return -100; }; //检测单元格是否是障碍物 AStarHelper.checkCell = function (mapLayer, x, y) { var res = mapLayer.getTileGIDAt(x, y); // let res = PathMgr.getInstance().mapJson[x][y]; return res; }; return AStarHelper; }()); exports.AStarHelper = AStarHelper; cc._RF.pop(); } if (nodeEnv) { __define(__module.exports, __require, __module); } else { __quick_compile_project__.registerModuleFunc(__filename, function () { __define(__module.exports, __require, __module); }); } })(); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvbWFuYWdlci9BU3RhckhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7O0dBS0c7OztBQUdIO0lBQUE7SUF3SEEsQ0FBQztJQXZIRyxpQkFBaUI7SUFDSCxzQkFBVSxHQUF4QixVQUF5QixHQUFrQixFQUFFLE9BQWUsRUFBRSxPQUFlLEVBQUUsS0FBYSxFQUFFLEtBQWEsRUFBRSxhQUFxQjtRQUM5SCxJQUFJLE9BQU8sSUFBSSxLQUFLLElBQUksT0FBTyxJQUFJLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN0RCxJQUFJLFNBQVMsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbkMsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFJLEdBQUc7UUFDbEMsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFJLEdBQUc7UUFDbkMsMERBQTBEO1FBQzFELDZEQUE2RDtRQUM3RCxJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUssTUFBTTtRQUN4QixTQUFTLEdBQUcsRUFBRSxFQUFJLE1BQU07UUFDeEIsTUFBTSxHQUFHLEVBQUUsRUFBTyxNQUFNO1FBQ3hCLFlBQVksQ0FBQyxDQUFHLGVBQWU7UUFFbkMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBLG9CQUFvQjtRQUVwRSxHQUFHO1lBQ0MsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0Isb0dBQW9HO1lBRXBHLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckQsS0FBSyxJQUFJLENBQUMsSUFB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QUFDO0FBQUQsQ0F4SEEsQUF3SEMsSUFBQTtBQXhIWSxrQ0FBVyIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBAQXV0aG9yOiBneXdcbiAqIEBEYXRlOiAyMDE5LTA5LTA5IFxuICogQERlc2M6IEEq5a+76LevXG4gKiB0aWxlbWFw5LiT55SoXG4gKi9cblxuXG5leHBvcnQgY2xhc3MgQVN0YXJIZWxwZXIge1xuICAgIC8v5YW25Lit55qETUFQLmFycuaYr+S6jOe7tOaVsOe7hFxuICAgIHB1YmxpYyBzdGF0aWMgc2VhcmNoUm9hZChtYXA6IGNjLlRpbGVkTGF5ZXIsIHN0YXJ0X3g6IG51bWJlciwgc3RhcnRfeTogbnVtYmVyLCBlbmRfeDogbnVtYmVyLCBlbmRfeTogbnVtYmVyLCBjb2xsaWRlclRpbGVzPzogYW55W10pIHtcbiAgICAgICAgaWYgKHN0YXJ0X3ggPT0gZW5kX3ggJiYgc3RhcnRfeSA9PSBlbmRfeSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBsYXllclNpemUgPSBtYXAuZ2V0TGF5ZXJTaXplKCk7XG4gICAgICAgIGxldCByb3dzID0gbGF5ZXJTaXplLndpZHRoOyAgICAvL+ihjFxuICAgICAgICBsZXQgY29scyA9IGxheWVyU2l6ZS5oZWlnaHQ7ICAgIC8v5YiXXG4gICAgICAgIC8vIGxldCByb3dzID0gUGF0aE1nci5nZXRJbnN0YW5jZSgpLm1hcEpzb24ubGVuZ3RoOyAgICAvL+ihjFxuICAgICAgICAvLyBsZXQgY29scyA9IFBhdGhNZ3IuZ2V0SW5zdGFuY2UoKS5tYXBKc29uWzBdLmxlbmd0aDsgICAgLy/liJdcbiAgICAgICAgdmFyIG9wZW5MaXN0ID0gW10sICAgIC8v5byA5ZCv5YiX6KGoXG4gICAgICAgICAgICBjbG9zZUxpc3QgPSBbXSwgICAvL+WFs+mXreWIl+ihqFxuICAgICAgICAgICAgcmVzdWx0ID0gW10sICAgICAgLy/nu5PmnpzmlbDnu4RcbiAgICAgICAgICAgIHJlc3VsdF9pbmRleDsgICAvL+e7k+aenOaVsOe7hOWcqOW8gOWQr+WIl+ihqOS4reeahOW6j+WPt1xuXG4gICAgICAgIG9wZW5MaXN0LnB1c2goeyB4OiBzdGFydF94LCB5OiBzdGFydF95LCBHOiAwIH0pOy8v5oqK5b2T5YmN54K55Yqg5YWl5Yiw5byA5ZCv5YiX6KGo5Lit77yM5bm25LiUR+aYrzBcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFBvaW50ID0gb3Blbkxpc3QucG9wKCk7XG4gICAgICAgICAgICBjbG9zZUxpc3QucHVzaChjdXJyZW50UG9pbnQpO1xuICAgICAgICAgICAgLy8gaWYgKE1hdGguYWJzKGN1cnJlbnRQb2ludC54IC0gc3RhcnRfeCkgPiAxMCB8fCBNYXRoLmFicyhjdXJyZW50UG9pbnQueSAtIHN0YXJ0X3kpID4gMTApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICB2YXIgc3Vycm91bmRQb2ludCA9IHRoaXMuU3Vycm91bmRQb2ludChjdXJyZW50UG9pbnQpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBzdXJyb3VuZFBvaW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBzdXJyb3VuZFBvaW50W2ldOyAgICAgICAgICAgICAgICAvL+iOt+W+l+WRqOWbtOeahOWFq+S4queCuVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgaXRlbS54ID49IDAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKblnKjlnLDlm77kuIpcbiAgICAgICAgICAgICAgICAgICAgaXRlbS55ID49IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgaXRlbS54IDwgcm93cyAmJlxuICAgICAgICAgICAgICAgICAgICBpdGVtLnkgPCBjb2xzICYmXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmNoZWNrQ2VsbChtYXAsIGl0ZW0ueCwgaXRlbS55KSA9PSAwIHx8IHRoaXMuY2hlY2tDZWxsKG1hcCwgaXRlbS54LCBpdGVtLnkpID09IDY1KSAmJiAgICAgICAgIC8v5Yik5pat5piv5ZCm5piv6Zqc56KN54mpIDDku6PooajmmK/nqbrkvY1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leGlzdExpc3QoaXRlbSwgY2xvc2VMaXN0KSA9PSAtMTAwICAgICAgICAgLy/liKTmlq3mmK/lkKblnKjlhbPpl63liJfooajkuK1cbiAgICAgICAgICAgICAgICAgICAgJiYgKCFjb2xsaWRlclRpbGVzIHx8ICFjb2xsaWRlclRpbGVzW2l0ZW0ueF0gfHwgIWNvbGxpZGVyVGlsZXNbaXRlbS54XVtpdGVtLnldKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvL2cg5Yiw54i26IqC54K555qE5L2N572uXG4gICAgICAgICAgICAgICAgICAgIC8v5aaC5p6c5piv5LiK5LiL5bem5Y+z5L2N572u55qE5YiZZ+etieS6jjEw77yM5pac5a+56KeS55qE5bCx5pivMTRcbiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBjdXJyZW50UG9pbnQuRyArICgoY3VycmVudFBvaW50LnggLSBpdGVtLngpICogKGN1cnJlbnRQb2ludC55IC0gaXRlbS55KSA9PSAwID8gMTAgOiAxNCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4aXN0TGlzdChpdGVtLCBvcGVuTGlzdCkgPT0gLTEwMCkgeyAgICAgICAvL+WmguaenOS4jeWcqOW8gOWQr+WIl+ihqOS4rVxuICAgICAgICAgICAgICAgICAgICAgICAgLy/orqHnrpdI77yM6YCa6L+H5rC05bmz5ZKM5Z6C55u06Led56a76L+b6KGM56Gu5a6aXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtWydIJ10gPSBNYXRoLmFicyhlbmRfeCAtIGl0ZW0ueCkgKiAxMCArIE1hdGguYWJzKGVuZF95IC0gaXRlbS55KSAqIDEwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVsnRyddID0gZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bJ0YnXSA9IGl0ZW1bJ0gnXSArIGl0ZW1bJ0cnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bJ3BhcmVudCddID0gY3VycmVudFBvaW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgb3Blbkxpc3QucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZjlnKjlnKjlvIDlkK/liJfooajkuK3vvIzmr5TovoPnm67liY3nmoRn5YC85ZKM5LmL5YmN55qEZ+eahOWkp+Wwj1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5leGlzdExpc3QoaXRlbSwgb3Blbkxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy/lpoLmnpzlvZPliY3ngrnnmoRn5pu05bCPXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyA8IG9wZW5MaXN0W2luZGV4XS5HKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbkxpc3RbaW5kZXhdLnBhcmVudCA9IGN1cnJlbnRQb2ludDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuTGlzdFtpbmRleF0uRyA9IGc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbkxpc3RbaW5kZXhdLkYgPSBnICsgb3Blbkxpc3RbaW5kZXhdLkg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v5aaC5p6c5byA5ZCv5YiX6KGo56m65LqG77yM5rKh5pyJ6YCa6Lev77yM57uT5p6c5Li656m6XG4gICAgICAgICAgICBpZiAob3Blbkxpc3QubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wZW5MaXN0LnNvcnQodGhpcy5zb3J0Rik7Ly/ov5nkuIDmraXmmK/kuLrkuoblvqrnjq/lm57ljrvnmoTml7blgJnvvIzmib7lh7ogRiDlgLzmnIDlsI/nmoQsIOWwhuWug+S7jiBcIuW8gOWQr+WIl+ihqFwiIOS4reenu+aOiVxuICAgICAgICB9IHdoaWxlICgocmVzdWx0X2luZGV4ID0gdGhpcy5leGlzdExpc3QoeyB4OiBlbmRfeCwgeTogZW5kX3kgfSwgb3Blbkxpc3QpKSA9PSAtMTAwKTtcblxuICAgICAgICAvL+WIpOaWree7k+aenOWIl+ihqOaYr+WQpuS4uuepulxuICAgICAgICBpZiAocmVzdWx0X2luZGV4ID09IC0xMDAgfHwgcmVzdWx0X2luZGV4ID09IHZvaWQgMCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudE9iaiA9IG9wZW5MaXN0W3Jlc3VsdF9pbmRleF07XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgLy/miorot6/lirLoioLngrnmt7vliqDliLByZXN1bHTlvZPkuK1cbiAgICAgICAgICAgICAgICByZXN1bHQudW5zaGlmdCh7XG4gICAgICAgICAgICAgICAgICAgIHg6IGN1cnJlbnRPYmoueCxcbiAgICAgICAgICAgICAgICAgICAgeTogY3VycmVudE9iai55XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY3VycmVudE9iaiA9IGN1cnJlbnRPYmoucGFyZW50O1xuICAgICAgICAgICAgfSB3aGlsZSAoY3VycmVudE9iai54ICE9IHN0YXJ0X3ggfHwgY3VycmVudE9iai55ICE9IHN0YXJ0X3kpO1xuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIH1cbiAgICAvL+eUqEblgLzlr7nmlbDnu4TmjpLluo9cbiAgICBwcml2YXRlIHN0YXRpYyBzb3J0RihhLCBiKSB7XG4gICAgICAgIHJldHVybiBiLkYgLSBhLkY7XG4gICAgfVxuICAgIC8v6I635Y+W5ZGo5Zu05YWr5Liq54K555qE5YC8XG4gICAgcHVibGljIHN0YXRpYyBTdXJyb3VuZFBvaW50KGN1clBvaW50KSB7XG4gICAgICAgIHZhciB4ID0gY3VyUG9pbnQueCwgeSA9IGN1clBvaW50Lnk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IHg6IHggLSAxLCB5OiB5IC0gMSB9LFxuICAgICAgICAgICAgeyB4OiB4LCB5OiB5IC0gMSB9LFxuICAgICAgICAgICAgeyB4OiB4ICsgMSwgeTogeSAtIDEgfSxcbiAgICAgICAgICAgIHsgeDogeCArIDEsIHk6IHkgfSxcbiAgICAgICAgICAgIHsgeDogeCArIDEsIHk6IHkgKyAxIH0sXG4gICAgICAgICAgICB7IHg6IHgsIHk6IHkgKyAxIH0sXG4gICAgICAgICAgICB7IHg6IHggLSAxLCB5OiB5ICsgMSB9LFxuICAgICAgICAgICAgeyB4OiB4IC0gMSwgeTogeSB9XG4gICAgICAgIF1cbiAgICB9XG4gICAgLy/liKTmlq3ngrnmmK/lkKblrZjlnKjlnKjliJfooajkuK3vvIzmmK/nmoTor53ov5Tlm57nmoTmmK/luo/liJflj7dcbiAgICBwcml2YXRlIHN0YXRpYyBleGlzdExpc3QocG9pbnQsIGxpc3QpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBsaXN0KSB7XG4gICAgICAgICAgICBpZiAocG9pbnQueCA9PSBsaXN0W2ldLnggJiYgcG9pbnQueSA9PSBsaXN0W2ldLnkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTEwMDtcbiAgICB9XG5cbiAgICAvL+ajgOa1i+WNleWFg+agvOaYr+WQpuaYr+manOeijeeJqVxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tDZWxsKG1hcExheWVyOiBjYy5UaWxlZExheWVyLCB4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgICAgICBsZXQgcmVzID0gbWFwTGF5ZXIuZ2V0VGlsZUdJREF0KHgsIHkpO1xuICAgICAgICAvLyBsZXQgcmVzICA9ICBQYXRoTWdyLmdldEluc3RhbmNlKCkubWFwSnNvblt4XVt5XTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cblxuXG5cbn0iXX0=