Example #1
0
    public static List <Grid.Position> FindPath(Tile[,] tiles, Grid.Position fromPosition, Grid.Position toPosition)
    {
        var path = new List <Grid.Position>();

        path.Add(fromPosition);
        while (fromPosition.x != toPosition.x || fromPosition.y != toPosition.y)
        {
            if (fromPosition.x < toPosition.x)
            {
                fromPosition.x += 1;
            }

            else if (fromPosition.x > toPosition.x)
            {
                fromPosition.x -= 1;
            }

            if (fromPosition.y < toPosition.y)
            {
                fromPosition.y += 1;
            }

            else if (fromPosition.y > toPosition.y)
            {
                fromPosition.y -= 1;
            }

            path.Add(fromPosition);
        }

        path.Add(toPosition);
        return(path);
    }
Example #2
0
    public static List <Grid.Position> FindPath(Tile[,] tiles, Grid.Position fromPosition, Grid.Position toPosition)
    {
        var path = new List <Grid.Position>();

        path.Add(fromPosition);
        Grid.Position posi = fromPosition;

        while (posi.x != toPosition.x || posi.y != toPosition.y)
        {
            if (posi.x < toPosition.x)
            {
                posi.x++;
            }
            else if (posi.x > toPosition.x)
            {
                posi.x--;
            }

            if (posi.y < toPosition.y)
            {
                posi.y++;
            }
            else if (posi.y > toPosition.y)
            {
                posi.y--;
            }

            path.Add(posi);
        }

        path.Add(toPosition);
        return(path);
    }
Example #3
0
    private static PathNode BreadthFirstSearch(Tile[,] tiles, Grid.Position fromPosition, Grid.Position toPosition)
    {
        HashSet <PathNode> nodes = new HashSet <PathNode>();
        var queue = new Queue <PathNode>();

        var root = new PathNode(fromPosition, null);

        nodes.Add(root);
        queue.Enqueue(root);

        while (queue.Count > 0)
        {
            PathNode node = queue.Dequeue();
            if (node.position.x == toPosition.x && node.position.y == toPosition.y)
            {
                Debug.Log("ACHEI O CARA");
                return(node);
            }
            else
            {
                TryEnqueueNode(tiles, queue, nodes, node, new Grid.Position(node.position.x + 1, node.position.y));
                TryEnqueueNode(tiles, queue, nodes, node, new Grid.Position(node.position.x - 1, node.position.y));
                TryEnqueueNode(tiles, queue, nodes, node, new Grid.Position(node.position.x, node.position.y + 1));
                TryEnqueueNode(tiles, queue, nodes, node, new Grid.Position(node.position.x, node.position.y - 1));
            }
        }
        return(null);
    }
