/// <summary>
        /// Добавить задание
        /// </summary>
        /// <param name="rect">Прямоугольник</param>
        /// <param name="clearExists">Удалить существующие задания</param>
        public void AppendRect(RectInt rect, bool clearExists = false)
        {
            if (RectIntTool.IsDevided(rect, SettingsAccess.CellPxSize) &&
                rect.width != SettingsAccess.CellPxSize)
            {
                _size = SettingsAccess.CellPxSize;
            }
            else
            {
                _size = 1;
            }

            var centerPos = new Vector2Int(Mathf.FloorToInt(rect.center.x), Mathf.FloorToInt(rect.center.y));

            _iterator.Reset(rect, centerPos, _size);

            var length = _iterator.Lenght;

            _sliceLenght = length;

            _sortedCells.Clear();

            _isVisitEnded = false;

            if (_debug != null)
            {
                _debug.OnBeginSearch();
            }
        }
        /// <summary>
        /// Создадим задание для прямоугольника
        /// </summary>
        /// <param name="rect">Прямоугольник</param>
        /// <returns>Задание</returns>
        protected override GenerateRectInfo CreateInfo(RectInt rect)
        {
            // Прямоугольник должен делиться нацело на CellPxSize
            if (RectIntTool.IsDevided(rect, SettingsAccess.CellPxSize) == false)
            {
                throw new System.ArgumentOutOfRangeException("Невозможно обработать данный прямоугольник " + rect);
            }

            int sliceWidth;
            int sliceHeight;

            // Если прямоугольник делится нацело на максимальный размер - установим его
            if (RectIntTool.IsDevided(rect, MaxSliceSize))
            {
                sliceWidth  = MaxSliceSize;
                sliceHeight = MaxSliceSize;
            }
            else
            {
                sliceWidth  = SettingsAccess.CellPxSize;
                sliceHeight = SettingsAccess.CellPxSize;
            }

            return(new GenerateRectInfo(rect, sliceWidth, sliceHeight, -1, _sliceData));
        }
Beispiel #3
0
        /// <summary>
        /// Обновить видимую область при обычном режиме просмотра планет
        /// </summary>
        private void RefreshNormalVisibleArea()
        {
            var rect = _zoom.GetVisibleRect(_currentCellItemPosition);

            if (_prevRect == null)
            {
                _planets.DestroyAll();

                FillPlanets(rect);
            }
            else
            {
                // Вычтем текущего прямоугольник из прошлого, получив таким образом область для очистки
                var rectsToDestroy = RectIntTool.Subtract(_prevRect.Value, rect);

                for (int i = 0; i < rectsToDestroy.Count; i++)
                {
                    ClearPlanets(rectsToDestroy[i]);
                }

                // Вычтем прошлый прямоугольник из текущего, получив таким образом область для заполнения планетами
                var rectsToFill = RectIntTool.Subtract(rect, _prevRect.Value);

                for (int i = 0; i < rectsToFill.Count; i++)
                {
                    FillPlanets(rectsToFill[i]);
                }
            }

            _prevRect = rect;
        }
Beispiel #4
0
        /// <summary>
        /// Создадим задание для прямоугольника
        /// </summary>
        /// <param name="rect">Прямоугольник</param>
        /// <returns>Задание</returns>
        protected override GenerateRectInfo CreateInfo(RectInt rect)
        {
            for (int textureIndex = 0; textureIndex < _renderTextures.Length; textureIndex++)
            {
                var rendTex = _renderTextures[textureIndex];

                if (RectIntTool.IsDevided(rect, rendTex.width, rendTex.height))
                {
                    return(new GenerateRectInfo(rect, rendTex.width, rendTex.height, textureIndex, _sliceData));
                }
            }

            throw new System.ArgumentOutOfRangeException(string.Format("Невозможнно обработать данный прямоугольник {0}", rect));
        }
