/// <summary> /// 搜索路径 /// </summary> private bool SearchBaseBinaryHeap(SimpleAStarNode startNode, SimpleAStarNode endNode, int nowCheckNum) { /**已进入关闭列表(从openList中移除即进入关闭列表)*/ int STATUS_CLOSED = nowCheckNum + 1; mBinaryHeapUtils.Reset(); startNode.g = 0; startNode.f = startNode.g + mAStarHeuristic.Heuristic(startNode.mNodeX, startNode.mNodeY, endNode.mNodeX, endNode.mNodeY); startNode.mSearchPathCheckNum = STATUS_CLOSED; int g = 0; SimpleAStarNode node = startNode; SimpleAStarNode tmpNode = null; while (node != endNode) { IList <SimpleAStarLinkNode> linkNodes = node.mLinks; for (int i = 0; i < linkNodes.Count; ++i) { tmpNode = linkNodes[i].mNode; if (tmpNode == null) { continue; } g = node.g + linkNodes[i].mCost; // 如果已被检查过 if (tmpNode.mSearchPathCheckNum >= nowCheckNum) { if (tmpNode.g > g) { tmpNode.f = g + mAStarHeuristic.Heuristic(tmpNode.mNodeX, tmpNode.mNodeY, endNode.mNodeX, endNode.mNodeY); tmpNode.g = g; tmpNode.mParentNode = node; if (tmpNode.mSearchPathCheckNum == nowCheckNum) { mBinaryHeapUtils.ModifyNode(tmpNode.mBinaryHeapNode); } } } else { tmpNode.f = g + mAStarHeuristic.Heuristic(tmpNode.mNodeX, tmpNode.mNodeY, endNode.mNodeX, endNode.mNodeY); tmpNode.g = g; tmpNode.mParentNode = node; tmpNode.mBinaryHeapNode = mBinaryHeapUtils.InsertNode(tmpNode); tmpNode.mSearchPathCheckNum = nowCheckNum; } } if (mBinaryHeapUtils.headNode != null) { node = mBinaryHeapUtils.PopNode(); node.mSearchPathCheckNum = STATUS_CLOSED; } else { return(false); } } return(true); }