Example #4
0
    public static List <Grid.Position> FindPath(Tile[,] tiles, Grid.Position fromPosition, Grid.Position toPosition)
    {
        PathNode node = BreadthFirstSearch(tiles, fromPosition, toPosition);
        var      path = new List <Grid.Position>();

        path.Reverse();
        return(path);
    }
    public static List <Grid.Position> FindPath(Tile[,] tiles, Grid.Position fromPos, Grid.Position toPosition)
    {
        Queue <Grid.Position>   queue      = new Queue <Grid.Position>();
        HashSet <Grid.Position> path       = new HashSet <Grid.Position>();
        List <Grid.Position>    returnPath = new List <Grid.Position>();

        Grid.Position[,] Tiles      = new Grid.Position[tiles.GetLength(0), tiles.GetLength(1)];
        Tiles[fromPos.x, fromPos.y] = fromPos;
        queue.Enqueue(fromPos);

        while (queue.Count > 0)
        {
            Grid.Position posDequeued = queue.Dequeue();
            if (posDequeued.Equals(toPosition))
            {
                returnPath.Add(posDequeued);
                while (posDequeued.x != fromPos.x || posDequeued.y != fromPos.y)
                {
                    posDequeued = Tiles[posDequeued.x, posDequeued.y];
                    returnPath.Add(posDequeued);
                }
                returnPath.Reverse();
                break;
            }
            else
            {
                if (Tile.InsideGrid(new Grid.Position(posDequeued.x, posDequeued.y + 1), tiles) &&
                    !path.Contains(new Grid.Position(posDequeued.x, posDequeued.y + 1)))
                {
                    queue.Enqueue(new Grid.Position(posDequeued.x, posDequeued.y + 1));
                    path.Add(posDequeued);
                    Tiles[posDequeued.x, posDequeued.y + 1] = posDequeued;
                }
                if (Tile.InsideGrid(new Grid.Position(posDequeued.x, posDequeued.y - 1), tiles) &&
                    !path.Contains(new Grid.Position(posDequeued.x, posDequeued.y - 1)))
                {
                    queue.Enqueue(new Grid.Position(posDequeued.x, posDequeued.y - 1));
                    path.Add(posDequeued);
                    Tiles[posDequeued.x, posDequeued.y - 1] = posDequeued;
                }
                if (Tile.InsideGrid(new Grid.Position(posDequeued.x + 1, posDequeued.y), tiles) &&
                    !path.Contains(new Grid.Position(posDequeued.x + 1, posDequeued.y)))
                {
                    queue.Enqueue(new Grid.Position(posDequeued.x + 1, posDequeued.y));
                    path.Add(posDequeued);
                    Tiles[posDequeued.x + 1, posDequeued.y] = posDequeued;
                }
                if (Tile.InsideGrid(new Grid.Position(posDequeued.x - 1, posDequeued.y), tiles) &&
                    !path.Contains(new Grid.Position(posDequeued.x - 1, posDequeued.y)))
                {
                    queue.Enqueue(new Grid.Position(posDequeued.x - 1, posDequeued.y));
                    path.Add(posDequeued);
                    Tiles[posDequeued.x - 1, posDequeued.y] = posDequeued;
                }
            }
        }
        return(returnPath);
    }
 IEnumerator IgoToPosition(List <Grid.Position> path, Vector3 tileSpacing)
 {
     foreach (Grid.Position p in path)
     {
         position = p;
         transform.localPosition = p.ToWorldPosition(tileSpacing, 1.0f);
         yield return(new WaitForSeconds(0.1f));
     }
 }
Example #7
0
 public override bool Equals(object pos)
 {
     if (!(pos is Grid.Position))
     {
         return(false);
     }
     Grid.Position position = (Grid.Position)pos;
     return(position.x == this.x && position.y == this.y);
 }
Example #8
0
        private static void Solve(Grid.Grid grid, GridWalker.GridSolver solver)
        {
            int height;
            int width;
            var position = new Grid.Position(grid);

            solver.Solve(position, out height, out width);
            Console.WriteLine("Solved [{0}x{1}] using {2} with {3} wall checks, {4} steps, and {5} turns", height, width, solver.GetType()
                              , position.WallChecksMade, position.StepsTaken, position.TurnsMade);
        }
 public static bool InsideGrid(Grid.Position pos, Tile[,] tiles)
 {
     if (pos.x < 0 || pos.x >= tiles.GetLength(0) || pos.y < 0 || pos.y >= tiles.GetLength(1) || tiles[pos.x, pos.y].isWall)
     {
         return(false);
     }
     else
     {
         return(true);
     }
 }
