diff --git a/DungeonShooting_Godot/scene/Room.tscn b/DungeonShooting_Godot/scene/Room.tscn index 12df33d..6c5db9e 100644 --- a/DungeonShooting_Godot/scene/Room.tscn +++ b/DungeonShooting_Godot/scene/Room.tscn @@ -121,8 +121,6 @@ [node name="MiddleTileMap" type="TileMap" parent="SortRoot/MapRoot"] tile_set = SubResource( 2 ) cell_size = Vector2( 16, 16 ) -cell_tile_origin = 2 -cell_y_sort = true collision_mask = 0 bake_navigation = true format = 1 diff --git a/DungeonShooting_Godot/src/game/room/DungeonTileManager.cs b/DungeonShooting_Godot/src/game/room/DungeonTileManager.cs index d762d4e..bd6592b 100644 --- a/DungeonShooting_Godot/src/game/room/DungeonTileManager.cs +++ b/DungeonShooting_Godot/src/game/room/DungeonTileManager.cs @@ -14,17 +14,17 @@ //铺房间 FillRect(floor, config.In, roomInfo.Position + Vector2.One, roomInfo.Size - new Vector2(2, 2)); - FillRect(top, config.LT, roomInfo.Position, Vector2.One); - FillRect(top, config.L, roomInfo.Position + new Vector2(0, 1), new Vector2(1, roomInfo.Size.y - 2)); - FillRect(top, config.LB, roomInfo.Position + new Vector2(0, roomInfo.Size.y - 1), new Vector2(1, 1)); - FillRect(top, config.B, roomInfo.Position + new Vector2(1, roomInfo.Size.y - 1), - new Vector2(roomInfo.Size.x - 2, 1)); - FillRect(top, config.RB, roomInfo.Position + new Vector2(roomInfo.Size.x - 1, roomInfo.Size.y - 1), - Vector2.One); - FillRect(top, config.R, roomInfo.Position + new Vector2(roomInfo.Size.x - 1, 1), - new Vector2(1, roomInfo.Size.y - 2)); - FillRect(top, config.RT, roomInfo.Position + new Vector2(roomInfo.Size.x - 1, 0), Vector2.One); - FillRect(middle, config.T, roomInfo.Position + Vector2.Right, new Vector2(roomInfo.Size.x - 2, 1)); + FillRect(top, config.LT, roomInfo.Position, Vector2.One); + FillRect(top, config.L, roomInfo.Position + new Vector2(0, 1), new Vector2(1, roomInfo.Size.y - 2)); + FillRect(top, config.LB, roomInfo.Position + new Vector2(0, roomInfo.Size.y - 1), new Vector2(1, 1)); + FillRect(top, config.B, roomInfo.Position + new Vector2(1, roomInfo.Size.y - 1), + new Vector2(roomInfo.Size.x - 2, 1)); + FillRect(top, config.RB, roomInfo.Position + new Vector2(roomInfo.Size.x - 1, roomInfo.Size.y - 1), + Vector2.One); + FillRect(top, config.R, roomInfo.Position + new Vector2(roomInfo.Size.x - 1, 1), + new Vector2(1, roomInfo.Size.y - 2)); + FillRect(top, config.RT, roomInfo.Position + new Vector2(roomInfo.Size.x - 1, 0), Vector2.One); + FillRect(middle, config.T, roomInfo.Position + Vector2.Right, new Vector2(roomInfo.Size.x - 2, 1)); //铺过道 foreach (var doorInfo in roomInfo.Doors) @@ -52,34 +52,13 @@ rect.Size = new Vector2(rect.Size.x, GenerateDungeon.CorridorWidth); } - if (dir == 0) //横向 { - FillRect(floor, config.In, rect.Position + new Vector2(0, 1), rect.Size - new Vector2(0, 2)); - FillRect(middle, config.T, rect.Position, new Vector2(rect.Size.x, 1)); - FillRect(top, config.B, rect.Position + new Vector2(0, rect.Size.y - 1), new Vector2(rect.Size.x, 1)); - - //左 - ClearRect(top, rect.Position + new Vector2(-1, 1), new Vector2(1, rect.Size.y - 2)); - FillRect(floor, config.In, rect.Position + new Vector2(-1, 1), new Vector2(1, rect.Size.y - 2)); - - //又 - ClearRect(top, rect.Position + new Vector2(rect.Size.x, 1), new Vector2(1, rect.Size.y - 2)); - FillRect(floor, config.In, rect.Position + new Vector2(rect.Size.x, 1), new Vector2(1, rect.Size.y - 2)); + FullHorizontalGalleryWall(floor, middle, top, config, rect); } else //纵向 { - FillRect(floor, config.In, rect.Position + new Vector2(1, 0), rect.Size - new Vector2(2, 0)); - FillRect(top, config.L, rect.Position, new Vector2(1, rect.Size.y)); - FillRect(top, config.R, rect.Position + new Vector2(rect.Size.x - 1, 0), new Vector2(1, rect.Size.y)); - - //上 - ClearRect(top, rect.Position + new Vector2(1, -1), new Vector2(rect.Size.x - 2, 1)); - FillRect(floor, config.In, rect.Position + new Vector2(1, -1), new Vector2(rect.Size.x - 2, 1)); - - //下 - ClearRect(middle, rect.Position + new Vector2(1, rect.Size.y), new Vector2(rect.Size.x - 2, 1)); - FillRect(floor, config.In, rect.Position + new Vector2(1, rect.Size.y), new Vector2(rect.Size.x - 2, 1)); + FullVerticalGalleryWall(floor, middle, top, config, rect); } } else //带交叉点 @@ -91,6 +70,7 @@ Rect2 rect; Rect2 rect2; + //计算范围 switch (doorInfo.Direction) { case DoorDirection.E: //→ @@ -124,15 +104,13 @@ doorInfo.Cross.x, doorInfo.Cross.y + GenerateDungeon.CorridorWidth, GenerateDungeon.CorridorWidth, - doorInfo.OriginPosition.y - doorInfo.Cross.y + doorInfo.OriginPosition.y - (doorInfo.Cross.y + GenerateDungeon.CorridorWidth) ); break; default: rect = new Rect2(); break; } - - switch (doorInfo.ConnectDoor.Direction) { case DoorDirection.E: //→ @@ -147,8 +125,7 @@ rect2 = new Rect2( doorInfo.Cross.x + GenerateDungeon.CorridorWidth, doorInfo.Cross.y, - doorInfo.ConnectDoor.OriginPosition.x - - (doorInfo.Cross.x + GenerateDungeon.CorridorWidth), + doorInfo.ConnectDoor.OriginPosition.x - (doorInfo.Cross.x + GenerateDungeon.CorridorWidth), GenerateDungeon.CorridorWidth ); break; @@ -167,7 +144,7 @@ doorInfo.Cross.x, doorInfo.Cross.y + GenerateDungeon.CorridorWidth, GenerateDungeon.CorridorWidth, - doorInfo.ConnectDoor.OriginPosition.y - doorInfo.Cross.y + doorInfo.ConnectDoor.OriginPosition.y - (doorInfo.Cross.y + GenerateDungeon.CorridorWidth) ); break; default: @@ -178,8 +155,63 @@ FillRect(floor, config.In, rect.Position, rect.Size); FillRect(floor, config.In, rect2.Position, rect2.Size); FillRect(floor, config.In, doorInfo.Cross, new Vector2(GenerateDungeon.CorridorWidth, GenerateDungeon.CorridorWidth)); + + if (dir1 == 0) + { + FullHorizontalGalleryWall(floor, middle, top, config, rect); + } + else + { + FullVerticalGalleryWall(floor, middle, top, config, rect); + } + if (dir2 == 0) + { + FullHorizontalGalleryWall(floor, middle, top, config, rect2); + } + else + { + FullVerticalGalleryWall(floor, middle, top, config, rect2); + } - + //在房间墙上开洞 + switch (doorInfo.Direction) + { + case DoorDirection.E: //→ + ClearRect(top, doorInfo.OriginPosition + new Vector2(-1, 1), new Vector2(1, rect.Size.y - 2)); + FillRect(floor, config.In, doorInfo.OriginPosition + new Vector2(-1, 1), new Vector2(1, rect.Size.y - 2)); + break; + case DoorDirection.W: //← + ClearRect(top, doorInfo.OriginPosition + new Vector2(0, 1), new Vector2(1, rect.Size.y - 2)); + FillRect(floor, config.In, doorInfo.OriginPosition + new Vector2(0, 1), new Vector2(1, rect.Size.y - 2)); + break; + case DoorDirection.S: //↓ + ClearRect(top, doorInfo.OriginPosition + new Vector2(1, -1), new Vector2(rect.Size.x - 2, 1)); + FillRect(floor, config.In, doorInfo.OriginPosition + new Vector2(1, -1), new Vector2(rect.Size.x - 2, 1)); + break; + case DoorDirection.N: //↑ + ClearRect(middle, doorInfo.OriginPosition + new Vector2(1, 2), new Vector2(rect.Size.x - 2, 1)); + FillRect(floor, config.In, doorInfo.OriginPosition + new Vector2(1, 0), new Vector2(rect.Size.x - 2, 1)); + break; + } + switch (doorInfo.ConnectDoor.Direction) + { + case DoorDirection.E: //→ + ClearRect(top, doorInfo.ConnectDoor.OriginPosition + new Vector2(-1, 1), new Vector2(1, rect2.Size.y - 2)); + FillRect(floor, config.In, doorInfo.ConnectDoor.OriginPosition + new Vector2(-1, 1), new Vector2(1, rect2.Size.y - 2)); + break; + case DoorDirection.W: //← + ClearRect(top, doorInfo.ConnectDoor.OriginPosition + new Vector2(0, 1), new Vector2(1, rect2.Size.y - 2)); + FillRect(floor, config.In, doorInfo.ConnectDoor.OriginPosition + new Vector2(0, 1), new Vector2(1, rect2.Size.y - 2)); + break; + case DoorDirection.S: //↓ + ClearRect(top, doorInfo.ConnectDoor.OriginPosition + new Vector2(1, -1), new Vector2(rect2.Size.x - 2, 1)); + FillRect(floor, config.In, doorInfo.ConnectDoor.OriginPosition + new Vector2(1, -1), new Vector2(rect2.Size.x - 2, 1)); + break; + case DoorDirection.N: //↑ + ClearRect(middle, doorInfo.ConnectDoor.OriginPosition + new Vector2(1, 0), new Vector2(rect2.Size.x - 2, 1)); + FillRect(floor, config.In, doorInfo.ConnectDoor.OriginPosition + new Vector2(1, 0), new Vector2(rect2.Size.x - 2, 1)); + break; + } } } } @@ -207,4 +239,30 @@ } } + private static void FullHorizontalGalleryWall(TileMap floor, TileMap middle, TileMap top, AutoTileConfig config, Rect2 rect) + { + FillRect(floor, config.In, rect.Position + new Vector2(0, 1), rect.Size - new Vector2(0, 2)); + FillRect(middle, config.T, rect.Position, new Vector2(rect.Size.x, 1)); + FillRect(top, config.B, rect.Position + new Vector2(0, rect.Size.y - 1), new Vector2(rect.Size.x, 1)); + //左 + ClearRect(top, rect.Position + new Vector2(-1, 1), new Vector2(1, rect.Size.y - 2)); + FillRect(floor, config.In, rect.Position + new Vector2(-1, 1), new Vector2(1, rect.Size.y - 2)); + //右 + ClearRect(top, rect.Position + new Vector2(rect.Size.x, 1), new Vector2(1, rect.Size.y - 2)); + FillRect(floor, config.In, rect.Position + new Vector2(rect.Size.x, 1), new Vector2(1, rect.Size.y - 2)); + } + + private static void FullVerticalGalleryWall(TileMap floor, TileMap middle, TileMap top, AutoTileConfig config, Rect2 rect) + { + FillRect(floor, config.In, rect.Position + new Vector2(1, 0), rect.Size - new Vector2(2, 0)); + FillRect(top, config.L, rect.Position, new Vector2(1, rect.Size.y)); + FillRect(top, config.R, rect.Position + new Vector2(rect.Size.x - 1, 0), new Vector2(1, rect.Size.y)); + //上 + ClearRect(top, rect.Position + new Vector2(1, -1), new Vector2(rect.Size.x - 2, 1)); + FillRect(floor, config.In, rect.Position + new Vector2(1, -1), new Vector2(rect.Size.x - 2, 1)); + //下 + ClearRect(middle, rect.Position + new Vector2(1, rect.Size.y), new Vector2(rect.Size.x - 2, 1)); + FillRect(floor, config.In, rect.Position + new Vector2(1, rect.Size.y), new Vector2(rect.Size.x - 2, 1)); + } + } \ No newline at end of file