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); + } } ///