Example #10
0
 public static bool IsinTile(Grid.Position posi, Tile[,] tiles)
 {
     if (posi.x >= 0 && posi.x < tiles.GetLength(0) && posi.y >= 0 && posi.y < tiles.GetLength(1) && !tiles[posi.x, posi.y].isWall)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Example #11
0
    public static List <Grid.Position> FindPath(Tile[,] tiles, Grid.Position fromPosition, Grid.Position toPosition)
    {
        PathNode node = BreadthFirstSearch(tiles, fromPosition, toPosition);
        var      path = new List <Grid.Position>();

        while (node != null)
        {
            path.Add(node.position);
            node = node.parent;
        }

        path.Reverse();
        return(path);
    }
Example #12
0
    public IEnumerator Walk(List <Grid.Position> positionsToWalk, Vector2 spacing)
    {
        Ismoving = true;
        for (int i = 1; i < positionsToWalk.Count; i++)
        {
            while (Vector3.Distance(transform.position, positionsToWalk[i].ToWorldPosition(spacing, 1f)) > 0.1f)
            {
                transform.position = Vector3.MoveTowards(transform.position, positionsToWalk[i].ToWorldPosition(spacing, 1f), 5 * Time.deltaTime);
                yield return(new WaitForSeconds(Time.deltaTime));

                Debug.Log("AQui");
            }
        }
        position = positionsToWalk[positionsToWalk.Count - 1];
        Ismoving = false;
    }
Example #13
0
    public static List <Grid.Position> FindPath(Tile[,] tiles, Grid.Position fromPosition, Grid.Position toPosition)
    {
        var GridPosition = new Grid.Position();
        var path         = new List <Grid.Position>();

        GridPosition == fromPosition.x;
        path.Add(fromPosition);
        path.Add(toPosition);
        while (GridPosition < toPosition.x)
        {
            GridPosition++;
        }


        return(path);
    }
Example #14
0
    public void MoveTo(Position targetPosition)
    {
        if (!player.Ismoving)
        {
            foreach (Tile tile in tiles)
            {
                tile.Highlight(false);
            }

            if (tiles[targetPosition.x, targetPosition.y].isWall)
            {
                Debug.Log("é uma parede");
                if (!tiles[targetPosition.x - 1, targetPosition.y].isWall)
                {
                    targetPosition = new Grid.Position {
                        x = targetPosition.x - 1, y = targetPosition.y
                    };
                }
                else if (!tiles[targetPosition.x + 1, targetPosition.y].isWall)
                {
                    targetPosition = new Grid.Position {
                        x = targetPosition.x + 1, y = targetPosition.y
                    };
                }
                else if (!tiles[targetPosition.x, targetPosition.y + 1].isWall)
                {
                    targetPosition = new Grid.Position {
                        x = targetPosition.x, y = targetPosition.y + 1
                    };
                }
                else if (!tiles[targetPosition.x, targetPosition.y - 1].isWall)
                {
                    targetPosition = new Grid.Position {
                        x = targetPosition.x, y = targetPosition.y - 1
                    };
                }
            }
            List <Position> path = PathFinder.FindPath(tiles, player.position, targetPosition, PathFinder.Method.Second);

            foreach (Position position in path)
            {
                tiles[position.x, position.y].Highlight(true);
            }

            StartCoroutine(player.Walk(path, tileSpacing));
        }
    }
Example #15
0
    public static List <Grid.Position> FindPath(Tile[,] tiles, Grid.Position fromPosition, Grid.Position toPosition)
    {
        var path = new List <Grid.Position>();
        Queue <Grid.Position> q = new Queue <Grid.Position>();

        q.Enqueue(fromPosition);
        Grid.Position[,] caminho = new Grid.Position[tiles.GetLength(0), tiles.GetLength(1)];

        var p = q.Dequeue();

        while (p.x != toPosition.x || p.y != toPosition.y)
        {
            if (p.x == toPosition.x && p.y == toPosition.y)
            {
                Debug.Log("Achei");
                break;
            }
            else
            {
                if (p.x != toPosition.x)
                {
                    if (p.x < toPosition.x)
                    {
                        p.x++;
                    }
                    else
                    {
                        p.x--;
                    }
                }
                if (p.y != toPosition.y)
                {
                    if (p.y < toPosition.y)
                    {
                        p.y++;
                    }
                    else
                    {
                        p.y--;
                    }
                }
                path.Add(p);
            }
        }
        return(path);
    }
Example #16
0
    public static List <Grid.Position> FindPath(Tile[,] tiles, Grid.Position fromPosition, Grid.Position toPosition, Method method)
    {
        var path = new List <Grid.Position>();

        path.Add(fromPosition);
        if (method == Method.First)
        {
            Grid.Position position = fromPosition;
            while (position.x != toPosition.x || position.y != toPosition.y)
            {
                if (position.x > toPosition.x)
                {
                    position.x--;
                }
                else if (position.x < toPosition.x)
                {
                    position.x++;
                }

                if (position.y > toPosition.y)
                {
                    position.y--;
                }
                else if (position.y < toPosition.y)
                {
                    position.y++;
                }

                path.Add(position);
            }
        }
        else if (method == Method.Second)
        {
            return(Search(fromPosition, toPosition, tiles));
        }

        return(path);
    }
Example #17
0
    public static List <Grid.Position> FindPath(Tile[,] tiles, Grid.Position fromPosition, Grid.Position toPosition)
    {
        int x = fromPosition.x;
        int y = fromPosition.y;
        int i;
        var path           = new List <Grid.Position>();
        var middlePosition = new Grid.Position();

        path.Add(fromPosition);
        path.Add(middlePosition);
        path.Add(toPosition);

        for (i = 0; i <= x; i++)
        {
            middlePosition.x = fromPosition.x + i;
            // Debug.Log("Valor do i " + i);
            if (i == x)
            {
                i = 0;
            }
        }

        for (i = 0; i <= y; i++)
        {
            middlePosition.y = fromPosition.y + i;
            if (i == y)
            {
                i = 0;
            }
        }

        Debug.Log("Posição inicial: " + fromPosition);
        Debug.Log("Posição final: " + toPosition);
        Debug.Log("Posição do meio: " + middlePosition);

        return(path);
    }
Example #18
0
    private static void TryEnqueueNode(Tile[,] tiles, Queue <PathNode> queue, HashSet <PathNode> nodes, PathNode currentNode, Grid.Position position)
    {
        int width  = tiles.GetLength(0);
        int height = tiles.GetLength(1);


        if (position.x > width || position.x < 0 || position.y > height || position.y < 0)
        {
            Debug.Log("Não está na grade");
            return;
        }
        else
        {
            var node = new PathNode(position, currentNode);
            nodes.Add(node);
            queue.Enqueue(node);
        }
    }
Example #19
0
    public static List <Grid.Position> FindPath(Tile[,] tiles, Grid.Position fromPosition, Grid.Position toPosition)
    {
        Queue <Grid.Position>   queue = new Queue <Grid.Position>();
        List <Grid.Position>    grid  = new List <Grid.Position>();
        HashSet <Grid.Position> path  = new HashSet <Grid.Position>();

        Grid.Position[,] Tiles = new Grid.Position[tiles.GetLength(0), tiles.GetLength(1)];
        queue.Enqueue(fromPosition);
        Tiles[fromPosition.x, fromPosition.y] = fromPosition;


        if (tiles[toPosition.x, toPosition.y].isWall)
        {
            return(new List <Grid.Position>());
            //	return Tile(tiles [toPosition.x, toPosition.y]);
        }

        while (queue.Count > 0)
        {
            Grid.Position dequeuepos = queue.Dequeue();

            if (dequeuepos.Equals(toPosition))
            {
                grid.Add(dequeuepos);
                while (dequeuepos.x != fromPosition.x || dequeuepos.y != fromPosition.y)
                {
                    dequeuepos = Tiles[dequeuepos.x, dequeuepos.y];
                    grid.Add(dequeuepos);
                }
                grid.Reverse();
                break;
            }



            else
            {
                if (Tile.InsideGrid(new Grid.Position(dequeuepos.x - 1, dequeuepos.y), tiles) && !path.Contains(new Grid.Position(dequeuepos.x - 1, dequeuepos.y)))
                {
                    queue.Enqueue(new Grid.Position(dequeuepos.x - 1, dequeuepos.y));
                    path.Add(new Grid.Position(dequeuepos.x - 1, dequeuepos.y));
                    Tiles[dequeuepos.x - 1, dequeuepos.y] = dequeuepos;
                }
                if (Tile.InsideGrid(new Grid.Position(dequeuepos.x + 1, dequeuepos.y), tiles) && !path.Contains(new Grid.Position(dequeuepos.x + 1, dequeuepos.y)))
                {
                    queue.Enqueue(new Grid.Position(dequeuepos.x + 1, dequeuepos.y));
                    path.Add(new Grid.Position(dequeuepos.x + 1, dequeuepos.y));
                    Tiles[dequeuepos.x + 1, dequeuepos.y] = dequeuepos;
                }
                if (Tile.InsideGrid(new Grid.Position(dequeuepos.x, dequeuepos.y + 1), tiles) && !path.Contains(new Grid.Position(dequeuepos.x, dequeuepos.y + 1)))
                {
                    queue.Enqueue(new Grid.Position(dequeuepos.x, dequeuepos.y + 1));
                    path.Add(new Grid.Position(dequeuepos.x, dequeuepos.y + 1));
                    Tiles[dequeuepos.x, dequeuepos.y + 1] = dequeuepos;
                }
                if (Tile.InsideGrid(new Grid.Position(dequeuepos.x, dequeuepos.y - 1), tiles) && !path.Contains(new Grid.Position(dequeuepos.x, dequeuepos.y - 1)))
                {
                    queue.Enqueue(new Grid.Position(dequeuepos.x, dequeuepos.y - 1));
                    path.Add(new Grid.Position(dequeuepos.x, dequeuepos.y - 1));
                    Tiles[dequeuepos.x, dequeuepos.y - 1] = dequeuepos;
                }

                if (Tile.InsideGrid(new Grid.Position(dequeuepos.x + 1, dequeuepos.y + 1), tiles) && !path.Contains(new Grid.Position(dequeuepos.x + 1, dequeuepos.y + 1)))
                {
                    queue.Enqueue(new Grid.Position(dequeuepos.x + 1, dequeuepos.y + 1));
                    path.Add(new Grid.Position(dequeuepos.x + 1, dequeuepos.y + 1));
                    Tiles[dequeuepos.x + 1, dequeuepos.y + 1] = dequeuepos;
                }

                if (Tile.InsideGrid(new Grid.Position(dequeuepos.x - 1, dequeuepos.y + 1), tiles) && !path.Contains(new Grid.Position(dequeuepos.x - 1, dequeuepos.y + 1)))
                {
                    queue.Enqueue(new Grid.Position(dequeuepos.x - 1, dequeuepos.y + 1));
                    path.Add(new Grid.Position(dequeuepos.x - 1, dequeuepos.y + 1));
                    Tiles[dequeuepos.x - 1, dequeuepos.y + 1] = dequeuepos;
                }

                if (Tile.InsideGrid(new Grid.Position(dequeuepos.x + 1, dequeuepos.y - 1), tiles) && !path.Contains(new Grid.Position(dequeuepos.x + 1, dequeuepos.y - 1)))
                {
                    queue.Enqueue(new Grid.Position(dequeuepos.x + 1, dequeuepos.y - 1));
                    path.Add(new Grid.Position(dequeuepos.x + 1, dequeuepos.y - 1));
                    Tiles[dequeuepos.x + 1, dequeuepos.y - 1] = dequeuepos;
                }

                if (Tile.InsideGrid(new Grid.Position(dequeuepos.x - 1, dequeuepos.y - 1), tiles) && !path.Contains(new Grid.Position(dequeuepos.x - 1, dequeuepos.y - 1)))
                {
                    queue.Enqueue(new Grid.Position(dequeuepos.x - 1, dequeuepos.y - 1));
                    Tiles[dequeuepos.x - 1, dequeuepos.y - 1] = dequeuepos;
                    path.Add(new Grid.Position(dequeuepos.x - 1, dequeuepos.y - 1));
                }
            }
        }

        return(grid);
    }
Example #20
0
    public static List <Grid.Position> Search(Grid.Position myPosition, Grid.Position positionToFind, Tile[,] tiles)
    {
        int width  = tiles.GetLength(0);
        int heigth = tiles.GetLength(1);
        Queue <Grid.Position> fila = new Queue <Grid.Position>();
        List <Grid.Position>  path = new List <Grid.Position>();

        fila.Enqueue(myPosition);
        HashSet <Grid.Position> PlacesVisited = new HashSet <Grid.Position>();

        Grid.Position[,] Paths = new Grid.Position[tiles.GetLength(0), tiles.GetLength(1)];

        Paths[myPosition.x, myPosition.y] = myPosition;
        while (fila.Count > 0)
        {
            Grid.Position current = fila.Dequeue();

            if (current.x == positionToFind.x && current.y == positionToFind.y)
            {
                path.Add(current);

                while (current.x != myPosition.x || current.y != myPosition.y)
                {
                    current = Paths[current.x, current.y];
                    path.Add(current);
                }
                path.Reverse();
                break;
            }

            else
            {
                if (!PlacesVisited.Contains(new Grid.Position {
                    x = current.x + 1, y = current.y
                }) &&
                    IsinTile(new Grid.Position {
                    x = current.x + 1, y = current.y
                }, tiles))
                {
                    fila.Enqueue(new Grid.Position {
                        x = current.x + 1, y = current.y
                    });
                    PlacesVisited.Add(new Grid.Position {
                        x = current.x + 1, y = current.y
                    });
                    Paths[current.x + 1, current.y] = current;
                }
                if (!PlacesVisited.Contains(new Grid.Position {
                    x = current.x - 1, y = current.y
                }) &&
                    IsinTile(new Grid.Position {
                    x = current.x - 1, y = current.y
                }, tiles))
                {
                    fila.Enqueue(new Grid.Position {
                        x = current.x - 1, y = current.y
                    });
                    PlacesVisited.Add(new Grid.Position {
                        x = current.x - 1, y = current.y
                    });
                    Paths[current.x - 1, current.y] = current;
                }
                if (!PlacesVisited.Contains(new Grid.Position {
                    x = current.x, y = current.y + 1
                }) &&
                    IsinTile(new Grid.Position {
                    x = current.x, y = current.y + 1
                }, tiles))
                {
                    fila.Enqueue(new Grid.Position {
                        x = current.x, y = current.y + 1
                    });
                    PlacesVisited.Add(new Grid.Position {
                        x = current.x, y = current.y + 1
                    });
                    Paths[current.x, current.y + 1] = current;
                }
                if (!PlacesVisited.Contains(new Grid.Position {
                    x = current.x, y = current.y - 1
                }) &&
                    IsinTile(new Grid.Position {
                    x = current.x, y = current.y - 1
                }, tiles))
                {
                    fila.Enqueue(new Grid.Position {
                        x = current.x, y = current.y - 1
                    });
                    PlacesVisited.Add(new Grid.Position {
                        x = current.x, y = current.y - 1
                    });
                    Paths[current.x, current.y - 1] = current;
                }
                if (!PlacesVisited.Contains(new Grid.Position {
                    x = current.x + 1, y = current.y + 1
                }) &&
                    IsinTile(new Grid.Position {
                    x = current.x + 1, y = current.y + 1
                }, tiles))
                {
                    fila.Enqueue(new Grid.Position {
                        x = current.x + 1, y = current.y + 1
                    });
                    PlacesVisited.Add(new Grid.Position {
                        x = current.x + 1, y = current.y + 1
                    });
                    Paths[current.x + 1, current.y + 1] = current;
                }
                if (!PlacesVisited.Contains(new Grid.Position {
                    x = current.x - 1, y = current.y + 1
                }) &&
                    IsinTile(new Grid.Position {
                    x = current.x - 1, y = current.y + 1
                }, tiles))
                {
                    fila.Enqueue(new Grid.Position {
                        x = current.x - 1, y = current.y + 1
                    });
                    PlacesVisited.Add(new Grid.Position {
                        x = current.x - 1, y = current.y + 1
                    });
                    Paths[current.x - 1, current.y + 1] = current;
                }
                if (!PlacesVisited.Contains(new Grid.Position {
                    x = current.x + 1, y = current.y - 1
                }) &&
                    IsinTile(new Grid.Position {
                    x = current.x + 1, y = current.y - 1
                }, tiles))
                {
                    fila.Enqueue(new Grid.Position {
                        x = current.x + 1, y = current.y - 1
                    });
                    PlacesVisited.Add(new Grid.Position {
                        x = current.x + 1, y = current.y - 1
                    });
                    Paths[current.x + 1, current.y - 1] = current;
                }
                if (!PlacesVisited.Contains(new Grid.Position {
                    x = current.x - 1, y = current.y - 1
                }) &&
                    IsinTile(new Grid.Position {
                    x = current.x - 1, y = current.y - 1
                }, tiles))
                {
                    fila.Enqueue(new Grid.Position {
                        x = current.x - 1, y = current.y - 1
                    });
                    PlacesVisited.Add(new Grid.Position {
                        x = current.x - 1, y = current.y - 1
                    });
                    Paths[current.x - 1, current.y - 1] = current;
                }
            }
        }
        return(path);
    }
Example #21
0
 public PathNode(Grid.Position position, PathNode parent)
 {
     this.position = position;
     this.parent   = parent;
 }
Example #22
0
    /**
     * Generate all of GameObjects from currentGrid.
     */
    private void DrawTiles()
    {
        Grid grid = currentGrid;

        tiles = new GameObject[grid.Width, grid.Length];
        List <Grid.Position> waypoints = grid.Waypoints;

        Grid.Position currentPos = new Grid.Position(0, 0);
        bool          isWaypoint = false;

        Grid.TileType currentTile;

        Vector3 tileScale = new Vector3(tileWidth, tileHeight, tileLength);

        for (int x = 0; x < grid.Width; x++)      // along x-axis in the world
        {
            for (int z = 0; z < grid.Length; z++) // along z-axis in the world
            {
                isWaypoint = false;
                currentPos.UpdatePosition(x, z);
                currentTile = grid.At(x, z);

                // figure out if current position is a waypoint if on path
                if (currentTile == Grid.TileType.path || currentTile == Grid.TileType.end)
                {
                    foreach (Grid.Position p in waypoints)
                    {
                        if (p == currentPos)
                        {
                            isWaypoint = true;
                            break;
                        }
                    }
                }

                Vector3 worldPosition = new Vector3(x * tileWidth, 0, z * tileLength);
                // Vector3 worldPosition = new Vector3(z*tileLength, 0, x*tileWidth);
                GameObject tile;

                switch (currentTile)
                {
                case Grid.TileType.terrain:
                    tile      = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    tile.name = "Terrain-" + x + "," + z;
                    tile.tag  = "TerrainTile";

                    tile.GetComponent <Renderer>().material.mainTexture =
                        Resources.Load <Texture2D>(TerrainTexture);
                    break;

                case Grid.TileType.path:
                    tile      = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    tile.name = "Path-" + x + "," + z;
                    tile.tag  = "PathTile";

                    tile.GetComponent <Renderer>().material.mainTexture =
                        Resources.Load <Texture2D>(PathTexture);
                    break;

                case Grid.TileType.start:
                    tile      = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    startTile = tile;
                    tile.name = "Start-" + x + "," + z;
                    tile.tag  = "StartTile";

                    GameObject portal =
                        Instantiate(Resources.Load("Portal/Orbs/Prefabs/Portal")) as GameObject;
                    portal.name                    = "Portal";
                    portal.transform.parent        = tile.transform;
                    portal.transform.localScale    = new Vector3(2f, 2f, 2f);
                    portal.transform.localPosition = new Vector3(0f, 2.5f, 0f);
                    portal.transform.Rotate(new Vector3(0f, 0f, 90f));

                    tile.AddComponent <SpawnPoint>();
                    tile.GetComponent <SpawnPoint>().ground = this;
                    tile.GetComponent <SpawnPoint>().player = player;

                    tile.GetComponent <Renderer>().material.mainTexture =
                        Resources.Load <Texture2D>(PathTexture);
                    break;

                case Grid.TileType.end:
                    tile      = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    endTile   = tile;
                    tile.name = "End-" + x + "," + z;
                    tile.tag  = "EndTile";

                    GameObject house =
                        Instantiate(Resources.Load("Baker House/Prefabs/Baker_house")) as GameObject;
                    house.name                    = "Lorham";
                    house.transform.parent        = tile.transform;
                    house.transform.localScale    = new Vector3(0.1f, 0.1f, 0.4f);
                    house.transform.localPosition = new Vector3(0f, 0.5f, 0f);
                    house.transform.Rotate(new Vector3(-90f, 0f, 0f));

                    house.AddComponent <AudioSource>();
                    houseAudioSource = house.GetComponent <AudioSource>();

                    house.SetActive(true);

                    tile.GetComponent <Renderer>().material.mainTexture =
                        Resources.Load <Texture2D>(PathTexture);
                    break;

                case Grid.TileType.border:
                    tile      = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    tile.name = "Border-" + x + "," + z;
                    tile.tag  = "BorderTile";

                    tile.AddComponent <Border>();
                    tile.GetComponent <Renderer>().material.mainTexture =
                        Resources.Load <Texture2D>(BorderTexture);
                    break;

                default:
                    Debug.LogError("Unrecognized tile type: " + grid.At(x, z).ToString());
                    return;
                }

                // setting this as child of ground object
                tile.transform.parent = transform;
                // update object position in world space
                tile.transform.localScale = tileScale;
                tile.transform.position   = worldPosition;
                // add Tile component and update its internal state
                tile.AddComponent <Tile>();
                tile.GetComponent <Tile>().GridLocX   = x;
                tile.GetComponent <Tile>().GridLocY   = z;
                tile.GetComponent <Tile>().IsWaypoint = isWaypoint;
                // add it to the tiles variable to keep track it
                tiles[x, z] = tile;
            }
        }

        // save the waypoints transformations so mobs can follow
        foreach (Grid.Position w in waypoints)
        {
            GameObject tile = tiles[w.X, w.Y];
            Debug.Assert(tile.name.Contains("Path") || tile.name.Contains("End"));
            Debug.Assert(tile.GetComponent <Tile>().IsWaypoint);
            waypointTransforms.Add(tile.GetComponent <Tile>().waypoint);
        }


        // identify neighboring tiles as buildable
        for (int x = 0; x < grid.Width; x++)
        {
            for (int z = 0; z < grid.Length; z++)
            {
                currentPos.UpdatePosition(x, z);
                GameObject tile = tiles[currentPos.X, currentPos.Y];

                if (!tile.tag.Contains("Path"))
                {
                    continue;
                }

                List <Grid.Position> neighbors = currentPos
                                                 .BuildNeighbors()
                                                 .FindAll(n => !n.OutOfBound(grid));

                foreach (Grid.Position n in neighbors)
                {
                    GameObject neighbor = tiles[n.X, n.Y];
                    if (neighbor.tag.Contains("Terrain"))
                    {
                        neighbor.GetComponent <Tile>().IsBuildable = true;
                    }
                }
            }
        }
    }
Example #23
0
    private static void TryEnqueueNode(Tile[,] tiles, Queue <PathNode> queue, HashSet <PathNode> nodes, PathNode currentNode, Grid.Position position)
    {
        int wBorder = tiles.GetLength(0);
        int hBorder = tiles.GetLength(1);

        if (position.x > wBorder || position.x < 0 || position.y > hBorder || position.y < 0)
        {
            return;
        }

        else
        {
            var node = new PathNode(position, currentNode);

            nodes.Add(node);
            queue.Enqueue(node);
        }
    }
Example #24
0
 public void SetPosition(Grid.Position toPosition, Vector2 spacing)
 {
     this.position           = toPosition;
     transform.localPosition = toPosition.ToWorldPosition(spacing, 1.0f);
 }
Example #25
0
    public static List <Grid.Position> FindPath(Tile[,] tiles, Grid.Position fromPosition, Grid.Position toPosition)
    {
        var path = new List <Grid.Position>();

        List <Grid.Position> lista = new List <Grid.Position> {
        };
        Queue <Grid.Position> Q1   = new Queue <Grid.Position>();

        Q1.Enqueue(fromPosition);


        while (Q1.Count > 0)
        {
            Grid.Position p = Q1.Dequeue();

            if (p.x == toPosition.x && p.y == toPosition.y)
            {
                Debug.Log("Achei o cara");
                break;
            }
            else
            {
                Grid.Position seeker1 = new Grid.Position {
                    x = p.x, y = p.y + 1
                };
                Grid.Position seeker2 = new Grid.Position {
                    x = p.x, y = p.y - 1
                };
                Grid.Position seeker3 = new Grid.Position {
                    x = p.x + 1, y = p.y
                };
                Grid.Position seeker4 = new Grid.Position {
                    x = p.x + 1, y = p.y
                };

                if (lista.Contains(seeker1))
                {
                    Q1.Enqueue(seeker1);
                }
                if (lista.Contains(seeker2))
                {
                    Q1.Enqueue(seeker2);
                }
                if (lista.Contains(seeker3))
                {
                    Q1.Enqueue(seeker3);
                }
                if (lista.Contains(seeker4))
                {
                    Q1.Enqueue(seeker4);
                }

                lista.Add(seeker1);
                lista.Add(seeker2);
                lista.Add(seeker3);
                lista.Add(seeker4);

                if (toPosition.x == seeker1.x && toPosition.y == seeker1.y)
                {
                    jaVisitou();
                }
                if (toPosition.x == seeker2.x && toPosition.y == seeker2.y)
                {
                    jaVisitou();
                }
                if (toPosition.x == seeker3.x && toPosition.y == seeker3.y)
                {
                    jaVisitou();
                }
                if (toPosition.x == seeker4.x && toPosition.y == seeker4.y)
                {
                    jaVisitou();
                }
            }
        }

        path.Add(fromPosition);
        Grid.Position posi = fromPosition;

        /*while(posi.x != toPosition.x || posi.y != toPosition.y)
         * {
         *  if(posi.x < toPosition.x)
         *  { posi.x++; }
         *  else if (posi.x>toPosition.x) { posi.x--; }
         *
         *  if (posi.y < toPosition.y)
         *  { posi.y++; }
         *  else if (posi.y> toPosition.y) { posi.y--; }
         *
         *  path.Add(posi);
         * }*/

        path.Add(toPosition);
        return(path);
    }