示例#1
0
    /// <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;
    }
示例#2
0
    /// <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);
                }
            }
        }
    }