diff --git a/DungeonShooting_Godot/scene/test/TestGenerateDungeon.tscn b/DungeonShooting_Godot/scene/test/TestGenerateDungeon.tscn index 0e29338..4b94d0f 100644 --- a/DungeonShooting_Godot/scene/test/TestGenerateDungeon.tscn +++ b/DungeonShooting_Godot/scene/test/TestGenerateDungeon.tscn @@ -28,6 +28,7 @@ current = true [node name="TileMap" type="TileMap" parent="."] +z_index = -1 tile_set = SubResource( 1 ) cell_size = Vector2( 16, 16 ) format = 1 diff --git a/DungeonShooting_Godot/src/framework/generate/GenerateDungeon.cs b/DungeonShooting_Godot/src/framework/generate/GenerateDungeon.cs index 5fa9c77..9339dd2 100644 --- a/DungeonShooting_Godot/src/framework/generate/GenerateDungeon.cs +++ b/DungeonShooting_Godot/src/framework/generate/GenerateDungeon.cs @@ -9,10 +9,12 @@ { public readonly TileMap TileMap; + public RoomInfo StartRoom; + private Grid _roomGrid = new Grid(); private List _roomInfos = new List(); private int _count = 0; - private int _maxCount = 30; + private int _maxCount = 15; public GenerateDungeon(TileMap tileMap) { @@ -21,7 +23,17 @@ public void Generate() { - GenerateRoom(null, 0); + StartRoom = GenerateRoom(null, 0); + + while (_count < _maxCount) + { + var info = Utils.RandChoose(_roomInfos); + var nextInfo = GenerateRoom(info, Utils.RandRangeInt(0, 3)); + if (nextInfo != null) + { + info.Next.Add(nextInfo); + } + } foreach (var info in _roomInfos) { @@ -39,12 +51,11 @@ private RoomInfo GenerateRoom(RoomInfo prevRoomInfo, int direction) { - if (_count > _maxCount) + if (_count >= _maxCount) { return null; } - _count++; - var info = new RoomInfo(); + var info = new RoomInfo(_count); info.Size = new Vector2(Utils.RandRangeInt(10, 30), Utils.RandRangeInt(10, 30)); info.Position = Vector2.Zero; info.Direction = direction; @@ -89,7 +100,8 @@ return null; } } - + + _count++; _roomInfos.Add(info); _roomGrid.AddRect(info.Position, info.Size, true); @@ -101,19 +113,24 @@ dirList.Remove(GetReverseDirection(direction)); } - while (dirList.Count > 0) + if (Utils.RandRangeInt(0, 2) != 0) { - var randDir = Utils.RandChoose(dirList); - var generateRoom = GenerateRoom(info, randDir); - if (generateRoom == null) + while (dirList.Count > 0) { - break; - } + var randDir = Utils.RandChoose(dirList); + var generateRoom = GenerateRoom(info, randDir); + if (generateRoom == null) + { + break; + } - dirList.Remove(randDir); + generateRoom.Prev = info; + info.Next.Add(generateRoom); + + dirList.Remove(randDir); + } } - - + return info; } diff --git a/DungeonShooting_Godot/src/framework/generate/RoomInfo.cs b/DungeonShooting_Godot/src/framework/generate/RoomInfo.cs index c2106ef..e5813d9 100644 --- a/DungeonShooting_Godot/src/framework/generate/RoomInfo.cs +++ b/DungeonShooting_Godot/src/framework/generate/RoomInfo.cs @@ -1,4 +1,5 @@  +using System.Collections.Generic; using Godot; /// @@ -6,6 +7,13 @@ /// public class RoomInfo { + public RoomInfo(int id) + { + Id = id; + } + + public int Id; + /// /// 房间大小 /// @@ -22,7 +30,8 @@ /// 房间生成时所处方向: 0上, 1右, 2下, 3左 /// public int Direction; - - //public RoomInfo Next; - //public RoomInfo Prev; + + public List Next = new List(); + + public RoomInfo Prev; } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/test/TestGenerateDungeon.cs b/DungeonShooting_Godot/src/test/TestGenerateDungeon.cs index 8223b35..527808b 100644 --- a/DungeonShooting_Godot/src/test/TestGenerateDungeon.cs +++ b/DungeonShooting_Godot/src/test/TestGenerateDungeon.cs @@ -12,16 +12,22 @@ private TileMap _tileMap; private Camera2D _camera; + private GenerateDungeon _generateDungeon; + private Font _font; + public override void _Ready() { GD.Randomize(); _tileMap = GetNode(TileMapPath); _camera = GetNode(Camera); - var temp = new GenerateDungeon(_tileMap); + _font = ResourceManager.Load(ResourcePath.resource_font_cn_font_36_tres); + + _generateDungeon = new GenerateDungeon(_tileMap); var nowTicks = DateTime.Now.Ticks; - temp.Generate(); + _generateDungeon.Generate(); GD.Print("useTime: " + (DateTime.Now.Ticks - nowTicks) / 10000 + "毫秒"); + } public override void _Process(float delta) @@ -30,6 +36,25 @@ var dir = Input.GetVector("move_left", "move_right", "move_up", "move_down"); _camera.Position += dir * 500 * delta; - + Update(); + } + + public override void _Draw() + { + + DrawRoomInfo(_generateDungeon.StartRoom); + + } + + private void DrawRoomInfo(RoomInfo roomInfo) + { + var pos1 = (roomInfo.Position + roomInfo.Size / 2) * _tileMap.CellSize; + foreach (var info in roomInfo.Next) + { + var pos2 = (info.Position + info.Size / 2) * _tileMap.CellSize; + DrawLine(pos1, pos2, Colors.Red); + DrawRoomInfo(info); + } + DrawString(_font, pos1, roomInfo.Id.ToString(), Colors.Yellow); } } \ No newline at end of file