Example #1
0
        // Genera todos los bloques de la matriz
        // No se utiliza GetLowerBound ni GetUpperBound porque sabemos que son matrices que siempre empiezan en cero y acaban en positivo
        private void GenerateBlocks(SlidingPuzzle puzzle)
        {
            if (puzzle == null)
            {
                throw new ArgumentNullException(nameof(puzzle));
            }

            var rows    = blocks.GetLength(0);
            var columns = blocks.GetLength(1);

            for (var r = 0u; r < rows; r++)
            {
                for (var c = 0u; c < columns; c++)
                {
                    MovableBlock block = blocks[r, c];
                    if (block == null)
                    {
                        // Crea un ejemplar del prefab de bloque en la posición correcta según su posición en la matriz (podrían hacerse hijos del tablero)
                        // Se asume un tablero en (0f, 0f, 0f) aunque debería tomarse la posición real del tablero como referencia
                        block = Instantiate(blockPrefab,
                                            new Vector3(-((blocks.GetLength(1) / 2.0f) * POSITION_FACTOR_C - (POSITION_FACTOR_C / 2.0f)) + c * POSITION_FACTOR_C,
                                                        0,
                                                        (blocks.GetLength(0) / 2.0f) * POSITION_FACTOR_R - (POSITION_FACTOR_R / 2.0f) - r * POSITION_FACTOR_R),
                                            Quaternion.identity); // En Y, que es la separación del board, estoy poniendo 0 pero la referencia la debería dar el Board

                        blocks[r, c] = block;
                    }
                    // Estuviera o no ya creado el bloque, se inicializa y reposiciona
                    Position position = new Position(r, c);
                    block.position = position;

                    uint value = puzzle.GetValue(position);
                    // El texto que se pone en el bloque es el valor +1, salvo si es el último valor, que no se mandará texto para que sea un bloque no visible
                    if (value == 0)
                    {
                        block.Initialize(this, null);
                    }
                    else
                    {
                        block.Initialize(this, value.ToString());
                    }
                    Debug.Log(ToString() + "generated " + block.ToString() + ".");
                }
            }
        }