diff --git a/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs b/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs index 54f60f9..58b9486 100644 --- a/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs +++ b/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs @@ -275,6 +275,116 @@ } } + //包含拐角的通道 + return TryConnectCrossDoor(room, roomDoor, nextRoom, nextRoomDoor); + } + + /// + /// 尝试寻找横轴方向上两个房间的连通的门, 只查找直线通道, 返回是否找到 + /// + private bool TryConnectHorizontalDoor(RoomInfo room, RoomDoorInfo roomDoor, RoomInfo nextRoom, RoomDoorInfo nextRoomDoor) + { + var overlapX = Mathf.Min(room.Position.X + room.Size.X, nextRoom.Position.X + nextRoom.Size.X) - + Mathf.Max(room.Position.X, nextRoom.Position.X); + //这种情况下x轴有重叠 + if (overlapX >= 6) + { + //找到重叠区域 + var rangeList = FindPassage(room, nextRoom, + room.Position.Y < nextRoom.Position.Y ? DoorDirection.S : DoorDirection.N); + + while (rangeList.Count > 0) + { + //找到重叠区域 + var range = Utils.RandomChooseAndRemove(rangeList); + var x = Utils.RandomRangeInt(range.X, range.Y); + + if (room.Position.Y < nextRoom.Position.Y) //room在上, nextRoom在下 + { + roomDoor.Direction = DoorDirection.S; + nextRoomDoor.Direction = DoorDirection.N; + roomDoor.OriginPosition = new Vector2(x, room.Position.Y + room.Size.Y); + nextRoomDoor.OriginPosition = new Vector2(x, nextRoom.Position.Y); + } + else //room在下, nextRoom在上 + { + roomDoor.Direction = DoorDirection.N; + nextRoomDoor.Direction = DoorDirection.S; + roomDoor.OriginPosition = new Vector2(x, room.Position.Y); + nextRoomDoor.OriginPosition = new Vector2(x, nextRoom.Position.Y + nextRoom.Size.Y); + } + + //判断门之间的通道是否有物体碰到 + if (!AddCorridorToGridRange(roomDoor, nextRoomDoor)) + { + //此门不能连通 + continue; + } + + //没有撞到物体 + room.Doors.Add(roomDoor); + nextRoom.Doors.Add(nextRoomDoor); + return true; + } + } + + return false; + } + + /// + /// 尝试寻找纵轴方向上两个房间的连通的门, 只查找直线通道, 返回是否找到 + /// + private bool TryConnectVerticalDoor(RoomInfo room, RoomDoorInfo roomDoor, RoomInfo nextRoom, RoomDoorInfo nextRoomDoor) + { + var overlapY = Mathf.Min(room.Position.Y + room.Size.Y, nextRoom.Position.Y + nextRoom.Size.Y) - + Mathf.Max(room.Position.Y, nextRoom.Position.Y); + //这种情况下y轴有重叠 + if (overlapY >= 6) + { + //找到重叠区域 + var rangeList = FindPassage(room, nextRoom, + room.Position.X < nextRoom.Position.X ? DoorDirection.E : DoorDirection.W); + + while (rangeList.Count > 0) + { + //找到重叠区域 + var range = Utils.RandomChooseAndRemove(rangeList); + var y = Utils.RandomRangeInt(range.X, range.Y); + + if (room.Position.X < nextRoom.Position.X) //room在左, nextRoom在右 + { + roomDoor.Direction = DoorDirection.E; + nextRoomDoor.Direction = DoorDirection.W; + roomDoor.OriginPosition = new Vector2(room.Position.X + room.Size.X, y); + nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X, y); + } + else //room在右, nextRoom在左 + { + roomDoor.Direction = DoorDirection.W; + nextRoomDoor.Direction = DoorDirection.E; + roomDoor.OriginPosition = new Vector2(room.Position.X, y); + nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X + nextRoom.Size.X, y); + } + + //判断门之间的通道是否有物体碰到 + if (!AddCorridorToGridRange(roomDoor, nextRoomDoor)) + { + //此门不能连通 + continue; + } + + //没有撞到物体 + room.Doors.Add(roomDoor); + nextRoom.Doors.Add(nextRoomDoor); + return true; + } + } + + return false; + } + + private bool TryConnectCrossDoor(RoomInfo room, RoomDoorInfo roomDoor, RoomInfo nextRoom, RoomDoorInfo nextRoomDoor) + { //这种情况下x和y轴都没有重叠, 那么就只能生成拐角通道了 var overlapX = Mathf.Min(room.Position.X + room.Size.X, nextRoom.Position.X + nextRoom.Size.X) - @@ -282,8 +392,8 @@ var overlapY = Mathf.Min(room.Position.Y + room.Size.Y, nextRoom.Position.Y + nextRoom.Size.Y) - Mathf.Max(room.Position.Y, nextRoom.Position.Y); - var offset1 = Mathf.Clamp((int)overlapX + 2, 2, 6); - var offset2 = Mathf.Clamp((int)overlapY + 2, 2, 6); + var offset1 = Mathf.Clamp(overlapX + 2, 2, 6); + var offset2 = Mathf.Clamp(overlapY + 2, 2, 6); //焦点 Vector2 cross; @@ -404,110 +514,6 @@ nextRoom.Doors.Add(nextRoomDoor); return true; } - - /// - /// 尝试寻找横轴方向上两个房间的连通的门, 只查找直线通道, 返回是否找到 - /// - private bool TryConnectHorizontalDoor(RoomInfo room, RoomDoorInfo roomDoor, RoomInfo nextRoom, RoomDoorInfo nextRoomDoor) - { - var overlapX = Mathf.Min(room.Position.X + room.Size.X, nextRoom.Position.X + nextRoom.Size.X) - - Mathf.Max(room.Position.X, nextRoom.Position.X); - //这种情况下x轴有重叠 - if (overlapX >= 6) - { - //找到重叠区域 - var rangeList = FindPassage(room, nextRoom, - room.Position.Y < nextRoom.Position.Y ? DoorDirection.S : DoorDirection.N); - - while (rangeList.Count > 0) - { - //找到重叠区域 - var range = Utils.RandomChooseAndRemove(rangeList); - var x = Utils.RandomRangeInt(range.X, range.Y); - - if (room.Position.Y < nextRoom.Position.Y) //room在上, nextRoom在下 - { - roomDoor.Direction = DoorDirection.S; - nextRoomDoor.Direction = DoorDirection.N; - roomDoor.OriginPosition = new Vector2(x, room.Position.Y + room.Size.Y); - nextRoomDoor.OriginPosition = new Vector2(x, nextRoom.Position.Y); - } - else //room在下, nextRoom在上 - { - roomDoor.Direction = DoorDirection.N; - nextRoomDoor.Direction = DoorDirection.S; - roomDoor.OriginPosition = new Vector2(x, room.Position.Y); - nextRoomDoor.OriginPosition = new Vector2(x, nextRoom.Position.Y + nextRoom.Size.Y); - } - - //判断门之间的通道是否有物体碰到 - if (!AddCorridorToGridRange(roomDoor, nextRoomDoor)) - { - //此门不能连通 - continue; - } - - //没有撞到物体 - room.Doors.Add(roomDoor); - nextRoom.Doors.Add(nextRoomDoor); - return true; - } - } - - return false; - } - - /// - /// 尝试寻找纵轴方向上两个房间的连通的门, 只查找直线通道, 返回是否找到 - /// - private bool TryConnectVerticalDoor(RoomInfo room, RoomDoorInfo roomDoor, RoomInfo nextRoom, RoomDoorInfo nextRoomDoor) - { - var overlapY = Mathf.Min(room.Position.Y + room.Size.Y, nextRoom.Position.Y + nextRoom.Size.Y) - - Mathf.Max(room.Position.Y, nextRoom.Position.Y); - //这种情况下y轴有重叠 - if (overlapY >= 6) - { - //找到重叠区域 - var rangeList = FindPassage(room, nextRoom, - room.Position.X < nextRoom.Position.X ? DoorDirection.E : DoorDirection.W); - - while (rangeList.Count > 0) - { - //找到重叠区域 - var range = Utils.RandomChooseAndRemove(rangeList); - var y = Utils.RandomRangeInt(range.X, range.Y); - - if (room.Position.X < nextRoom.Position.X) //room在左, nextRoom在右 - { - roomDoor.Direction = DoorDirection.E; - nextRoomDoor.Direction = DoorDirection.W; - roomDoor.OriginPosition = new Vector2(room.Position.X + room.Size.X, y); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X, y); - } - else //room在右, nextRoom在左 - { - roomDoor.Direction = DoorDirection.W; - nextRoomDoor.Direction = DoorDirection.E; - roomDoor.OriginPosition = new Vector2(room.Position.X, y); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.Position.X + nextRoom.Size.X, y); - } - - //判断门之间的通道是否有物体碰到 - if (!AddCorridorToGridRange(roomDoor, nextRoomDoor)) - { - //此门不能连通 - continue; - } - - //没有撞到物体 - room.Doors.Add(roomDoor); - nextRoom.Doors.Add(nextRoomDoor); - return true; - } - } - - return false; - } /// /// 查找房间的连接通道, 函数返回是否找到对应的门, 通过 result 返回 x/y 轴坐标 diff --git a/DungeonShooting_Godot/src/game/ui/InteractiveTipBar.cs b/DungeonShooting_Godot/src/game/ui/InteractiveTipBar.cs index 7cf7308..76dc685 100644 --- a/DungeonShooting_Godot/src/game/ui/InteractiveTipBar.cs +++ b/DungeonShooting_Godot/src/game/ui/InteractiveTipBar.cs @@ -30,7 +30,6 @@ /// /// 所在坐标 /// 显示图标 - /// 显示文本 public void ShowBar(ActivityObject target, string icon) { Target = target;