diff --git a/DungeonShooting_Godot/src/framework/common/Utils.cs b/DungeonShooting_Godot/src/framework/common/Utils.cs
index b6c9f4d..1b62786 100644
--- a/DungeonShooting_Godot/src/framework/common/Utils.cs
+++ b/DungeonShooting_Godot/src/framework/common/Utils.cs
@@ -17,7 +17,7 @@
}
///
- /// 根据四个点计算出矩形
+ /// 根据两个点计算出矩形
///
public static Rect2 CalcRect(float start1, float end1, float start2, float end2)
{
diff --git a/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs b/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs
index c35c107..bd3aae9 100644
--- a/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs
+++ b/DungeonShooting_Godot/src/framework/map/DungeonTileMap.cs
@@ -207,266 +207,264 @@
// tileInstance.CallDeferred(Node.MethodName.QueueFree);
}
+ var doors = roomInfo.GetForwardDoors();
//铺过道
- foreach (var doorInfo in roomInfo.Doors)
+ foreach (var doorInfo in doors)
{
- if (doorInfo.ConnectRoom.Id > roomInfo.Id)
+ //普通的直线连接
+ var doorDir1 = doorInfo.Direction;
+ var doorDir2 = doorInfo.ConnectDoor.Direction;
+ if (!doorInfo.HasCross)
{
- //普通的直线连接
- var doorDir1 = doorInfo.Direction;
- var doorDir2 = doorInfo.ConnectDoor.Direction;
- if (!doorInfo.HasCross)
+ var rect = Utils.CalcRect(
+ doorInfo.OriginPosition.X,
+ doorInfo.OriginPosition.Y,
+ doorInfo.ConnectDoor.OriginPosition.X,
+ doorInfo.ConnectDoor.OriginPosition.Y
+ );
+
+ switch (doorDir1)
{
- var rect = Utils.CalcRect(
- doorInfo.OriginPosition.X,
- doorInfo.OriginPosition.Y,
- doorInfo.ConnectDoor.OriginPosition.X,
- doorInfo.ConnectDoor.OriginPosition.Y
- );
-
- switch (doorDir1)
- {
- case DoorDirection.E:
- rect.Size = new Vector2(rect.Size.X, GameConfig.CorridorWidth);
- FullHorizontalAisle(config, rect);
- FullHorizontalAisleLeft(config, rect, doorInfo);
- FullHorizontalAisleRight(config, rect, doorInfo.ConnectDoor);
- break;
- case DoorDirection.W:
- rect.Size = new Vector2(rect.Size.X, GameConfig.CorridorWidth);
- FullHorizontalAisle(config, rect);
- FullHorizontalAisleLeft(config, rect, doorInfo.ConnectDoor);
- FullHorizontalAisleRight(config, rect, doorInfo);
- break;
-
- case DoorDirection.S:
- rect.Size = new Vector2(GameConfig.CorridorWidth, rect.Size.Y);
- FullVerticalAisle(config, rect);
- FullVerticalAisleUp(config, rect, doorInfo);
- FullVerticalAisleDown(config, rect, doorInfo.ConnectDoor);
- break;
- case DoorDirection.N:
- rect.Size = new Vector2(GameConfig.CorridorWidth, rect.Size.Y);
- FullVerticalAisle(config, rect);
- FullVerticalAisleUp(config, rect, doorInfo.ConnectDoor);
- FullVerticalAisleDown(config, rect, doorInfo);
- break;
- }
- }
- else //带交叉点
- {
- //方向, 0横向, 1纵向
- var dir1 = 0;
- var dir2 = 0;
-
- Rect2 rect;
- Rect2 rect2;
-
- //计算范围
- switch (doorDir1)
- {
- case DoorDirection.E: //→
- rect = new Rect2(
- doorInfo.OriginPosition.X,
- doorInfo.OriginPosition.Y,
- doorInfo.Cross.X - doorInfo.OriginPosition.X,
- GameConfig.CorridorWidth
- );
- break;
- case DoorDirection.W: //←
- rect = new Rect2(
- doorInfo.Cross.X + GameConfig.CorridorWidth,
- doorInfo.Cross.Y,
- doorInfo.OriginPosition.X - (doorInfo.Cross.X + GameConfig.CorridorWidth),
- GameConfig.CorridorWidth
- );
- break;
- case DoorDirection.S: //↓
- dir1 = 1;
- rect = new Rect2(
- doorInfo.OriginPosition.X,
- doorInfo.OriginPosition.Y,
- GameConfig.CorridorWidth,
- doorInfo.Cross.Y - doorInfo.OriginPosition.Y
- );
- break;
- case DoorDirection.N: //↑
- dir1 = 1;
- rect = new Rect2(
- doorInfo.Cross.X,
- doorInfo.Cross.Y + GameConfig.CorridorWidth,
- GameConfig.CorridorWidth,
- doorInfo.OriginPosition.Y - (doorInfo.Cross.Y + GameConfig.CorridorWidth)
- );
- break;
- default:
- rect = new Rect2();
- break;
- }
-
- switch (doorDir2)
- {
- case DoorDirection.E: //→
- rect2 = new Rect2(
- doorInfo.ConnectDoor.OriginPosition.X,
- doorInfo.ConnectDoor.OriginPosition.Y,
- doorInfo.Cross.X - doorInfo.ConnectDoor.OriginPosition.X,
- GameConfig.CorridorWidth
- );
- break;
- case DoorDirection.W: //←
- rect2 = new Rect2(
- doorInfo.Cross.X + GameConfig.CorridorWidth,
- doorInfo.Cross.Y,
- doorInfo.ConnectDoor.OriginPosition.X -
- (doorInfo.Cross.X + GameConfig.CorridorWidth),
- GameConfig.CorridorWidth
- );
- break;
- case DoorDirection.S: //↓
- dir2 = 1;
- rect2 = new Rect2(
- doorInfo.ConnectDoor.OriginPosition.X,
- doorInfo.ConnectDoor.OriginPosition.Y,
- GameConfig.CorridorWidth,
- doorInfo.Cross.Y - doorInfo.ConnectDoor.OriginPosition.Y
- );
- break;
- case DoorDirection.N: //↑
- dir2 = 1;
- rect2 = new Rect2(
- doorInfo.Cross.X,
- doorInfo.Cross.Y + GameConfig.CorridorWidth,
- GameConfig.CorridorWidth,
- doorInfo.ConnectDoor.OriginPosition.Y -
- (doorInfo.Cross.Y + GameConfig.CorridorWidth)
- );
- break;
- default:
- rect2 = new Rect2();
- break;
- }
-
- FillRect(GameConfig.AisleFloorMapLayer, config.Floor, doorInfo.Cross + Vector2.One,
- new Vector2(GameConfig.CorridorWidth - 2, GameConfig.CorridorWidth - 2));
-
- //墙壁, 0横向, 1纵向
- if (dir1 == 0)
- {
+ case DoorDirection.E:
+ rect.Size = new Vector2(rect.Size.X, GameConfig.CorridorWidth);
FullHorizontalAisle(config, rect);
- FullHorizontalAisleLeft(config, rect, doorDir1 == DoorDirection.E ? doorInfo : null);
- FullHorizontalAisleRight(config, rect, doorDir1 == DoorDirection.W ? doorInfo : null);
- }
- else
- {
+ FullHorizontalAisleLeft(config, rect, doorInfo);
+ FullHorizontalAisleRight(config, rect, doorInfo.ConnectDoor);
+ break;
+ case DoorDirection.W:
+ rect.Size = new Vector2(rect.Size.X, GameConfig.CorridorWidth);
+ FullHorizontalAisle(config, rect);
+ FullHorizontalAisleLeft(config, rect, doorInfo.ConnectDoor);
+ FullHorizontalAisleRight(config, rect, doorInfo);
+ break;
+
+ case DoorDirection.S:
+ rect.Size = new Vector2(GameConfig.CorridorWidth, rect.Size.Y);
FullVerticalAisle(config, rect);
- FullVerticalAisleUp(config, rect, doorDir1 == DoorDirection.S ? doorInfo : null);
- FullVerticalAisleDown(config, rect, doorDir1 == DoorDirection.N ? doorInfo : null);
- }
-
- if (dir2 == 0)
- {
- FullHorizontalAisle(config, rect2);
- FullHorizontalAisleLeft(config, rect2, doorDir2 == DoorDirection.E ? doorInfo.ConnectDoor : null);
- FullHorizontalAisleRight(config, rect2, doorDir2 == DoorDirection.W ? doorInfo.ConnectDoor : null);
- }
- else
- {
- FullVerticalAisle(config, rect2);
- FullVerticalAisleUp(config, rect2, doorDir2 == DoorDirection.S ? doorInfo.ConnectDoor : null);
- FullVerticalAisleDown(config, rect2, doorDir2 == DoorDirection.N ? doorInfo.ConnectDoor : null);
- }
-
- if ((doorDir1 == DoorDirection.N && doorDir2 == DoorDirection.E) || //↑→
- (doorDir2 == DoorDirection.N && doorDir1 == DoorDirection.E))
- {
- FillRect(GameConfig.TopMapLayer, config.OUT_RT,
- doorInfo.Cross + new Vector2(0, GameConfig.CorridorWidth - 1),
- Vector2.One);
- FillRect(GameConfig.TopMapLayer, config.IN_RT, doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 0),
- Vector2.One);
- FillRect(GameConfig.MiddleMapLayer, config.T, doorInfo.Cross, new Vector2(GameConfig.CorridorWidth - 1, 1));
- FillRect(GameConfig.TopMapLayer, config.R, doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 1),
- new Vector2(1, GameConfig.CorridorWidth - 1));
- }
- else if ((doorDir1 == DoorDirection.E && doorDir2 == DoorDirection.S) || //→↓
- (doorDir2 == DoorDirection.E && doorDir1 == DoorDirection.S))
- {
- FillRect(GameConfig.MiddleMapLayer, config.OUT_RB, doorInfo.Cross, Vector2.One);
- FillRect(GameConfig.TopMapLayer, config.IN_RB,
- doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1,
- GameConfig.CorridorWidth - 1),
- Vector2.One);
- FillRect(GameConfig.TopMapLayer, config.R, doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 0),
- new Vector2(1, GameConfig.CorridorWidth - 1));
- FillRect(GameConfig.TopMapLayer, config.B, doorInfo.Cross + new Vector2(0, GameConfig.CorridorWidth - 1),
- new Vector2(GameConfig.CorridorWidth - 1, 1));
- }
- else if ((doorDir1 == DoorDirection.S && doorDir2 == DoorDirection.W) || //↓←
- (doorDir2 == DoorDirection.S && doorDir1 == DoorDirection.W))
- {
- FillRect(GameConfig.MiddleMapLayer, config.OUT_LB,
- doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 0), Vector2.One);
- FillRect(GameConfig.TopMapLayer, config.IN_LB, doorInfo.Cross + new Vector2(0, GameConfig.CorridorWidth - 1),
- Vector2.One);
- FillRect(GameConfig.TopMapLayer, config.L, doorInfo.Cross, new Vector2(1, GameConfig.CorridorWidth - 1));
- FillRect(GameConfig.TopMapLayer, config.B, doorInfo.Cross + new Vector2(1, GameConfig.CorridorWidth - 1),
- new Vector2(GameConfig.CorridorWidth - 1, 1));
- }
- else if ((doorDir1 == DoorDirection.W && doorDir2 == DoorDirection.N) || //←↑
- (doorDir2 == DoorDirection.W && doorDir1 == DoorDirection.N))
- {
- FillRect(GameConfig.TopMapLayer, config.OUT_LT,
- doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1,
- GameConfig.CorridorWidth - 1),
- Vector2.One);
- FillRect(GameConfig.TopMapLayer, config.IN_LT, doorInfo.Cross, Vector2.One);
- FillRect(GameConfig.MiddleMapLayer, config.T, doorInfo.Cross + new Vector2(1, 0),
- new Vector2(GameConfig.CorridorWidth - 1, 1));
- FillRect(GameConfig.TopMapLayer, config.L, doorInfo.Cross + new Vector2(0, 1),
- new Vector2(1, GameConfig.CorridorWidth - 1));
- }
-
- //在房间墙上开洞
- switch (doorDir1)
- {
- case DoorDirection.E: //→
- ClearRect(GameConfig.TopMapLayer, doorInfo.OriginPosition + new Vector2(-1, 1),
- new Vector2(1, rect.Size.Y - 2));
- break;
- case DoorDirection.W: //←
- ClearRect(GameConfig.TopMapLayer, doorInfo.OriginPosition + new Vector2(0, 1),
- new Vector2(1, rect.Size.Y - 2));
- break;
- case DoorDirection.S: //↓
- ClearRect(GameConfig.TopMapLayer, doorInfo.OriginPosition + new Vector2(1, -1),
- new Vector2(rect.Size.X - 2, 1));
- break;
- case DoorDirection.N: //↑
- ClearRect(GameConfig.MiddleMapLayer, doorInfo.OriginPosition + new Vector2(1, 2),
- new Vector2(rect.Size.X - 2, 1));
- break;
- }
-
- switch (doorDir2)
- {
- case DoorDirection.E: //→
- ClearRect(GameConfig.TopMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(-1, 1),
- new Vector2(1, rect2.Size.Y - 2));
- break;
- case DoorDirection.W: //←
- ClearRect(GameConfig.TopMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(0, 1),
- new Vector2(1, rect2.Size.Y - 2));
- break;
- case DoorDirection.S: //↓
- ClearRect(GameConfig.TopMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(1, -1),
- new Vector2(rect2.Size.X - 2, 1));
- break;
- case DoorDirection.N: //↑
- ClearRect(GameConfig.MiddleMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(1, 0),
- new Vector2(rect2.Size.X - 2, 1));
- break;
- }
+ FullVerticalAisleUp(config, rect, doorInfo);
+ FullVerticalAisleDown(config, rect, doorInfo.ConnectDoor);
+ break;
+ case DoorDirection.N:
+ rect.Size = new Vector2(GameConfig.CorridorWidth, rect.Size.Y);
+ FullVerticalAisle(config, rect);
+ FullVerticalAisleUp(config, rect, doorInfo.ConnectDoor);
+ FullVerticalAisleDown(config, rect, doorInfo);
+ break;
+ }
+ }
+ else //带交叉点
+ {
+ //方向, 0横向, 1纵向
+ var dir1 = 0;
+ var dir2 = 0;
+
+ Rect2 rect;
+ Rect2 rect2;
+
+ //计算范围
+ switch (doorDir1)
+ {
+ case DoorDirection.E: //→
+ rect = new Rect2(
+ doorInfo.OriginPosition.X,
+ doorInfo.OriginPosition.Y,
+ doorInfo.Cross.X - doorInfo.OriginPosition.X,
+ GameConfig.CorridorWidth
+ );
+ break;
+ case DoorDirection.W: //←
+ rect = new Rect2(
+ doorInfo.Cross.X + GameConfig.CorridorWidth,
+ doorInfo.Cross.Y,
+ doorInfo.OriginPosition.X - (doorInfo.Cross.X + GameConfig.CorridorWidth),
+ GameConfig.CorridorWidth
+ );
+ break;
+ case DoorDirection.S: //↓
+ dir1 = 1;
+ rect = new Rect2(
+ doorInfo.OriginPosition.X,
+ doorInfo.OriginPosition.Y,
+ GameConfig.CorridorWidth,
+ doorInfo.Cross.Y - doorInfo.OriginPosition.Y
+ );
+ break;
+ case DoorDirection.N: //↑
+ dir1 = 1;
+ rect = new Rect2(
+ doorInfo.Cross.X,
+ doorInfo.Cross.Y + GameConfig.CorridorWidth,
+ GameConfig.CorridorWidth,
+ doorInfo.OriginPosition.Y - (doorInfo.Cross.Y + GameConfig.CorridorWidth)
+ );
+ break;
+ default:
+ rect = new Rect2();
+ break;
+ }
+
+ switch (doorDir2)
+ {
+ case DoorDirection.E: //→
+ rect2 = new Rect2(
+ doorInfo.ConnectDoor.OriginPosition.X,
+ doorInfo.ConnectDoor.OriginPosition.Y,
+ doorInfo.Cross.X - doorInfo.ConnectDoor.OriginPosition.X,
+ GameConfig.CorridorWidth
+ );
+ break;
+ case DoorDirection.W: //←
+ rect2 = new Rect2(
+ doorInfo.Cross.X + GameConfig.CorridorWidth,
+ doorInfo.Cross.Y,
+ doorInfo.ConnectDoor.OriginPosition.X -
+ (doorInfo.Cross.X + GameConfig.CorridorWidth),
+ GameConfig.CorridorWidth
+ );
+ break;
+ case DoorDirection.S: //↓
+ dir2 = 1;
+ rect2 = new Rect2(
+ doorInfo.ConnectDoor.OriginPosition.X,
+ doorInfo.ConnectDoor.OriginPosition.Y,
+ GameConfig.CorridorWidth,
+ doorInfo.Cross.Y - doorInfo.ConnectDoor.OriginPosition.Y
+ );
+ break;
+ case DoorDirection.N: //↑
+ dir2 = 1;
+ rect2 = new Rect2(
+ doorInfo.Cross.X,
+ doorInfo.Cross.Y + GameConfig.CorridorWidth,
+ GameConfig.CorridorWidth,
+ doorInfo.ConnectDoor.OriginPosition.Y -
+ (doorInfo.Cross.Y + GameConfig.CorridorWidth)
+ );
+ break;
+ default:
+ rect2 = new Rect2();
+ break;
+ }
+
+ FillRect(GameConfig.AisleFloorMapLayer, config.Floor, doorInfo.Cross + Vector2.One,
+ new Vector2(GameConfig.CorridorWidth - 2, GameConfig.CorridorWidth - 2));
+
+ //墙壁, 0横向, 1纵向
+ if (dir1 == 0)
+ {
+ FullHorizontalAisle(config, rect);
+ FullHorizontalAisleLeft(config, rect, doorDir1 == DoorDirection.E ? doorInfo : null);
+ FullHorizontalAisleRight(config, rect, doorDir1 == DoorDirection.W ? doorInfo : null);
+ }
+ else
+ {
+ FullVerticalAisle(config, rect);
+ FullVerticalAisleUp(config, rect, doorDir1 == DoorDirection.S ? doorInfo : null);
+ FullVerticalAisleDown(config, rect, doorDir1 == DoorDirection.N ? doorInfo : null);
+ }
+
+ if (dir2 == 0)
+ {
+ FullHorizontalAisle(config, rect2);
+ FullHorizontalAisleLeft(config, rect2, doorDir2 == DoorDirection.E ? doorInfo.ConnectDoor : null);
+ FullHorizontalAisleRight(config, rect2, doorDir2 == DoorDirection.W ? doorInfo.ConnectDoor : null);
+ }
+ else
+ {
+ FullVerticalAisle(config, rect2);
+ FullVerticalAisleUp(config, rect2, doorDir2 == DoorDirection.S ? doorInfo.ConnectDoor : null);
+ FullVerticalAisleDown(config, rect2, doorDir2 == DoorDirection.N ? doorInfo.ConnectDoor : null);
+ }
+
+ if ((doorDir1 == DoorDirection.N && doorDir2 == DoorDirection.E) || //↑→
+ (doorDir2 == DoorDirection.N && doorDir1 == DoorDirection.E))
+ {
+ FillRect(GameConfig.TopMapLayer, config.OUT_RT,
+ doorInfo.Cross + new Vector2(0, GameConfig.CorridorWidth - 1),
+ Vector2.One);
+ FillRect(GameConfig.TopMapLayer, config.IN_RT, doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 0),
+ Vector2.One);
+ FillRect(GameConfig.MiddleMapLayer, config.T, doorInfo.Cross, new Vector2(GameConfig.CorridorWidth - 1, 1));
+ FillRect(GameConfig.TopMapLayer, config.R, doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 1),
+ new Vector2(1, GameConfig.CorridorWidth - 1));
+ }
+ else if ((doorDir1 == DoorDirection.E && doorDir2 == DoorDirection.S) || //→↓
+ (doorDir2 == DoorDirection.E && doorDir1 == DoorDirection.S))
+ {
+ FillRect(GameConfig.MiddleMapLayer, config.OUT_RB, doorInfo.Cross, Vector2.One);
+ FillRect(GameConfig.TopMapLayer, config.IN_RB,
+ doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1,
+ GameConfig.CorridorWidth - 1),
+ Vector2.One);
+ FillRect(GameConfig.TopMapLayer, config.R, doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 0),
+ new Vector2(1, GameConfig.CorridorWidth - 1));
+ FillRect(GameConfig.TopMapLayer, config.B, doorInfo.Cross + new Vector2(0, GameConfig.CorridorWidth - 1),
+ new Vector2(GameConfig.CorridorWidth - 1, 1));
+ }
+ else if ((doorDir1 == DoorDirection.S && doorDir2 == DoorDirection.W) || //↓←
+ (doorDir2 == DoorDirection.S && doorDir1 == DoorDirection.W))
+ {
+ FillRect(GameConfig.MiddleMapLayer, config.OUT_LB,
+ doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1, 0), Vector2.One);
+ FillRect(GameConfig.TopMapLayer, config.IN_LB, doorInfo.Cross + new Vector2(0, GameConfig.CorridorWidth - 1),
+ Vector2.One);
+ FillRect(GameConfig.TopMapLayer, config.L, doorInfo.Cross, new Vector2(1, GameConfig.CorridorWidth - 1));
+ FillRect(GameConfig.TopMapLayer, config.B, doorInfo.Cross + new Vector2(1, GameConfig.CorridorWidth - 1),
+ new Vector2(GameConfig.CorridorWidth - 1, 1));
+ }
+ else if ((doorDir1 == DoorDirection.W && doorDir2 == DoorDirection.N) || //←↑
+ (doorDir2 == DoorDirection.W && doorDir1 == DoorDirection.N))
+ {
+ FillRect(GameConfig.TopMapLayer, config.OUT_LT,
+ doorInfo.Cross + new Vector2(GameConfig.CorridorWidth - 1,
+ GameConfig.CorridorWidth - 1),
+ Vector2.One);
+ FillRect(GameConfig.TopMapLayer, config.IN_LT, doorInfo.Cross, Vector2.One);
+ FillRect(GameConfig.MiddleMapLayer, config.T, doorInfo.Cross + new Vector2(1, 0),
+ new Vector2(GameConfig.CorridorWidth - 1, 1));
+ FillRect(GameConfig.TopMapLayer, config.L, doorInfo.Cross + new Vector2(0, 1),
+ new Vector2(1, GameConfig.CorridorWidth - 1));
+ }
+
+ //在房间墙上开洞
+ switch (doorDir1)
+ {
+ case DoorDirection.E: //→
+ ClearRect(GameConfig.TopMapLayer, doorInfo.OriginPosition + new Vector2(-1, 1),
+ new Vector2(1, rect.Size.Y - 2));
+ break;
+ case DoorDirection.W: //←
+ ClearRect(GameConfig.TopMapLayer, doorInfo.OriginPosition + new Vector2(0, 1),
+ new Vector2(1, rect.Size.Y - 2));
+ break;
+ case DoorDirection.S: //↓
+ ClearRect(GameConfig.TopMapLayer, doorInfo.OriginPosition + new Vector2(1, -1),
+ new Vector2(rect.Size.X - 2, 1));
+ break;
+ case DoorDirection.N: //↑
+ ClearRect(GameConfig.MiddleMapLayer, doorInfo.OriginPosition + new Vector2(1, 2),
+ new Vector2(rect.Size.X - 2, 1));
+ break;
+ }
+
+ switch (doorDir2)
+ {
+ case DoorDirection.E: //→
+ ClearRect(GameConfig.TopMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(-1, 1),
+ new Vector2(1, rect2.Size.Y - 2));
+ break;
+ case DoorDirection.W: //←
+ ClearRect(GameConfig.TopMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(0, 1),
+ new Vector2(1, rect2.Size.Y - 2));
+ break;
+ case DoorDirection.S: //↓
+ ClearRect(GameConfig.TopMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(1, -1),
+ new Vector2(rect2.Size.X - 2, 1));
+ break;
+ case DoorDirection.N: //↑
+ ClearRect(GameConfig.MiddleMapLayer, doorInfo.ConnectDoor.OriginPosition + new Vector2(1, 0),
+ new Vector2(rect2.Size.X - 2, 1));
+ break;
}
}
}
diff --git a/DungeonShooting_Godot/src/framework/map/fog/RoomFogMask.cs b/DungeonShooting_Godot/src/framework/map/fog/RoomFogMask.cs
index 3a60d80..37e02e3 100644
--- a/DungeonShooting_Godot/src/framework/map/fog/RoomFogMask.cs
+++ b/DungeonShooting_Godot/src/framework/map/fog/RoomFogMask.cs
@@ -87,7 +87,6 @@
//处理边缘过渡
HandlerTransition(roomInfo, img);
-
Texture = ImageTexture.CreateFromImage(img);
}
diff --git a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs
index 317a424..e5753d0 100644
--- a/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs
+++ b/DungeonShooting_Godot/src/framework/map/room/RoomInfo.cs
@@ -109,11 +109,11 @@
public void CalcOuterRange()
{
var worldPos = GetWorldPosition();
- var pos = new Vector2I((int)worldPos.X, (int)worldPos.Y);
- int minX = pos.X;
- int minY = pos.Y;
- int maxX = minX + GetWidth();
- int maxY = minY + GetHeight();
+ var pos = new Vector2I(worldPos.X, worldPos.Y);
+ var minX = pos.X;
+ var minY = pos.Y;
+ var maxX = minX + GetWidth();
+ var maxY = minY + GetHeight();
//遍历每一个连接的门, 计算计算canvas覆盖范围
foreach (var doorInfo in Doors)
@@ -399,4 +399,21 @@
doorInfo.Door.CloseDoor();
}
}
+
+ ///
+ /// 获取该房间所有正向的门,nextRoom.id > this.id
+ ///
+ public RoomDoorInfo[] GetForwardDoors()
+ {
+ var temp = new List();
+ foreach (var doorInfo in Doors)
+ {
+ if (doorInfo.ConnectRoom.Id > Id)
+ {
+ temp.Add(doorInfo);
+ }
+ }
+
+ return temp.ToArray();
+ }
}
\ No newline at end of file
diff --git a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs
index 419db5c..f9c24de 100644
--- a/DungeonShooting_Godot/src/game/activity/role/player/Player.cs
+++ b/DungeonShooting_Godot/src/game/activity/role/player/Player.cs
@@ -48,13 +48,13 @@
Shield = 0;
// debug用
- // RoleState.Acceleration = 3000;
- // RoleState.Friction = 3000;
- // RoleState.MoveSpeed = 500;
- // CollisionLayer = 0;
- // CollisionMask = 0;
- // GameCamera.Main.Zoom = new Vector2(0.2f, 0.2f);
- // //GameCamera.Main.Zoom = new Vector2(0.5f, 0.5f);
+ RoleState.Acceleration = 3000;
+ RoleState.Friction = 3000;
+ RoleState.MoveSpeed = 500;
+ CollisionLayer = 0;
+ CollisionMask = 0;
+ //GameCamera.Main.Zoom = new Vector2(0.2f, 0.2f);
+ //GameCamera.Main.Zoom = new Vector2(0.5f, 0.5f);
//注册状态机
StateController.Register(new PlayerIdleState());
diff --git a/DungeonShooting_Godot/src/game/room/DungeonManager.cs b/DungeonShooting_Godot/src/game/room/DungeonManager.cs
index b4c2840..782302c 100644
--- a/DungeonShooting_Godot/src/game/room/DungeonManager.cs
+++ b/DungeonShooting_Godot/src/game/room/DungeonManager.cs
@@ -197,7 +197,7 @@
World = GameApplication.Instance.CreateNewWorld();
yield return 0;
//生成地牢房间
- var random = new SeedRandom(1);
+ var random = new SeedRandom(2);
_dungeonGenerator = new DungeonGenerator(CurrConfig, random);
_dungeonGenerator.Generate();
yield return 0;
@@ -429,6 +429,7 @@
private void CreateRoomFogMask(RoomInfo roomInfo)
{
var roomFog = new RoomFogMask();
+ //roomFog.BlendMode = Light2D.BlendModeEnum.Mix;
roomFog.Name = "FogMask" + roomFog.IsDestroyed;
roomInfo.RoomFogMask = roomFog;
roomFog.Init(roomInfo, new Rect2I(
@@ -436,6 +437,32 @@
(roomInfo.Size + new Vector2I(2, 2)) * GameConfig.TileCellSize)
);
World.FogMaskRoot.AddChild(roomFog);
+
+ //正向门
+ var roomDoorInfos = roomInfo.GetForwardDoors();
+ foreach (var roomDoorInfo in roomDoorInfos)
+ {
+ var p1 = roomDoorInfo.GetWorldOriginPosition();
+ var p2 = roomDoorInfo.ConnectDoor.GetWorldOriginPosition();
+ var calcRect = Utils.CalcRect(p1.X, p1.Y, p2.X, p2.Y);
+ if (calcRect.Size.X == 0)
+ {
+ calcRect.Size += new Vector2(4 * GameConfig.TileCellSize, 0);
+ }
+ else if (calcRect.Size.Y == 0)
+ {
+ calcRect.Size += new Vector2(0, 4 * GameConfig.TileCellSize);
+ }
+
+ var calcRectSize = calcRect.Size.AsVector2I();
+ var image = Image.Create(calcRectSize.X, calcRectSize.Y, false, Image.Format.Rgba8);
+ image.Fill(Colors.White);
+ var sprite2D = new PointLight2D();
+ //sprite2D.BlendMode = Light2D.BlendModeEnum.Mix;
+ sprite2D.Texture = ImageTexture.CreateFromImage(image);
+ sprite2D.Position = calcRect.Position + calcRect.Size / 2;
+ World.FogMaskRoot.AddChild(sprite2D);
+ }
}
///