public void CalculateCost(Node_script parent, Node_script goal, int gCost)
 {
     this.Parent = parent;
     this.G      = (parent.G + gCost);
     this.H      = (Mathf.Abs((this.Position.Column - goal.Position.Column) + (this.Position.Row - goal.Position.Row)) * 10);
     this.F      = (this.G + this.H);
 }
Ejemplo n.º 2
0
    private void VisualizeParent(Node_script node, Vector2 worldPosition)
    {
        if (node.Parent != null)
        {
            GameObject arrow = Instantiate(this._arrowPrefab, worldPosition, Quaternion.identity);

            arrow.transform.SetParent(this.transform);

            // RIGHT
            if ((node.Position.Column < node.Parent.Position.Column) && (node.Position.Row == node.Parent.Position.Row))
            {
                arrow.transform.eulerAngles = new Vector3(0, 0, 0);
                // RIGHT-DOWN
            }
            else if ((node.Position.Column < node.Parent.Position.Column) && (node.Position.Row < node.Parent.Position.Row))
            {
                arrow.transform.eulerAngles = new Vector3(0, 0, -45);
                // RIGHT-UP
            }
            else if ((node.Position.Column < node.Parent.Position.Column) && (node.Position.Row > node.Parent.Position.Row))
            {
                arrow.transform.eulerAngles = new Vector3(0, 0, 45);
                // LEFT
            }
            else if ((node.Position.Column > node.Parent.Position.Column) && (node.Position.Row == node.Parent.Position.Row))
            {
                arrow.transform.eulerAngles = new Vector3(0, 0, 180);
                // LEFT-DOWN
            }
            else if ((node.Position.Column > node.Parent.Position.Column) && (node.Position.Row < node.Parent.Position.Row))
            {
                arrow.transform.eulerAngles = new Vector3(0, 0, -135);
                // LEFT-UP
            }
            else if ((node.Position.Column > node.Parent.Position.Column) && (node.Position.Row > node.Parent.Position.Row))
            {
                arrow.transform.eulerAngles = new Vector3(0, 0, 135);
                // DOWN
            }
            else if ((node.Position.Column == node.Parent.Position.Column) && (node.Position.Row < node.Parent.Position.Row))
            {
                arrow.transform.eulerAngles = new Vector3(0, 0, -90);
                // UP
            }
            else if ((node.Position.Column == node.Parent.Position.Column) && (node.Position.Row > node.Parent.Position.Row))
            {
                arrow.transform.eulerAngles = new Vector3(0, 0, 90);
            }

            _arrows.Add(arrow);
        }
    }
    private static bool IsMoveAllowed(Node_script currentNode, Node_script neighbor)
    {
        GridPosition_script direction = (neighbor.Position - currentNode.Position);
        GridPosition_script first     = new GridPosition_script(currentNode.Position.Row, (currentNode.Position.Column + direction.Column));
        GridPosition_script second    = new GridPosition_script((currentNode.Position.Row + direction.Row), currentNode.Position.Column);

        if (TileMap_script.Instance.IsWithinBounds(first) && !TileMap_script.Instance.Tiles[first].IsWalkable)
        {
            return(false);
        }

        if (TileMap_script.Instance.IsWithinBounds(second) && !TileMap_script.Instance.Tiles[second].IsWalkable)
        {
            return(false);
        }

        return(true);
    }
    public static Stack <Node_script> GetPath(GridPosition_script startPosition, GridPosition_script goalPosition)
    {
        if (_nodes == null)
        {
            CreateNodes();
        }

        int                   gCost;
        Node_script           neighbor;
        GridPosition_script   neighborPosition;
        Node_script           currentNode = _nodes[startPosition];
        Node_script           goalNode    = _nodes[goalPosition];
        HashSet <Node_script> openList    = new HashSet <Node_script>();
        HashSet <Node_script> closedList  = new HashSet <Node_script>();
        Stack <Node_script>   path        = new Stack <Node_script>();

        openList.Add(currentNode);

        while (openList.Count > 0)
        {
            // GET THE NODE WITH THE LOWEST F COST
            currentNode = openList.OrderBy(n => n.F).First();

            // GOAL REACHED
            if (currentNode == goalNode)
            {
                // RECONSTRUCT PATH BY BACKTRACING PARENTS
                path.Push(currentNode);

                while (currentNode.Parent != null)
                {
                    currentNode = currentNode.Parent;
                    path.Push(currentNode);
                }

                break;
            }

            // COSE CURRENT
            openList.Remove(currentNode);
            closedList.Add(currentNode);

            // OPEN NEIGHBORS
            for (int row = -1; row <= 1; row++)
            {
                for (int column = -1; column <= 1; column++)
                {
                    neighborPosition = new GridPosition_script(currentNode.Position.Row - row, currentNode.Position.Column - column);

                    // SKIP OUT-OF-BOUNDS, UNWALKABLES AND CURRENT NODE
                    if (TileMap_script.Instance.IsWithinBounds(neighborPosition) &&
                        (TileMap_script.Instance.Tiles[neighborPosition].IsWalkable) && (neighborPosition != currentNode.Position))
                    {
                        neighbor = _nodes[neighborPosition];

                        // SKIP CLOSED NODE
                        if (closedList.Contains(neighbor))
                        {
                            continue;
                        }

                        // HORIZONTAL/VERTICAL
                        if (Mathf.Abs(column - row) == 1)
                        {
                            gCost = 10;
                            // DIAGONAL
                        }
                        else
                        {
                            if (!IsMoveAllowed(currentNode, neighbor))
                            {
                                continue;
                            }
                            gCost = 14;
                        }

                        // NEW/UNVISITED
                        if (!openList.Contains(neighbor))
                        {
                            openList.Add(neighbor);
                            // SKIP IF NOT BETTER
                        }
                        else if ((currentNode.G + gCost) >= neighbor.G)
                        {
                            continue;
                        }

                        // UPDATE COST
                        neighbor.CalculateCost(currentNode, goalNode, gCost);
                    }
                }
            }
        }

        _nodes.Clear();
        _nodes = null;

        //// VIZUALIZE OPEN LIST
        //GameObject.Find("AstarTest_object").GetComponent<AstarTest_script>().Visualize(openList,   Color.yellow);
        //GameObject.Find("AstarTest_object").GetComponent<AstarTest_script>().Visualize(closedList, Color.cyan);
        //GameObject.Find("AstarTest_object").GetComponent<AstarTest_script>().Visualize(path,       Color.blue);

        return(path);
    }
Ejemplo n.º 5
0
 public void Visualize(Node_script node, Color color)
 {
     node.TileScript.SpriteRenderer.color = color;
 }