예제 #1
0
        public void CellBeginPositionCheck()
        {
            Vector2Int[] positions = new Vector2Int[]
            {
                new Vector2Int(0, 0),
                new Vector2Int(50, 50),
                new Vector2Int(99, 99),
                new Vector2Int(-50, -50),
                new Vector2Int(-99, -99),
                new Vector2Int(-1, -1),
                new Vector2Int(-99, 100),
            };

            Vector2Int[] cellPositions = new Vector2Int[]
            {
                new Vector2Int(0, 0),
                new Vector2Int(0, 0),
                new Vector2Int(0, 0),
                new Vector2Int(-100, -100),
                new Vector2Int(-100, -100),
                new Vector2Int(-100, -100),
                new Vector2Int(-100, 100),
            };

            Assert.AreEqual(positions.Length, cellPositions.Length);

            for (int i = 0; i < positions.Length; i++)
            {
                Assert.AreEqual(cellPositions[i], SettingsAccess.GetCellBeginPosition(positions[i]), string.Format("for {0}", i));
            }
        }
예제 #2
0
        /// <summary>
        /// Отобразить планеты, входящие в прямоугольник
        /// </summary>
        /// <param name="rect">Прямоугольник в который входят планеты, которые требуется создать</param>
        private void FillPlanets(RectInt rect)
        {
            var iterator = rect.allPositionsWithin;

            CellInfo cell = null;

            while (iterator.MoveNext())
            {
                var worldPos = iterator.Current;
                var cellPos  = SettingsAccess.GetCellBeginPosition(worldPos);

                if (cell == null ||
                    cell.Pos != cellPos)
                {
                    cell = _cells.GetCell(cellPos);
                }

                var cellItemPos = cell.GetCellItemPosition(worldPos);

                var rating = cell.GetRating(cellItemPos);

                if (rating > 0)
                {
                    var posId = SettingsAccess.GetId(worldPos);

                    var planet = _planets.Create(posId);

                    planet.Show(worldPos, SettingsAccess.ConvertToWorldPosition(worldPos), rating);
                }
            }
        }
예제 #3
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));
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Сортирует следущие <see cref="_sliceLenght"/> позиций по координатам из <see cref="_iterator"/>
        /// </summary>
        private void VisitNext()
        {
            if (_isVisitEnded)
            {
                return;
            }

            for (int i = 0; i < _sliceLenght; i++)
            {
                if (_iterator.MoveNext() == false)
                {
                    EndProcess();

                    return;
                }

                if (_size == SettingsAccess.CellPxSize)
                {
                    _cell = _cells.GetCell(_iterator.Current);

                    if (_cell == null)
                    {
                        EndProcess();

                        return;
                    }

                    _sortedCells.Append(_cell.SortedCellItems);
                }
                else
                {
                    var cellPos = SettingsAccess.GetCellBeginPosition(_iterator.Current);

                    if (_cell == null ||
                        _cell.Pos != cellPos)
                    {
                        _cell = _cells.GetCell(cellPos);
                    }

                    if (_cell == null)
                    {
                        EndProcess();

                        return;
                    }

                    var cellItemPos = _cell.GetCellItemPosition(_iterator.Current);

                    ushort index = _cell.GetCellItemIndex(cellItemPos);

                    var rating = _cell.GetRating(index);

                    if (rating > 0)
                    {
                        var ratingDistance = (ushort)Mathf.Abs(rating - _playerRating);

                        if (_sortedCells.IsBelowThanMaxRatingDistance(ratingDistance))
                        {
                            _sortedCells.AppendCellItemFast(new SortedCellItem(cellPos, index, rating, ratingDistance));
                        }
                    }
                }
            }
        }