예제 #1
0
    IEnumerator CheckThisTile(Sc_Tile tileToCheck, float delay)
    {
        yield return(new WaitForSeconds(delay));

        ClearLine(CheckLine(tileToCheck, Vector2Int.left));
        ClearLine(CheckLine(tileToCheck, Vector2Int.up));
    }
예제 #2
0
    public void Swap(Sc_Tile firstTile, Sc_Tile secondTile)
    {
        canSwap = false;
        Sc_EventManager.instance.onUpdateStats.Invoke();
        gameManager.ChangeAction(-1);
        Vector2Int objCoord    = GetTileCoordinates(firstTile.gameObject);
        Vector2Int toSwapCoord = GetTileCoordinates(secondTile.gameObject);

        Vector2 objPosition  = firstTile.transform.position;
        Vector2 swapPosition = secondTile.transform.position;

        grid[objCoord.x, objCoord.y] = secondTile.gameObject;
        firstTile.coordinates        = toSwapCoord;

        grid[toSwapCoord.x, toSwapCoord.y] = firstTile.gameObject;
        secondTile.coordinates             = objCoord;

        secondTile.transform.DOMove(objPosition, swapDuration);
        firstTile.transform.DOMove(swapPosition, swapDuration);
        secondTile.gameObject.name = secondTile.ToString();
        firstTile.gameObject.name  = firstTile.ToString();

        StartCoroutine(CheckThisTile(firstTile, swapDuration));
        StartCoroutine(CheckThisTile(secondTile, swapDuration));
    }
예제 #3
0
    public GameObject CreateTile(int j, int i)
    {
        int        random  = Random.Range(0, allTiles.Length);
        GameObject newTile = Instantiate(allTiles[random], transform.position + new Vector3(j, -i, 0), Quaternion.identity, transform);
        Sc_Tile    tile    = newTile.GetComponent <Sc_Tile>();

        tile.coordinates = new Vector2Int(j, i);
        tile.name        = tile.ToString();
        return(newTile);
    }
예제 #4
0
 void ManageTiles()
 {
     foreach (var item in grid)
     {
         if (item != null)
         {
             Sc_Tile tile = item.GetComponent <Sc_Tile>();
             tile.highlight = item == highlightedTile;
         }
     }
 }
예제 #5
0
    public GameObject GetAdjacentCell(Vector2Int direction, Sc_Tile baseTile)
    {
        if (direction == Vector2Int.zero || !canSwap || !gameManager.canPlay)
        {
            return(null);
        }

        Vector2Int result = new Vector2Int(baseTile.coordinates.x + direction.x, baseTile.coordinates.y + direction.y);
        GameObject tile   = null;

        if (result.x < grid.GetLength(0) && result.x >= 0)
        {
            if (result.y < grid.GetLength(1) && result.y >= 0)
            {
                tile = grid[baseTile.coordinates.x + direction.x, baseTile.coordinates.y + direction.y];
            }
        }

        return(tile);
    }
예제 #6
0
    public IEnumerator GenerateGrid(bool replace)
    {
        yield return(new WaitForSeconds(1f));

        for (int i = 0; i < grid.GetLength(1); i++)
        {
            for (int j = 0; j < grid.GetLength(0); j++)
            {
                if (replace && grid[j, i] != null)
                {
                    continue;
                }

                grid[j, i] = CreateTile(j, i);
                if (j - 1 >= 0)
                {
                    while (true)
                    {
                        Sc_Tile adjacentTile = grid[j - 1, i].GetComponent <Sc_Tile>();
                        Sc_Tile currentTile  = grid[j, i].GetComponent <Sc_Tile>();

                        if (currentTile.IsSameOf(adjacentTile))
                        {
                            Destroy(grid[j, i]);
                            grid[j, i] = CreateTile(j, i);
                        }
                        else
                        {
                            break;
                        }
                    }
                }

                if (i - 1 >= 0)
                {
                    while (true)
                    {
                        Sc_Tile adjacentTile = grid[j, i - 1].GetComponent <Sc_Tile>();
                        Sc_Tile currentTile  = grid[j, i].GetComponent <Sc_Tile>();

                        if (currentTile.IsSameOf(adjacentTile))
                        {
                            Destroy(grid[j, i]);
                            grid[j, i] = CreateTile(j, i);
                        }
                        else
                        {
                            break;
                        }
                    }
                }

                Sc_Tile tile = grid[j, i].GetComponent <Sc_Tile>();
                tile.Creation();
                StartCoroutine(CheckThisTile(tile, 0.5f));
            }
        }

        canSwap = true;
        Sc_EventManager.instance.onUpdateStats.Invoke();
    }
예제 #7
0
    List <Sc_Tile> CheckLine(Sc_Tile startTile, Vector2Int direction)
    {
        Vector2Int     lastCoord      = new Vector2Int();
        bool           outB           = false;
        List <Sc_Tile> tempValidTiles = new List <Sc_Tile>();

        for (int i = 0; i < grid.GetLength(0); i++)
        {
            for (int j = 0; j < grid.GetLength(1); j++)
            {
                Vector2Int computeCoordinates = startTile.coordinates + (direction * i);
                bool       inBound            = computeCoordinates.x >= 0 && computeCoordinates.x < grid.GetLength(0) && computeCoordinates.y >= 0 && computeCoordinates.y < grid.GetLength(1);
                if (inBound && grid[computeCoordinates.x, computeCoordinates.y] != null)
                {
                    Sc_Tile tile = grid[computeCoordinates.x, computeCoordinates.y].GetComponent <Sc_Tile>();
                    if (tile.IsSameOf(startTile))
                    {
                        lastCoord = computeCoordinates;
                    }
                    else
                    {
                        outB = true;
                        break;
                    }
                }
            }

            if (outB)
            {
                outB = false;
                break;
            }
        }

        for (int i = 0; i < grid.GetLength(0); i++)
        {
            for (int j = 0; j < grid.GetLength(1); j++)
            {
                Vector2Int computeCoordinates = lastCoord - (direction * i);
                bool       inBound            = computeCoordinates.x >= 0 && computeCoordinates.x < grid.GetLength(0) && computeCoordinates.y >= 0 && computeCoordinates.y < grid.GetLength(1);
                if (inBound && grid[computeCoordinates.x, computeCoordinates.y] != null)
                {
                    Sc_Tile tile = grid[computeCoordinates.x, computeCoordinates.y].GetComponent <Sc_Tile>();
                    if (tile.IsSameOf(startTile))
                    {
                        if (!tempValidTiles.Contains(tile))
                        {
                            tempValidTiles.Add(tile);
                        }

                        if (!tempValidTiles.Contains(startTile))
                        {
                            tempValidTiles.Add(startTile);
                        }
                    }
                    else
                    {
                        outB = true;
                        break;
                    }
                }
            }

            if (outB)
            {
                break;
            }
        }

        if (tempValidTiles.Count < 3)
        {
            tempValidTiles.Clear();
        }

        return(tempValidTiles);
    }
예제 #8
0
 public bool IsSameOf(Sc_Tile obj2)
 {
     return(myTileEffect.stat == obj2.myTileEffect.stat);
 }