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)