示例#1
0
        /// <summary>
        /// Соединяет две комнаты коридором.
        /// </summary>
        /// <param name="map"> Карта, над которой идёт работа. </param>
        /// <param name="room"> Комната, которую соединяем. </param>
        /// <param name="selectedRoom"> Целевая комната для соединения. </param>
        /// <param name="edgeHash"> Хэш рёбер (для оптимизации). </param>
        protected static void ConnectRoomsWithCorridor(IMap map, Room room, Room selectedRoom, HashSet <string> edgeHash)
        {
            if (room is null)
            {
                throw new System.ArgumentNullException(nameof(room));
            }

            if (selectedRoom is null)
            {
                throw new System.ArgumentNullException(nameof(selectedRoom));
            }

            var currentNode = GetRoomCenterNode(room);
            var targetNode  = GetRoomCenterNode(selectedRoom);

            var points = CubeCoordsHelper.CubeDrawLine(currentNode.CubeCoords, targetNode.CubeCoords);

            foreach (var point in points)
            {
                var offsetCoords = HexHelper.ConvertToOffset(point);

                // Это происходит, потому что если при нулевом Х для обеих комнат
                // попытаться отрисовать линию коридора, то она будет змейкой заходить за 0.
                // Нужно искать решение получше.
                offsetCoords = new OffsetCoords(offsetCoords.X < 0 ? 0 : offsetCoords.X,
                                                offsetCoords.Y < 0 ? 0 : offsetCoords.Y);

                var node = RoomHelper.CreateCorridorNode(map, edgeHash, currentNode, offsetCoords.X, offsetCoords.Y);
                currentNode = node;
            }
        }
示例#2
0
        private void CreateOneRoomNodes(ISectorMap map, HashSet <string> edgeHash, Room room, Size cellSize)
        {
            var interiorObjects = _randomSource.RollInteriorObjects(room.Width, room.Height);

            for (var x = 0; x < room.Width; x++)
            {
                for (var y = 0; y < room.Height; y++)
                {
                    var nodeX = x + room.PositionX * cellSize.Width;
                    var nodeY = y + room.PositionY * cellSize.Height;

                    var isObstacle          = false;
                    var interiorObjectMetas = interiorObjects
                                              .SingleOrDefault(o => o.Coords.CompsEqual(x, y));

                    if (interiorObjectMetas != null)
                    {
                        //TODO Сделать так, чтобы укрытия не генерировались на узлах с выходами
                        // Как вариант - если выбираем узел, как выход, то снимаем флаг укрытия.
                        // Вообще, нужно поискать алгоритмы, которые бы расставляли укрытия и выходы, оставляя комнату проходимой.
                        isObstacle = true;
                    }

                    var node = new HexNode(nodeX, nodeY, isObstacle);

                    room.Nodes.Add(node);
                    map.AddNode(node);

                    RoomHelper.AddAllNeighborToMap(map, edgeHash, room, node);
                }
            }

            CreateTransitions(map, room);
        }
示例#3
0
        private void CreateOneRoomNodes(ISectorMap map, HashSet <string> edgeHash, Room room, Size cellSize)
        {
            for (var x = 0; x < room.Width; x++)
            {
                for (var y = 0; y < room.Height; y++)
                {
                    var nodeX = x + (room.PositionX * cellSize.Width);
                    var nodeY = y + (room.PositionY * cellSize.Height);

                    var node = new HexNode(nodeX, nodeY);

                    room.Nodes.Add(node);
                    map.AddNode(node);

                    RoomHelper.AddAllNeighborToMap(map, edgeHash, room, node);
                }
            }

            CreateTransitions(map, room);
        }
示例#4
0
        /// <summary>
        /// Создаёт узлы комнат на карте.
        /// </summary>
        /// <param name="map">Карта, в рамках которой происходит генерация.</param>
        /// <param name="rooms">Комнаты, для которых создаются узлы графа карты.</param>
        /// <param name="edgeHash">Хэш рёбер. Нужен для оптимизации при создании узлов графа карты.</param>
        public override void CreateRoomNodes(ISectorMap map, IEnumerable <Room> rooms, HashSet <string> edgeHash)
        {
            if (map is null)
            {
                throw new ArgumentNullException(nameof(map));
            }

            if (rooms is null)
            {
                throw new ArgumentNullException(nameof(rooms));
            }

            if (edgeHash is null)
            {
                throw new ArgumentNullException(nameof(edgeHash));
            }

            var cellSize = RoomHelper.CalcCellSize(rooms);

            foreach (var room in rooms)
            {
                CreateOneRoomNodes(map, edgeHash, room, cellSize);
            }
        }