//TODO Попробовать сделать загрузку всех провинций параллельно. // Выглядит так, что каждый запуск метода не зависит от предыдущих запусков. /// <summary> /// Создание соседних провинций. /// </summary> /// <param name="playerCoords"> Текущии координаты игрока. </param> /// <param name="worldManager"> Менеджер мира. </param> /// <param name="worldGenerator"> Генератор мира, используемый для создания новых провинций. </param> /// <returns> Возвращает объект Task. </returns> private static async System.Threading.Tasks.Task CreateNeighborRegionsAsync(OffsetCoords playerCoords, IWorldManager worldManager, IWorldGenerator worldGenerator, ProgressStorageService progressStorageService) { for (var offsetX = -1; offsetX <= 1; offsetX++) { for (var offsetY = -1; offsetY <= 1; offsetY++) { if (offsetX == 0 && offsetY == 0) { // Это нулевое смещение от текущего элемента. // Пропускаем, т.к. текущий элемент уже есть. continue; } var terrainX = playerCoords.X + offsetX; var terrainY = playerCoords.Y + offsetY; if (worldManager.Globe.Terrain.GetLowerBound(0) <= terrainX && terrainX <= worldManager.Globe.Terrain.GetUpperBound(0) && worldManager.Globe.Terrain[0].GetLowerBound(0) <= terrainY && terrainY <= worldManager.Globe.Terrain[0].GetUpperBound(0)) { var terrainCell = worldManager.Globe.Terrain[terrainX][terrainY]; if (!worldManager.Regions.ContainsKey(terrainCell)) { var createdNeiborRegion = await CreateRegionAsync(worldManager.Globe, terrainCell, worldGenerator, progressStorageService); worldManager.Regions[terrainCell] = createdNeiborRegion; } } } } }
private static async System.Threading.Tasks.Task <GlobeRegion> CreateRegionAsync(Globe globe, TerrainCell startCell, IWorldGenerator globeGenerator, ProgressStorageService progressStorageService) { return(await globeGenerator.GenerateRegionAsync(globe, startCell)); }