Beispiel #1
0
    /// <summary>
    /// La funcion crea el conjunto de casillas que forman la vision
    /// </summary>
    private void ComputeVisionSet()
    {
        // Vaciamos el Set anterior
        visionTiles.Clear();

        // Obtenemos el tamaño basico de la casilla
        float tileSize = board.GetTileSize();

        // Obtenemos el indice de la casilla a la que miramos
        int centralIndex = board.PositionToIndex(transform.position + transform.forward * tileSize);

        // Obtenemos la diferencia entre el indice al que apuntamos y el actual
        int centerDiff = centralIndex - boardIndex;

        // Calculamos los limites para los bucles
        int minI;
        int maxI;
        int minJ;
        int maxJ;
        int boardSize1 = (int)board.GetBoardShape()[0];

        if (Mathf.Abs(centerDiff) < boardSize1)
        {
            // Definimos los bordes del tablero
            int clampMaxJ = boardSize1 - 1 - (centralIndex % boardSize1);
            int clampMinJ = -(centralIndex % boardSize1);

            maxI = horizontalVisionSize / 2;
            minI = -horizontalVisionSize / 2;
            maxJ = Mathf.Clamp((verticalVisionSize - 1) * centerDiff, clampMinJ, clampMaxJ);
            minJ = 0;

            if (minJ > maxJ)
            {
                minJ = maxJ;
                maxJ = 0;
            }
        }
        else
        {
            // Definimos los bordes del tablero
            int clampMaxJ = boardSize1 - 1 - (centralIndex % boardSize1);
            int clampMinJ = -(centralIndex % boardSize1);

            maxJ = Mathf.Clamp(horizontalVisionSize / 2, clampMinJ, clampMaxJ);
            minJ = Mathf.Clamp(-horizontalVisionSize / 2, clampMinJ, clampMaxJ);
            maxI = (verticalVisionSize - 1) * (int)Mathf.Sign(centerDiff);
            minI = 0;

            if (minI > maxI)
            {
                minI = maxI;
                maxI = 0;
            }
        }

        int borderCheck = Mathf.Abs(centralIndex % boardSize1 - boardIndex % boardSize1);

        if (centralIndex >= 0 && borderCheck != boardSize1 - 1)
        {
            for (int i = minI; i <= maxI; i++)
            {
                for (int j = minJ; j <= maxJ; j++)
                {
                    int aux = centralIndex + j + i * boardSize1;
                    visionTiles.Add(aux);
                }
            }
        }

        List <int> removeList = new List <int>();

        // Una vez añadidas todas las casillas de vision basicas detectaremos los muros que hay dentro de ellas y eliminaremos los valores de vision que tapan deichos muros
        foreach (int tile in visionTiles)
        {
            if (board.isWall(tile))
            {
                if (Mathf.Abs(centerDiff) < boardSize1)
                {
                    for (int i = 0; i < verticalVisionSize; i++)
                    {
                        removeList.Add(tile + i * (int)Mathf.Sign(centerDiff));
                    }
                }
                else
                {
                    for (int i = 0; i < verticalVisionSize; i++)
                    {
                        removeList.Add(tile + i * boardSize1 * (int)Mathf.Sign(centerDiff));
                    }
                }
            }
        }

        removeList.ForEach(x => visionTiles.Remove(x));
    }