Beispiel #5
0
        /// <summary>
        /// Изменилась текущая позиция игрока на поле
        /// </summary>
        private void OnPlayerPositionChanged()
        {
            var newCellPosition = SettingsAccess.GetCellBeginPosition(_currentCellItemPosition);

            // Если изменилась текущая ячейка игрока на поле, добавим разницу между прямоугольниками старых и новых координат игрока на генерацию
            if (newCellPosition != _currentCellPosition)
            {
                var prevRect        = SettingsAccess.GetFieldRectPx(_currentCellPosition);
                var prevVisibleRect = SettingsAccess.GetFullGenerationRect(_currentCellPosition);

                var newRect        = SettingsAccess.GetFieldRectPx(newCellPosition);
                var newVisibleRect = SettingsAccess.GetFullGenerationRect(newCellPosition);

                // Разница между старым прямоугольником всего поля и текущим
                var rectsToFill = RectIntTool.Subtract(newRect, prevRect);
                // Разница между старым прямоугольником полностью генерируемого мира вокруг игрока и текущим
                var visibleRectsFill = RectIntTool.Subtract(newVisibleRect, prevVisibleRect);

                visibleRectsFill.AddRange(rectsToFill);

                if (visibleRectsFill.Count > 0)
                {
                    // Добавить задание на генерацию - сперва прямоугольники полностью генерируемых ячеек вокруг игрока, потом прямоугольники поля
                    _generator.AppendRects(visibleRectsFill, true);
                }

                _currentCellPosition = newCellPosition;
            }

            if (_zoom.IsAdvancedView() == false)
            {
                RefreshNormalVisibleArea();

                SetPosition();
            }
            else
            {
                if (_zoom.IsCellsView())
                {
                    _sortedCellsVisitor.AppendRect(_zoom.GetVisibleRect(_currentCellPosition));
                }
                else
                {
                    _sortedCellsVisitor.AppendRect(_zoom.GetVisibleRect(_currentCellItemPosition));
                }
            }
        }
        public void SubtractRectangleCheck()
        {
            RectInt[] rects = new RectInt[]
            {
                new RectInt(0, 0, 3, 3),
                new RectInt(1, 1, 3, 3),
                new RectInt(0, 0, 3, 3),
                new RectInt(0, 1, 3, 3),
                new RectInt(0, 1, 3, 3),
                new RectInt(1, 0, 3, 3),
                new RectInt(0, 0, 3, 3),
                new RectInt(0, 0, 3, 3),
                new RectInt(0, 0, 3, 3),
                new RectInt(0, 0, 3, 3),
                new RectInt(-1, -1, 3, 3),
                new RectInt(-1, -1, 5, 5),
                new RectInt(0, 0, 3, 3)
            };

            RectInt[] subtracts = new RectInt[]
            {
                new RectInt(1, 1, 3, 3),
                new RectInt(0, 0, 3, 3),
                new RectInt(0, 1, 3, 3),
                new RectInt(0, 0, 3, 3),
                new RectInt(1, 0, 3, 3),
                new RectInt(0, 1, 3, 3),
                new RectInt(0, -1, 3, 3),
                new RectInt(-1, -1, 3, 3),
                new RectInt(3, 3, 3, 3),
                new RectInt(-3, -3, 3, 3),
                new RectInt(0, 0, 3, 3),
                new RectInt(0, 0, 3, 3),
                new RectInt(-1, -1, 5, 5)
            };

            RectInt[][] results = new RectInt[][]
            {
                new RectInt[]
                {
                    new RectInt(0, 0, 3, 1),
                    new RectInt(0, 1, 1, 2)
                },
                new RectInt[]
                {
                    new RectInt(3, 1, 1, 3),
                    new RectInt(1, 3, 2, 1)
                },
                new RectInt[]
                {
                    new RectInt(0, 0, 3, 1),
                },
                new RectInt[]
                {
                    new RectInt(0, 3, 3, 1),
                },
                new RectInt[]
                {
                    new RectInt(0, 1, 1, 3),
                    new RectInt(1, 3, 2, 1)
                },
                new RectInt[]
                {
                    new RectInt(1, 0, 3, 1),
                    new RectInt(3, 1, 1, 2)
                },
                new RectInt[]
                {
                    new RectInt(0, 2, 3, 1),
                },
                new RectInt[]
                {
                    new RectInt(2, 0, 1, 3),
                    new RectInt(0, 2, 2, 1)
                },
                new RectInt[] { },
                new RectInt[] { },
                new RectInt[]
                {
                    new RectInt(-1, -1, 3, 1),
                    new RectInt(-1, 0, 1, 2)
                },
                new RectInt[]
                {
                    new RectInt(-1, -1, 5, 1),
                    new RectInt(-1, 0, 1, 4),
                    new RectInt(3, 0, 1, 4),
                    new RectInt(0, 3, 3, 1)
                },
                new RectInt[] { },
            };

            for (int i = 0; i < rects.Length; i++)
            {
                var rect     = rects[i];
                var subtract = subtracts[i];
                var result   = results[i];

                var rectangles = RectIntTool.Subtract(rect, subtract);

                for (int j = 0; j < Mathf.Min(result.Length, rectangles.Count); j++)
                {
                    Assert.AreEqual(rectangles[j], result[j]);
                }

                Assert.AreEqual(result.Length, rectangles.Count);
            }
        }