Пример #1
0
        /// <summary>
        /// Создание карты.
        /// </summary>
        /// <returns>
        /// Возвращает экземпляр карты.
        /// </returns>
        public Task <ISectorMap> CreateAsync(ISectorMapFactoryOptions generationOptions)
        {
            if (generationOptions is null)
            {
                throw new System.ArgumentNullException(nameof(generationOptions));
            }

            var roomFactoryOptions = generationOptions.OptionsSubScheme as ISectorRoomMapFactoryOptionsSubScheme;

            if (roomFactoryOptions is null)
            {
                throw new System.ArgumentException("Не задана схема генерации в настройках", nameof(generationOptions));
            }

            var map = CreateMapInstance();

            var edgeHash = new HashSet <string>();

            // Генерируем случайные координаты комнат
            var transitions = generationOptions.Transitions;

            var rooms = _roomGenerator.GenerateRoomsInGrid(roomFactoryOptions.RegionCount,
                                                           RoomMinSize,
                                                           roomFactoryOptions.RegionSize,
                                                           transitions);

            // Создаём узлы и рёбра комнат
            _roomGenerator.CreateRoomNodes(map, rooms, edgeHash);

            // Соединяем комнаты
            _roomGenerator.BuildRoomCorridors(map, rooms, edgeHash);

            // Указание регионов карты
            var regionIdCounter = 1;

            foreach (var room in rooms)
            {
                var passableRoomNodes = room.Nodes;
                var region            = new MapRegion(regionIdCounter, passableRoomNodes.Cast <IGraphNode>().ToArray());
                regionIdCounter++;
                map.Regions.Add(region);

                if (room.IsStart)
                {
                    region.IsStart = true;
                    continue;
                }

                if (room.Transitions?.Any() == true)
                {
                    region.ExitNodes = (from regionNode in region.Nodes
                                        where map.Transitions.Keys.Contains(regionNode)
                                        select regionNode).ToArray();

                    continue;
                }
            }

            return(Task.FromResult(map));
        }
Пример #2
0
        /// <summary>
        /// Создание карты.
        /// </summary>
        /// <returns>
        /// Возвращает экземпляр карты.
        /// </returns>
        public Task <ISectorMap> CreateAsync(object options)
        {
            if (options is null)
            {
                throw new System.ArgumentNullException(nameof(options));
            }

            var sectorScheme = (ISectorSubScheme)options;

            var map = CreateMapInstance();

            var edgeHash = new HashSet <string>();

            // Генерируем случайные координаты комнат
            var transitions = MapFactoryHelper.CreateTransitions(sectorScheme);

            var rooms = _roomGenerator.GenerateRoomsInGrid(sectorScheme.RegionCount,
                                                           RoomMinSize,
                                                           sectorScheme.RegionSize,
                                                           transitions);

            // Создаём узлы и рёбра комнат
            _roomGenerator.CreateRoomNodes(map, rooms, edgeHash);

            // Соединяем комнаты
            _roomGenerator.BuildRoomCorridors(map, rooms, edgeHash);

            // Указание регионов карты
            var regionIdCounter = 1;

            foreach (var room in rooms)
            {
                var passableRoomNodes = room.Nodes.Where(x => !x.IsObstacle);
                var region            = new MapRegion(regionIdCounter, passableRoomNodes.Cast <IMapNode>().ToArray());
                regionIdCounter++;
                map.Regions.Add(region);

                if (room.IsStart)
                {
                    region.IsStart = true;
                    continue;
                }

                if (room.Transitions?.Any() == true)
                {
                    region.ExitNodes = (from regionNode in region.Nodes
                                        where map.Transitions.Keys.Contains(regionNode)
                                        select regionNode).ToArray();

                    continue;
                }
            }

            return(Task.FromResult(map));
        }