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)); } }
/// <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); } } }
/// <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)); } } }
/// <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)); } } } } }