diff --git a/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs b/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs index fa1b164..f22036e 100644 --- a/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs @@ -21,7 +21,7 @@ /// 结束位置, 相对 tilemap 的横/纵轴原点, 单位: 像素 /// [JsonInclude] - public float End = 1; + public float End = 16; /// /// 起始点坐标, 该坐标位世界坐标, 单位: 像素, 不参与序列化与反序列化 diff --git a/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs b/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs index b8a988d..0caf984 100644 --- a/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs +++ b/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs @@ -12,6 +12,11 @@ /// 过道宽度 /// public const int CorridorWidth = 4; + + /// + /// tilemap 网格大小 + /// + public const int TileCellSize = 16; /// /// 所有生成的房间, 调用过 Generate() 函数才能获取到值 @@ -470,42 +475,59 @@ var room1 = room.RoomSplit.RoomInfo; var room2 = nextRoom.RoomSplit.RoomInfo; + //用于存储符合生成条件的区域 + List rangeList = null; + foreach (var doorAreaInfo1 in room1.DoorAreaInfos) { if (doorAreaInfo1.Direction == direction) { - - switch (direction) + //第二个门的方向 + var direction2 = GetReverseDirection(direction); + + foreach (var doorAreaInfo2 in room2.DoorAreaInfos) { - case DoorDirection.E: - break; - case DoorDirection.W: - break; - case DoorDirection.S: //第二个门向↑ - - foreach (var doorAreaInfo2 in room2.DoorAreaInfos) + if (doorAreaInfo2.Direction == direction2) + { + Vector2 range; + if (direction == DoorDirection.E || direction == DoorDirection.W) //第二个门向← 或者 第二个门向→ { - if (doorAreaInfo2.Direction == DoorDirection.N) - { - var range = CalcOverlapRange( - room.Position.X + doorAreaInfo1.Start, room.Position.X + doorAreaInfo1.End, - nextRoom.Position.X + doorAreaInfo2.Start, nextRoom.Position.X + doorAreaInfo2.End - ); - if (range.Y - range.X >= 16 * 4) - { - GD.Print("找打了!!!"); - } - } + range = CalcOverlapRange( + room.Position.Y * TileCellSize + doorAreaInfo1.Start, room.Position.Y * TileCellSize + doorAreaInfo1.End, + nextRoom.Position.Y * TileCellSize + doorAreaInfo2.Start, nextRoom.Position.Y * TileCellSize + doorAreaInfo2.End + ); } + else //第二个门向↑ 或者 第二个门向↓ + { + range = CalcOverlapRange( + room.Position.X * TileCellSize + doorAreaInfo1.Start, room.Position.X * TileCellSize + doorAreaInfo1.End, + nextRoom.Position.X * TileCellSize + doorAreaInfo2.Start, nextRoom.Position.X * TileCellSize + doorAreaInfo2.End + ); + } + //交集范围够生成门 + if (range.Y - range.X >= CorridorWidth * TileCellSize) + { + if (rangeList == null) + { + rangeList = new List(); + } - break; - case DoorDirection.N: //第二个门向↓ - - break; + range.Y -= CorridorWidth * TileCellSize; + rangeList.Add(range); + } + } } } } + if (rangeList != null) + { + //随机选择一个 + var data = Utils.RandChoose(rangeList); + result = Utils.RandRangeInt((int)data.X, (int)data.Y); + return true; + } + result = 0; return false; } @@ -518,7 +540,8 @@ return new Vector2(Mathf.Max(start1, start2), Mathf.Min(end1, end2)); } - //返回参数方向的反方向 + //返回指定方向的反方向 + //0上, 1右, 2下, 3左 private int GetReverseDirection(int direction) { switch (direction) @@ -531,6 +554,24 @@ return 2; } + + //返回参数方向的反方向 + private DoorDirection GetReverseDirection(DoorDirection direction) + { + switch (direction) + { + case DoorDirection.E: + return DoorDirection.W; + case DoorDirection.W: + return DoorDirection.E; + case DoorDirection.S: + return DoorDirection.N; + case DoorDirection.N: + return DoorDirection.S; + } + + return DoorDirection.S; + } //将两个门间的过道占用数据存入RoomGrid private bool AddCorridorToGridRange(RoomDoorInfo door1, RoomDoorInfo door2)