diff --git a/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs b/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs index f22036e..7ed012e 100644 --- a/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/DoorAreaInfo.cs @@ -24,11 +24,11 @@ public float End = 16; /// - /// 起始点坐标, 该坐标位世界坐标, 单位: 像素, 不参与序列化与反序列化 + /// 起始点坐标, 该坐标为模板场景的世界坐标, 单位: 像素, 不参与序列化与反序列化 /// public Vector2 StartPosition; /// - /// 结束点坐标, 该坐标位世界坐标, 单位: 像素, 不参与序列化与反序列化 + /// 结束点坐标, 该坐标为模板场景的世界坐标, 单位: 像素, 不参与序列化与反序列化 /// public Vector2 EndPosition; diff --git a/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs b/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs index 58b9486..84e950d 100644 --- a/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs +++ b/DungeonShooting_Godot/src/framework/map/GenerateDungeon.cs @@ -392,12 +392,15 @@ 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(overlapX + 2, 2, 6); - var offset2 = Mathf.Clamp(overlapY + 2, 2, 6); + //var offset1 = Mathf.Clamp(overlapX + 2, 2, 6); + //var offset2 = Mathf.Clamp(overlapY + 2, 2, 6); + + var offset1 = 0; + var offset2 = 0; //焦点 Vector2 cross; - + if (room.Position.X > nextRoom.Position.X) { if (room.Position.Y > nextRoom.Position.Y) @@ -515,13 +518,73 @@ return true; } + private void Test(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor) + { + var room1 = room.RoomSplit.RoomInfo; + var room2 = nextRoom.RoomSplit.RoomInfo; + + DoorAreaInfo tempArea1 = null; + DoorAreaInfo tempArea2 = null; + + var tempX = room.GetHorizontalStart() * TileCellSize; + var tempY = room.GetVerticalStart() * TileCellSize; + + foreach (var areaInfo1 in room1.DoorAreaInfos) + { + if (areaInfo1.Direction == roomDoor.Direction) + { + if (areaInfo1.Direction == DoorDirection.N || areaInfo1.Direction == DoorDirection.S) //横向 + { + var p1 = tempX + areaInfo1.Start; + var p2 = tempX + areaInfo1.End; + if (room.Position.X > nextRoom.Position.X) + { + if (IsInRange(nextRoom.GetHorizontalEnd() * TileCellSize, + room.GetHorizontalEnd() * TileCellSize, p1, p2)) + { + if (tempArea1 == null || areaInfo1.Start < tempArea1.Start) + { + tempArea1 = areaInfo1; + } + } + } + else + { + if (IsInRange(room.GetHorizontalStart() * TileCellSize, + nextRoom.GetHorizontalStart() * TileCellSize, p1, p2)) + { + if (tempArea1 == null || areaInfo1.End > tempArea1.End) + { + tempArea1 = areaInfo1; + } + } + } + } + else //纵向 + { + var p1 = tempY + areaInfo1.Start; + var p2 = tempY + areaInfo1.End; + + } + } + } + + foreach (var areaInfo2 in room2.DoorAreaInfos) + { + if (areaInfo2.Direction == nextRoomDoor.Direction) + { + //if (IsInRange(room.Position.Y * TileCellSize, nextRoom.Position.Y * TileCellSize, + // room.Position.Y * TileCellSize + areaInfo1.Start, room.Position.Y * TileCellSize + areaInfo1.End)) + } + } + } + /// /// 查找房间的连接通道, 函数返回是否找到对应的门, 通过 result 返回 x/y 轴坐标 /// /// 第一个房间 /// 第二个房间 /// 第一个房间连接方向 - /// 返回连接的 x/y 轴坐标 private List FindPassage(RoomInfo room, RoomInfo nextRoom, DoorDirection direction) { var room1 = room.RoomSplit.RoomInfo; @@ -577,6 +640,14 @@ return new Vector2(Mathf.Max(start1, start2), Mathf.Min(end1, end2)); } + /// + /// 返回 p1 - p2 是否在 start - end 范围内 + /// + private bool IsInRange(float start, float end, float p1, float p2) + { + return p1 >= start && p2 <= end; + } + //返回指定方向的反方向 //0上, 1右, 2下, 3左 private int GetReverseDirection(int direction) diff --git a/DungeonShooting_Godot/src/framework/map/RoomInfo.cs b/DungeonShooting_Godot/src/framework/map/RoomInfo.cs index 8da175d..67db118 100644 --- a/DungeonShooting_Godot/src/framework/map/RoomInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/RoomInfo.cs @@ -47,4 +47,24 @@ /// 上一个房间 /// public RoomInfo Prev; + + public int GetHorizontalEnd() + { + return Position.X + Size.X; + } + + public int GetVerticalEnd() + { + return Position.Y + Size.Y; + } + + public int GetHorizontalStart() + { + return Position.X; + } + + public int GetVerticalStart() + { + return Position.Y; + } } \ No newline at end of file