Ejemplo n.º 1
0
        Path traceBack(Vector3 a, Vector3 b, pNode node)
        {
            List <Vector3> p = new List <Vector3>();

            p.Add(b);
            while (node.prev != null)
            {
                p.Add(surface.Graph[node.index].Position);
                node = node.prev;
            }
            p.Reverse();
            return(new Path(p.ToArray()));
        }
Ejemplo n.º 2
0
    void CreateGrid()
    {
        for (int i = 0; i < nodeRows; i++)
        {
            for (int j = 0; j < nodeCols; j++)
            {
                int offSet = 0;
                if (j % 2 != 0)
                {
                    //offSet = 1;
                }
                nodes[i, j]             = new pNode();
                nodes[i, j].connections = new bool[8];

                nodes[i, j].obj = Instantiate(nodePublic, new Vector3(2 * i + offSet - 12, 1 * j - 7, 1), Quaternion.identity);
                nodes[i, j].X   = i;
                nodes[i, j].Y   = j;
                //nodes[i, j].connectedNodes = new pNode[8];
                nodes[i, j].removed = false;
            }
        }

        for (int i = 1; i < nodeRows - 1; i++)
        {
            for (int j = 1; j < nodeCols - 1; j++)
            {
                //nodes[i, j].connectedNodes[0] = nodes[i, j + 1];
                //nodes[i, j].connectedNodes[1] = nodes[i + 1, j + 1];
                //nodes[i, j].connectedNodes[2] = nodes[i + 1, j];
                //nodes[i, j].connectedNodes[3] = nodes[i + 1, j - 1];
                //nodes[i, j].connectedNodes[4] = nodes[i, j - 1];
                //nodes[i, j].connectedNodes[5] = nodes[i - 1, j - 1];
                //nodes[i, j].connectedNodes[6] = nodes[i - 1, j];
                //nodes[i, j].connectedNodes[7] = nodes[i - 1, j + 1];
            }
        }
    }
Ejemplo n.º 3
0
 public pNode(pNode prev, int index)
 {
     this.prev  = prev;
     this.index = index;
 }
Ejemplo n.º 4
0
    List <Vector3> CalculatePath(Vector3 playerPos, Vector3 targetPos)
    {
        List <pNode> openList   = new List <pNode>();
        List <pNode> closedList = new List <pNode>();

        int g = 0;

        pNode startNode;
        bool  startFound  = false;
        bool  targetFound = false;
        int   nodesDone   = 0;

        for (int i = 0; i < nodeRows; i++)
        {
            for (int j = 0; j < nodeCols; j++)
            {
                //Debug.Log((nodes[i, j].obj.transform.position - playerPos).magnitude);
                if ((nodes[i, j].obj.transform.position - playerPos).magnitude < minDist && !startFound)
                {
                    Debug.Log("Found start node");
                    startFound = true;
                    startNode  = nodes[i, j];
                    openList.Add(nodes[i, j]);
                    nodesDone++;
                }
                if ((nodes[i, j].obj.transform.position - targetPos).magnitude < minDist && !targetFound)
                {
                    Debug.Log("Found target node");
                    targetFound = true;
                    targetNode  = nodes[i, j];
                    //openList.Add(nodes[i, j]);

                    nodesDone++;
                }
                if (nodesDone >= 2)
                {
                    i = nodeRows;
                    break;
                }
            }
        }

        while (openList.Count > 0)
        {
            int   lowF    = 50000;       // random large number
            pNode current = new pNode(); //node with lowest F
            foreach (pNode n in openList)
            {
                if (n.F < lowF)
                {
                    lowF    = n.F;
                    current = n;
                }

                closedList.Add(current);
                openList.Remove(current);
                List <pNode> adj = GetWalkableNodes(current.X, current.Y);
                g++;
                for (int i = 0; i < adj.Count; i++)
                {
                    if (closedList.Contains(adj[i]))
                    {
                        continue;
                    }
                    else if (!openList.Contains(adj[i]))
                    {
                        adj[i].G = g;
                        adj[i].H = CalculateHScore(adj[i].X,
                                                   adj[i].Y, targetNode.X, targetNode.Y);
                        adj[i].F      = adj[i].G + adj[i].H;
                        adj[i].parent = current;
                    }
                    else
                    {
                        // test if using the current G score makes the adjacent square's F score
                        // lower, if yes update the parent because it means it's a better path
                        if (g + adj[i].H < adj[i].F)
                        {
                            adj[i].G = g;
                            adj[i].H = CalculateHScore(adj[i].X,
                                                       adj[i].Y, targetNode.X, targetNode.Y);
                            adj[i].F      = adj[i].G + adj[i].H;
                            adj[i].parent = current;
                        }
                    }
                }

                if (closedList[closedList.Count - 1].obj == targetNode.obj)
                {
                    List <Vector3> pathlist = new List <Vector3>();
                    foreach (pNode p in openList)
                    {
                        pathlist.Add(p.obj.transform.position);
                    }

                    return(pathlist);
                }
            }
        }

        Debug.Log("Dont show this message");

        return(null);
    }