예제 #1
0
        /// <summary>
        /// 路径搜寻
        /// </summary>
        /// <returns></returns>
        private bool Search()
        {
            if (_endNode.moveable == false)
            {
                return(false);
            }
            HexNode node = _startNode;

            node.version = _currentVersion;

            float g;
            float h;
            float f;

            while (node != _endNode)
            {
                for (int i = 0; i < 6; i++)
                {
                    HexNode testNode = _grid.GetNode(node.hex.GetNeighbor(i));
                    if (testNode == null || testNode.moveable == false)
                    {
                        continue;
                    }
                    g = node.g + 1;
                    h = _heuristic(testNode, _endNode);
                    f = g + h;
                    if (testNode.version == _currentVersion)
                    {
                        if (testNode.f > f)
                        {
                            testNode.f      = f;
                            testNode.g      = g;
                            testNode.h      = h;
                            testNode.parent = node;
                        }
                    }
                    else
                    {
                        testNode.f       = f;
                        testNode.g       = g;
                        testNode.h       = h;
                        testNode.parent  = node;
                        testNode.version = _currentVersion;
                        _open.Insert(testNode);
                    }
                }

                if (_open.isEmpty)
                {
                    return(false);
                }

                node = _open.Pop();
            }

            BuildPath();
            return(true);
        }
예제 #2
0
        /// <summary>
        /// 创建路径
        /// </summary>
        private void BuildPath()
        {
            HexNode node = _endNode;

            _path.Clear();
            _path.Add(node);
            while (node != _startNode)
            {
                node = node.parent;
                _path.Insert(0, node);
            }
        }
예제 #3
0
        /// <summary>
        /// 寻路
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        public List <HexNode> Find(Hex start, Hex end)
        {
            _grid.SetStartNode(start);
            _grid.SetEndNode(end);
            _startNode = _grid.startNode;
            _endNode   = _grid.endNode;
            if (_startNode == null || _endNode == null || !_endNode.moveable)
            {
                return(null);
            }

            if (FindPath())
            {
                return(_path);
            }

            return(null);
        }
예제 #4
0
 /// <summary>
 /// 几何估价法(Euclidian heuristic)
 /// 计算出两点之间的直线距离,本质公式为勾股定理A²+B²=C²。
 /// </summary>
 /// <param name="startNode"></param>
 /// <param name="endNode"></param>
 /// <returns></returns>
 public static float Euclidian(HexNode startNode, HexNode endNode)
 {
     return(endNode.hex.GetDistance(startNode.hex));
 }
예제 #5
0
 /// <summary>
 /// 节点对比
 /// </summary>
 /// <param name="x"></param>
 /// <param name="y"></param>
 /// <returns></returns>
 private bool NodeComparison(HexNode x, HexNode y)
 {
     return(x.f < y.f);
 }
예제 #6
0
 /// <summary>
 /// 销毁对象池对象
 /// </summary>
 public void OnPoolDispose()
 {
     parent = null;
 }
예제 #7
0
파일: HexGrid.cs 프로젝트: goodGsger/EraPro
 /// <summary>
 /// 设置起始节点
 /// </summary>
 /// <param name="node"></param>
 public void SetStartNode(HexNode node)
 {
     _startNode = node;
 }
예제 #8
0
 /// <summary>
 /// 重置对象池对象
 /// </summary>
 public void OnPoolReset()
 {
     parent = null;
 }
예제 #9
0
파일: HexGrid.cs 프로젝트: goodGsger/EraPro
 /// <summary>
 /// 添加节点
 /// </summary>
 /// <param name="hex"></param>
 /// <param name="moveable"></param>
 public void AddNode(Hex hex, bool moveable)
 {
     _nodes[hex] = new HexNode(hex, moveable);
 }
예제 #10
0
파일: HexGrid.cs 프로젝트: goodGsger/EraPro
 /// <summary>
 ///
 /// </summary>
 public void Clear()
 {
     _startNode = null;
     _endNode   = null;
     _nodes.Clear();
 }
예제 #11
0
파일: HexGrid.cs 프로젝트: goodGsger/EraPro
 /// <summary>
 /// 设置结束节点
 /// </summary>
 /// <param name="hex"></param>
 public void SetEndNode(Hex hex)
 {
     _endNode = GetNode(hex);
 }
예제 #12
0
파일: HexGrid.cs 프로젝트: goodGsger/EraPro
 /// <summary>
 /// 设置结束节点
 /// </summary>
 /// <param name="node"></param>
 public void SetEndNode(HexNode node)
 {
     _endNode = node;
 }
예제 #13
0
파일: HexGrid.cs 프로젝트: goodGsger/EraPro
 /// <summary>
 /// 设置起始节点
 /// </summary>
 /// <param name="hex"></param>
 public void SetStartNode(Hex hex)
 {
     _startNode = GetNode(hex);
 }