/// <summary>
 /// Inicializa uma nova instância de SectorReader.
 /// </summary>
 /// <param name="screen">A tela a ser associada.</param>
 /// <param name="sectors">Os setores a serem lidos.</param>
 /// <param name="tileWidth">A largura dos tiles.</param>
 /// <param name="tileHeight">A altura dos tiles.</param>
 /// <param name="length">Define o valor que representa simultaneamente a quantidade de linhas e de colunas de todos os setores.</param>
 public IsoTileSectorReader(Screen screen, IsoTileSector <T>[,] sectors, int tileWidth, int tileHeight, int length) : base(screen, tileWidth, tileHeight)
 {
     sectorsList = sectors;
     TileWidth   = tileWidth;
     TileHeight  = tileHeight;
     Length      = length;
 }
        protected override void Dispose(bool disposing)
        {
            if (disposed)
            {
                return;
            }

            if (disposing)
            {
                this.sectorsList  = null;
                this.point_sector = null;
                this.total.Clear();
                this.total = null;
            }

            disposed = true;

            base.Dispose(disposing);
        }
        /// <summary>
        /// Lê o array contido nos setores e ordena as posições dos tiles.
        /// </summary>
        public override void Read()
        {
            //dimensões do array
            int d0 = sectorsList.GetLength(0);
            int d1 = sectorsList.GetLength(1);

            total = new List <T[]>(d0 * Length);

            for (int t = 0; t < total.Capacity; t++)
            {
                total.Add(null);
            }

            //Confere a linha
            for (int row = 0; row < d0; row++)
            {
                //Confiro a coluna
                for (int col = 0; col < d1; col++)
                {
                    //busco o setor na linha e coluna selecionada
                    IsoTileSector <T> s = sectorsList[row, col];
                    //recebo o mapa do setor
                    T[,] _map = s.GetMap();

                    int lr = _map.GetLength(0);
                    int lc = _map.GetLength(1);

                    //confiro a linha e a coluna do mapa
                    for (int sr = 0; sr < lr; sr++)
                    {
                        T[] numbers = new T[Length];

                        //faço a busca pelos números
                        for (int sc = 0; sc < lc; sc++)
                        {
                            numbers[sc] = _map[sr, sc];

                            point_sector.Add(new Point(sr + (row * lr), sc + (col * lc)), s);
                        }

                        //insiro a linha no array total
                        int ins = sr + (row * lr);

                        T[] index = total[ins];

                        if (index == null)
                        {
                            total[ins] = numbers;
                        }
                        else
                        {
                            List <T> n = new List <T>();
                            n.AddRange(index);

                            foreach (var j in numbers)
                            {
                                n.Add(j);
                            }

                            total[ins] = n.ToArray();
                        }
                    }
                }
            }

            TotalMap = new T[total.Count, total[01].GetLength(0)];

            for (int i = 0; i < total.Count; i++)
            {
                T[] row = total[i];

                for (int j = 0; j < row.GetLength(0); j++)
                {
                    TotalMap[i, j] = row[j];
                }
            }

            ReadFinalMap();
        }