示例#1
0
 public DrawMap()
 {
     tilesRepository = new RNDRepository(new PerlinNoise());
     tileGenerator   = new TileGenerator(tilesRepository)
     {
         SetTilesViewer = new AllDisplay() //можем подменять динамически
     };
     chunkGenerator  = new ChunkGenerator(tileGenerator);
     currentBoundary = new RectInt(0, 0, 0, 0);
     chunkGenerator.Add(0, 0, 0, 0); //инициализировали первый
 }
示例#2
0
        /// <summary>
        /// Проверить границы видимости и перерисовать карту
        /// </summary>
        public void Redraw(RectInt newBoundary)
        {
            // количество открытий (сверху, снизу, слева, справа)
            int createOperationCount = 0;
            // количество сокрытий (сверху, снизу, слева, справа)
            int hideOperationCount = 0;

            // если граница стала больше справа, то создаем новые тайлы (планеты), которые должны быть в новой открытой области
            if (newBoundary.xMax > currentBoundary.xMax)
            {
                chunkGenerator.Add(currentBoundary.xMax + 1, currentBoundary.yMin, newBoundary.xMax, currentBoundary.yMax);
                currentBoundary.xMax = newBoundary.xMax;
                createOperationCount++;
            }
            else
            {
                // если граница стала меньше справа, то скрываем тайлы
                if (currentBoundary.xMax > newBoundary.xMax)
                {
                    chunkGenerator.Remove(newBoundary.xMax + 1, currentBoundary.yMin, currentBoundary.xMax, currentBoundary.yMax);
                    currentBoundary.xMax = newBoundary.xMax;
                    hideOperationCount++;
                }
            }

            // если граница стала больше слева
            if (newBoundary.xMin < currentBoundary.xMin)
            {
                chunkGenerator.Add(newBoundary.xMin, currentBoundary.yMin, currentBoundary.xMin - 1, currentBoundary.yMax);
                currentBoundary.xMin = newBoundary.xMin;
                createOperationCount++;
            }
            else
            {
                // если граница стала меньше слева
                if (currentBoundary.xMin < newBoundary.xMin)
                {
                    chunkGenerator.Remove(currentBoundary.xMin, currentBoundary.yMin, newBoundary.xMin - 1, currentBoundary.yMax);
                    currentBoundary.xMin = newBoundary.xMin;
                    hideOperationCount++;
                }
            }

            // если граница стала больше сверху
            if (newBoundary.yMax > currentBoundary.yMax)
            {
                chunkGenerator.Add(currentBoundary.xMin, currentBoundary.yMax + 1, currentBoundary.xMax, newBoundary.yMax);
                currentBoundary.yMax = newBoundary.yMax;
                createOperationCount++;
            }
            else
            {
                // если граница стала меньше сверху
                if (currentBoundary.yMax > newBoundary.yMax)
                {
                    chunkGenerator.Remove(currentBoundary.xMin, newBoundary.yMax + 1, currentBoundary.xMax, currentBoundary.yMax);
                    currentBoundary.yMax = newBoundary.yMax;
                    hideOperationCount++;
                }
            }

            // если граница стала больше снизу
            if (newBoundary.yMin < currentBoundary.yMin)
            {
                chunkGenerator.Add(currentBoundary.xMin, newBoundary.yMin, currentBoundary.xMax, currentBoundary.yMin - 1);
                currentBoundary.yMin = newBoundary.yMin;
                createOperationCount++;
            }
            else
            {
                // если граница стала меньше снизу
                if (currentBoundary.yMin < newBoundary.yMin)
                {
                    chunkGenerator.Remove(currentBoundary.xMin, currentBoundary.yMin, currentBoundary.xMax, newBoundary.yMin - 1);
                    currentBoundary.yMin = newBoundary.yMin;
                    hideOperationCount++;
                }
            }
        }