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