public void Initialize(Vector2Int size, GameTileContentFactory contentFactory)
    {
        this.size           = size;
        this.contentFactory = contentFactory;
        ground.localScale   = new Vector3(size.x, size.y, 1f);
        Vector2 offset = new Vector2((size.x - 1) * 0.5f, (size.y - 1) * 0.5f);

        tiles = new GameaTile[size.x * size.y];
        for (int i = 0, y = 0; y < size.y; y++)
        {
            for (int x = 0; x < size.x; x++, i++)
            {
                GameaTile tile = tiles[i] = Instantiate(tilePrefab);
                tile.transform.SetParent(transform, false);
                tile.transform.localPosition = new Vector3(x - offset.x, 0f, y - offset.y);
                if (x > 0)
                {
                    GameaTile.MakeEastWestNeighbors(tile, tiles[i - 1]);
                }
                if (y > 0)
                {
                    GameaTile.MakeNorthSouthNeighbors(tile, tiles[i - size.x]);
                }
                tile.IsAlternative = (x & 1) == 0;
                if ((y & 1) == 0)
                {
                    tile.IsAlternative = !tile.IsAlternative;
                }
                tile.Content = contentFactory.Get(GameTileContentType.Empty);
            }
        }
        //FindPaths();
        ToggleDestination(tiles[tiles.Length / 2]);
        ToggleSpawnPoint(tiles[0]);
    }
예제 #2
0
 public static void MakeNorthSouthNeighbors(GameaTile north, GameaTile south)
 {
     Debug.Assert(
         south.north == null && north.south == null, "Redefined neighbors!"
         );
     south.north = north;
     north.south = south;
 }
예제 #3
0
 public static void MakeEastWestNeighbors(GameaTile east, GameaTile west)
 {
     Debug.Assert(
         west.east == null && east.west == null, "Redefined neighbors!"
         );
     west.east = east;
     east.west = west;
 }
예제 #4
0
    void SpawnEnemy()
    {
        GameaTile spawnPoint =
            board.GetSpawnPoint(Random.Range(0, board.SpawnPointCount));
        Enemy enemy = enemyFactory.Get();

        enemy.SpawnOn(spawnPoint);
        enemies.Add(enemy);
    }
예제 #5
0
    void HandleTouch()
    {
        GameaTile tile = board.GetTile(TouchRay);

        if (tile != null)
        {
            Debug.Log("oldu");
            //tile.Content =
            //	tileContentFactory.Get(GameTileContentType.Destination);
            board.ToggleWall(tile);
        }
    }
예제 #6
0
 GameaTile GrowPathTo(GameaTile neighbor, Direction direction)
 {
     if (!HasPath || neighbor == null || neighbor.HasPath)
     {
         return(null);
     }
     neighbor.distance   = distance + 1;
     neighbor.nextOnPath = this;
     neighbor.ExitPoint  =
         neighbor.transform.localPosition + direction.GetHalfVector();
     neighbor.PathDirection = direction;
     return
         (neighbor.Content.Type != GameTileContentType.Wall ? neighbor : null);
 }
예제 #7
0
    void HandleAlternativeTouch()
    {
        GameaTile tile = board.GetTile(TouchRay);

        if (tile != null)
        {
            if (Input.GetKey(KeyCode.LeftShift))
            {
                board.ToggleDestination(tile);
            }
            else
            {
                board.ToggleSpawnPoint(tile);
            }
        }
    }
    bool FindPaths()
    {
        foreach (GameaTile ktile in tiles)
        {
            if (ktile.Content.Type == GameTileContentType.Destination)
            {
                ktile.BecomeDestination();
                searchFrontier.Enqueue(ktile);
            }
            else
            {
                ktile.ClearPath();
            }
        }

        if (searchFrontier.Count == 0)
        {
            return(false);
        }

        //tiles[tiles.Length / 2].BecomeDestination();
        //searchFrontier.Enqueue(tiles[tiles.Length / 2]);
        while (searchFrontier.Count > 0)
        {
            GameaTile tile = searchFrontier.Dequeue();
            if (tile != null)
            {
                if (tile.IsAlternative)
                {
                    searchFrontier.Enqueue(tile.GrowPathNorth());
                    searchFrontier.Enqueue(tile.GrowPathSouth());
                    searchFrontier.Enqueue(tile.GrowPathEast());
                    searchFrontier.Enqueue(tile.GrowPathWest());
                }
                else
                {
                    searchFrontier.Enqueue(tile.GrowPathWest());
                    searchFrontier.Enqueue(tile.GrowPathEast());
                    searchFrontier.Enqueue(tile.GrowPathSouth());
                    searchFrontier.Enqueue(tile.GrowPathNorth());
                }
            }
        }

        foreach (GameaTile tile in tiles)
        {
            if (!tile.HasPath)
            {
                return(false);
            }
        }

        foreach (GameaTile atile in tiles)
        {
            atile.ShowPath();
        }

        if (showPaths)
        {
            foreach (GameaTile tile in tiles)
            {
                tile.ShowPath();
            }
        }

        return(true);
    }