/// <summary> /// 创建房间数据 /// </summary> /// <param name="area"></param> private void CreateRoomData(MapArea area) { if (area == null) { return; } var maxW = area.Wdith - 2; var maxH = area.Height - 2; var minW = maxW / 2; var minH = maxH / 2; var roomData = new RoomData() { RoomType = RoomType.Room, Id = RoomDatas.Count, Width = Const.Random.Next(minW, maxW), Height = Const.Random.Next(minH, maxH), }; var xMax = area.Wdith - roomData.Width; var yMax = area.Height - roomData.Height; roomData.Coordinate = new Coordinate(Const.Random.Next(0, xMax), Const.Random.Next(0, yMax)) + area.Coordinate; roomData.Build(); RoomDatas.Add(roomData); area.RoomData = roomData; }
/// <summary> /// 创建走廊数据 /// </summary> /// <param name="area"></param> private void CreateCorridors(MapArea area) { if (area == null || area.LeftChild == null || area.RightChild == null) { return; } var area1 = area.LeftChild; var area2 = area.RightChild; CreateCorridors(area1); CreateCorridors(area2); var room1 = area1.GetRoom(); var room2 = area2.GetRoom(); if (room1 == null || room2 == null) { return; } var id = CorridorDatas.Count; var isVertical = area1.Coordinate.X == area2.Coordinate.X; var doors = FindRoomsDoor(room1, room2, isVertical); var w = Mathf.Abs(doors[1].X - doors[0].X) + 1; var h = Mathf.Abs(doors[1].Y - doors[0].Y) + 1; if (isVertical) // 垂直 { if (w > corridorWidth) // L形 { var startX = doors[0].X < doors[1].X ? doors[0].X : doors[1].X; var endX = doors[0].X < doors[1].X ? doors[1].X - corridorWidth + 1 : doors[1].X; var corridorData = new CorridorData() { IsStraight = false, IsVerticle = true, }; var roomData = new RoomData() { RoomType = RoomType.Corridor, Id = id, Width = w, Height = h >= corridorWidth ? corridorWidth : h, Coordinate = new Coordinate(startX, doors[0].Y), Start = room1.Id, End = room2.Id, }; roomData.Build(); corridorData.RoomData.Add(roomData); if (h > corridorWidth) { roomData = new RoomData() { RoomType = RoomType.Corridor, Id = id, Width = corridorWidth, Height = h - corridorWidth, Coordinate = new Coordinate(endX, doors[0].Y + corridorWidth), Start = room1.Id, End = room2.Id, }; roomData.Build(); corridorData.RoomData.Add(roomData); } CorridorDatas.Add(corridorData); } else { if (h > 0) { var corridorData = new CorridorData() { IsStraight = true, IsVerticle = true, }; var roomData = new RoomData() { RoomType = RoomType.Corridor, Id = id, Width = corridorWidth, Height = h, Coordinate = doors[0], Start = room1.Id, End = room2.Id, }; roomData.Build(); corridorData.RoomData.Add(roomData); CorridorDatas.Add(corridorData); } } } else // 水平 { if (h > corridorWidth) // L形 { var startY = doors[0].Y < doors[1].Y ? doors[0].Y : doors[1].Y; var endY = doors[0].Y < doors[1].Y ? doors[1].Y - corridorWidth + 1 : doors[1].Y; var corridorData = new CorridorData() { IsStraight = false, IsVerticle = false, }; var roomData = new RoomData() { RoomType = RoomType.Corridor, Id = id, Width = w, Height = h >= corridorWidth ? corridorWidth : h, Coordinate = new Coordinate(doors[0].X, startY), Start = room1.Id, End = room2.Id, }; roomData.Build(); corridorData.RoomData.Add(roomData); if (h > corridorWidth) { roomData = new RoomData() { RoomType = RoomType.Corridor, Id = id, Width = corridorWidth, Height = h - corridorWidth, Coordinate = new Coordinate(doors[0].X, endY), Start = room1.Id, End = room2.Id, }; roomData.Build(); corridorData.RoomData.Add(roomData); CorridorDatas.Add(corridorData); } } else { if (w > 0) { var corridorData = new CorridorData() { IsStraight = false, IsVerticle = false, }; var roomData = new RoomData() { RoomType = RoomType.Corridor, Id = id, Width = w, Height = corridorWidth, Coordinate = doors[0], Start = room1.Id, End = room2.Id, }; roomData.Build(); corridorData.RoomData.Add(roomData); CorridorDatas.Add(corridorData); } } } }