diff --git a/DungeonShooting_Godot/resource/map/RoomConfig.json b/DungeonShooting_Godot/resource/map/RoomConfig.json index 5ac691d..e5c9d13 100644 --- a/DungeonShooting_Godot/resource/map/RoomConfig.json +++ b/DungeonShooting_Godot/resource/map/RoomConfig.json @@ -14,23 +14,43 @@ "DoorAreaInfos": [ { "Direction": 1, - "Start": 128, - "End": 208 + "Start": 208, + "End": 320 }, { "Direction": 3, - "Start": 128, - "End": 208 + "Start": 16, + "End": 128 }, { "Direction": 2, - "Start": 128, - "End": 208 + "Start": 16, + "End": 128 }, { "Direction": 0, - "Start": 128, - "End": 208 + "Start": 16, + "End": 128 + }, + { + "Direction": 1, + "Start": 16, + "End": 128 + }, + { + "Direction": 3, + "Start": 208, + "End": 320 + }, + { + "Direction": 0, + "Start": 208, + "End": 320 + }, + { + "Direction": 2, + "Start": 208, + "End": 320 } ] } diff --git a/DungeonShooting_Godot/resource/map/tiledata/Room3.json b/DungeonShooting_Godot/resource/map/tiledata/Room3.json index f40ad8f..5a3fd83 100644 --- a/DungeonShooting_Godot/resource/map/tiledata/Room3.json +++ b/DungeonShooting_Godot/resource/map/tiledata/Room3.json @@ -10,23 +10,43 @@ "DoorAreaInfos": [ { "Direction": 1, - "Start": 128, - "End": 208 + "Start": 208, + "End": 320 }, { "Direction": 3, - "Start": 128, - "End": 208 + "Start": 16, + "End": 128 }, { "Direction": 2, - "Start": 128, - "End": 208 + "Start": 16, + "End": 128 }, { "Direction": 0, - "Start": 128, - "End": 208 + "Start": 16, + "End": 128 + }, + { + "Direction": 1, + "Start": 16, + "End": 128 + }, + { + "Direction": 3, + "Start": 208, + "End": 320 + }, + { + "Direction": 0, + "Start": 208, + "End": 320 + }, + { + "Direction": 2, + "Start": 208, + "End": 320 } ] } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs b/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs index b2dbb9b..96e2387 100644 --- a/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs +++ b/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs @@ -277,7 +277,6 @@ //包含拐角的通道 return TryConnectCrossDoor(room, roomDoor, nextRoom, nextRoomDoor); - //return false; } /// @@ -384,149 +383,93 @@ return false; } + /// + /// 尝试寻找包含拐角的两个房间的连通的门, 返回是否找到 + /// private bool TryConnectCrossDoor(RoomInfo room, RoomDoorInfo roomDoor, RoomInfo nextRoom, RoomDoorInfo nextRoomDoor) { - var offset1 = 0; - var offset2 = 0; //焦点 - Vector2 cross; + Vector2 cross = default; if (room.GetHorizontalStart() > nextRoom.GetHorizontalStart()) { if (room.GetVerticalStart() > nextRoom.GetVerticalStart()) { - if (Utils.RandomBoolean()) + if (Utils.RandomBoolean()) //↑ //→ { - roomDoor.Direction = DoorDirection.N; //↑ - nextRoomDoor.Direction = DoorDirection.E; //→ - - if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + if (!TryConnect_NE_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross) && + !TryConnect_WS_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross)) { return false; } - - roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, room.GetVerticalStart()); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalEnd(), - nextRoom.GetVerticalStart() + offset2); - cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); } - else + else //← //↓ { - roomDoor.Direction = DoorDirection.W; //← - nextRoomDoor.Direction = DoorDirection.S; //↓ - - if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + if (!TryConnect_WS_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross) && + !TryConnect_NE_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross)) { return false; } - - roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart(), room.GetVerticalStart() + offset2); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset1, - nextRoom.GetVerticalEnd()); - cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); } } else { - if (Utils.RandomBoolean()) + if (Utils.RandomBoolean()) //↓ //→ { - roomDoor.Direction = DoorDirection.S; //↓ - nextRoomDoor.Direction = DoorDirection.E; //→ - - if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + if (!TryConnect_SE_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross) && + !TryConnect_WN_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross)) { return false; } - - roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, room.GetVerticalEnd()); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalEnd(), - nextRoom.GetVerticalStart() + offset2); - cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); } - else + else //← //↑ { - roomDoor.Direction = DoorDirection.W; //← - nextRoomDoor.Direction = DoorDirection.N; //↑ - - if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + if (!TryConnect_WN_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross) && + !TryConnect_SE_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross)) { return false; } - - roomDoor.OriginPosition = - new Vector2(room.GetHorizontalStart(), room.GetVerticalStart() + offset2); // - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset2, - nextRoom.GetVerticalStart()); - cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); } } } else { - if (room.GetVerticalStart() > nextRoom.GetVerticalStart()) + if (room.GetVerticalStart() > nextRoom.GetVerticalStart()) //→ //↓ { if (Utils.RandomBoolean()) { - roomDoor.Direction = DoorDirection.E; //→ - nextRoomDoor.Direction = DoorDirection.S; //↓ - - if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + if (!TryConnect_ES_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross) && + !TryConnect_NW_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross)) { return false; } - - roomDoor.OriginPosition = new Vector2(room.GetHorizontalEnd(), room.GetVerticalStart() + offset2); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset1, - nextRoom.GetVerticalEnd()); - cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); } - else + else //↑ //← { - roomDoor.Direction = DoorDirection.N; //↑ - nextRoomDoor.Direction = DoorDirection.W; //← - - if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + if (!TryConnect_NW_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross) && + !TryConnect_ES_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross)) { return false; } - - roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, room.GetVerticalStart()); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart(), - nextRoom.GetVerticalStart() + offset2); - cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); } } else { - if (Utils.RandomBoolean()) + if (Utils.RandomBoolean()) //→ //↑ { - roomDoor.Direction = DoorDirection.E; //→ - nextRoomDoor.Direction = DoorDirection.N; //↑ - - if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + if (!TryConnect_EN_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross) && + !TryConnect_SW_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross)) { return false; } - - roomDoor.OriginPosition = new Vector2(room.GetHorizontalEnd(), - room.GetVerticalStart() + offset2); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset1, nextRoom.GetVerticalStart()); - cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); } - else + else //↓ //← { - roomDoor.Direction = DoorDirection.S; //↓ - nextRoomDoor.Direction = DoorDirection.W; //← - - if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + if (!TryConnect_SW_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross) && + !TryConnect_EN_Door(room, nextRoom, roomDoor, nextRoomDoor, ref cross)) { return false; } - - roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, - room.GetVerticalEnd()); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart(), nextRoom.GetVerticalStart() + offset2); - cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); } } } @@ -652,6 +595,159 @@ } } + private bool TryConnect_NE_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + { + var offset1 = 0; + var offset2 = 0; + roomDoor.Direction = DoorDirection.N; //↑ + nextRoomDoor.Direction = DoorDirection.E; //→ + + if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + { + return false; + } + + roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, room.GetVerticalStart()); + nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalEnd(), + nextRoom.GetVerticalStart() + offset2); + cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + return true; + } + + private bool TryConnect_WS_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + { + var offset1 = 0; + var offset2 = 0; + roomDoor.Direction = DoorDirection.W; //← + nextRoomDoor.Direction = DoorDirection.S; //↓ + + if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + { + return false; + } + + roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart(), room.GetVerticalStart() + offset2); + nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset1, + nextRoom.GetVerticalEnd()); + cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + return true; + } + + private bool TryConnect_SE_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + { + var offset1 = 0; + var offset2 = 0; + roomDoor.Direction = DoorDirection.S; //↓ + nextRoomDoor.Direction = DoorDirection.E; //→ + + if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + { + return false; + } + + roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, room.GetVerticalEnd()); + nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalEnd(), + nextRoom.GetVerticalStart() + offset2); + cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + return true; + } + + private bool TryConnect_WN_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + { + var offset1 = 0; + var offset2 = 0; + roomDoor.Direction = DoorDirection.W; //← + nextRoomDoor.Direction = DoorDirection.N; //↑ + + if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + { + return false; + } + + roomDoor.OriginPosition = + new Vector2(room.GetHorizontalStart(), room.GetVerticalStart() + offset2); // + nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset2, + nextRoom.GetVerticalStart()); + cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + return true; + } + + private bool TryConnect_ES_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + { + var offset1 = 0; + var offset2 = 0; + roomDoor.Direction = DoorDirection.E; //→ + nextRoomDoor.Direction = DoorDirection.S; //↓ + + if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + { + return false; + } + + roomDoor.OriginPosition = new Vector2(room.GetHorizontalEnd(), room.GetVerticalStart() + offset2); + nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset1, + nextRoom.GetVerticalEnd()); + cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + return true; + } + + private bool TryConnect_NW_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + { + var offset1 = 0; + var offset2 = 0; + roomDoor.Direction = DoorDirection.N; //↑ + nextRoomDoor.Direction = DoorDirection.W; //← + + if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + { + return false; + } + + roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, room.GetVerticalStart()); + nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart(), + nextRoom.GetVerticalStart() + offset2); + cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + return true; + } + + private bool TryConnect_EN_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + { + var offset1 = 0; + var offset2 = 0; + roomDoor.Direction = DoorDirection.E; //→ + nextRoomDoor.Direction = DoorDirection.N; //↑ + + if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + { + return false; + } + + roomDoor.OriginPosition = new Vector2(room.GetHorizontalEnd(), + room.GetVerticalStart() + offset2); + nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset1, nextRoom.GetVerticalStart()); + cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + return true; + } + + private bool TryConnect_SW_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + { + var offset1 = 0; + var offset2 = 0; + roomDoor.Direction = DoorDirection.S; //↓ + nextRoomDoor.Direction = DoorDirection.W; //← + + if (!FindCrossPassage(room, nextRoom, roomDoor, nextRoomDoor, ref offset1, ref offset2)) + { + return false; + } + + roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, + room.GetVerticalEnd()); + nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart(), nextRoom.GetVerticalStart() + offset2); + cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + return true; + } + /// /// 查找房间的连接通道, 函数返回是否找到对应的门, 通过 result 返回 x/y 轴坐标 ///