diff --git a/DungeonShooting_Godot/project.godot b/DungeonShooting_Godot/project.godot index fac0b6e..601f8cb 100644 --- a/DungeonShooting_Godot/project.godot +++ b/DungeonShooting_Godot/project.godot @@ -11,7 +11,7 @@ [application] config/name="DungeonShooting" -run/main_scene="res://scene/test/TestOptimizeSprite.tscn" +run/main_scene="res://scene/Main.tscn" config/features=PackedStringArray("4.1", "C#") config/icon="res://icon.png" diff --git a/DungeonShooting_Godot/scene/World.tscn b/DungeonShooting_Godot/scene/World.tscn index 6c182e2..6c3084b 100644 --- a/DungeonShooting_Godot/scene/World.tscn +++ b/DungeonShooting_Godot/scene/World.tscn @@ -8,11 +8,13 @@ glow_enabled = true glow_intensity = 4.74 -[node name="World" type="Node2D" node_paths=PackedStringArray("NormalLayer", "YSortLayer", "TileRoot")] +[node name="World" type="Node2D" node_paths=PackedStringArray("NormalLayer", "YSortLayer", "TileRoot", "StaticSpriteRoot", "AffiliationAreaRoot")] script = ExtResource("1_kt3mm") NormalLayer = NodePath("NormalLayer") YSortLayer = NodePath("YSortLayer") TileRoot = NodePath("TileRoot") +StaticSpriteRoot = NodePath("StaticSpriteRoot") +AffiliationAreaRoot = NodePath("AffiliationAreaRoot") metadata/_edit_vertical_guides_ = [] [node name="WorldEnvironment" type="WorldEnvironment" parent="."] @@ -46,8 +48,13 @@ layer_3/z_index = -10 layer_3/tile_data = PackedInt32Array() +[node name="StaticSpriteRoot" type="Node2D" parent="."] +z_index = -2 + [node name="NormalLayer" type="Node2D" parent="."] z_index = -1 [node name="YSortLayer" type="Node2D" parent="."] y_sort_enabled = true + +[node name="AffiliationAreaRoot" type="Node2D" parent="."] diff --git a/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs b/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs index 3c2b985..1cc6cd9 100644 --- a/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs +++ b/DungeonShooting_Godot/src/framework/map/DungeonGenerator.cs @@ -612,15 +612,15 @@ { roomDoor.Direction = DoorDirection.S; nextRoomDoor.Direction = DoorDirection.N; - roomDoor.OriginPosition = new Vector2(x, room.GetVerticalEnd()); - nextRoomDoor.OriginPosition = new Vector2(x, nextRoom.GetVerticalStart()); + roomDoor.OriginPosition = new Vector2I(x, room.GetVerticalEnd()); + nextRoomDoor.OriginPosition = new Vector2I(x, nextRoom.GetVerticalStart()); } else //room在下, nextRoom在上 { roomDoor.Direction = DoorDirection.N; nextRoomDoor.Direction = DoorDirection.S; - roomDoor.OriginPosition = new Vector2(x, room.GetVerticalStart()); - nextRoomDoor.OriginPosition = new Vector2(x, nextRoom.GetVerticalEnd()); + roomDoor.OriginPosition = new Vector2I(x, room.GetVerticalStart()); + nextRoomDoor.OriginPosition = new Vector2I(x, nextRoom.GetVerticalEnd()); } //判断门之间的通道是否有物体碰到 @@ -664,15 +664,15 @@ { roomDoor.Direction = DoorDirection.E; nextRoomDoor.Direction = DoorDirection.W; - roomDoor.OriginPosition = new Vector2(room.GetHorizontalEnd(), y); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart(), y); + roomDoor.OriginPosition = new Vector2I(room.GetHorizontalEnd(), y); + nextRoomDoor.OriginPosition = new Vector2I(nextRoom.GetHorizontalStart(), y); } else //room在右, nextRoom在左 { roomDoor.Direction = DoorDirection.W; nextRoomDoor.Direction = DoorDirection.E; - roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart(), y); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalEnd(), y); + roomDoor.OriginPosition = new Vector2I(room.GetHorizontalStart(), y); + nextRoomDoor.OriginPosition = new Vector2I(nextRoom.GetHorizontalEnd(), y); } //判断门之间的通道是否有物体碰到 @@ -698,7 +698,7 @@ private bool TryConnectCrossDoor(RoomInfo room, RoomDoorInfo roomDoor, RoomInfo nextRoom, RoomDoorInfo nextRoomDoor) { //焦点 - Vector2 cross = default; + Vector2I cross = default; if (room.GetHorizontalStart() > nextRoom.GetHorizontalStart()) { @@ -929,7 +929,7 @@ } } - private bool TryConnect_NE_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + private bool TryConnect_NE_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2I cross) { var offset1 = 0; var offset2 = 0; @@ -941,14 +941,14 @@ return false; } - roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, room.GetVerticalStart()); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalEnd(), + roomDoor.OriginPosition = new Vector2I(room.GetHorizontalStart() + offset1, room.GetVerticalStart()); + nextRoomDoor.OriginPosition = new Vector2I(nextRoom.GetHorizontalEnd(), nextRoom.GetVerticalStart() + offset2); - cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + cross = new Vector2I(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); return true; } - private bool TryConnect_WS_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + private bool TryConnect_WS_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2I cross) { //ok var offset1 = 0; @@ -961,13 +961,13 @@ return false; } - roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart(), room.GetVerticalStart() + offset1); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset2, nextRoom.GetVerticalEnd()); - cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + roomDoor.OriginPosition = new Vector2I(room.GetHorizontalStart(), room.GetVerticalStart() + offset1); + nextRoomDoor.OriginPosition = new Vector2I(nextRoom.GetHorizontalStart() + offset2, nextRoom.GetVerticalEnd()); + cross = new Vector2I(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); return true; } - private bool TryConnect_SE_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + private bool TryConnect_SE_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2I cross) { var offset1 = 0; var offset2 = 0; @@ -979,14 +979,14 @@ return false; } - roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, room.GetVerticalEnd()); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalEnd(), + roomDoor.OriginPosition = new Vector2I(room.GetHorizontalStart() + offset1, room.GetVerticalEnd()); + nextRoomDoor.OriginPosition = new Vector2I(nextRoom.GetHorizontalEnd(), nextRoom.GetVerticalStart() + offset2); - cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + cross = new Vector2I(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); return true; } - private bool TryConnect_WN_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + private bool TryConnect_WN_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2I cross) { var offset1 = 0; var offset2 = 0; @@ -999,14 +999,14 @@ } roomDoor.OriginPosition = - new Vector2(room.GetHorizontalStart(), room.GetVerticalStart() + offset1); // - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset2, + new Vector2I(room.GetHorizontalStart(), room.GetVerticalStart() + offset1); // + nextRoomDoor.OriginPosition = new Vector2I(nextRoom.GetHorizontalStart() + offset2, nextRoom.GetVerticalStart()); - cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + cross = new Vector2I(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); return true; } - private bool TryConnect_ES_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + private bool TryConnect_ES_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2I cross) { var offset1 = 0; var offset2 = 0; @@ -1018,14 +1018,14 @@ return false; } - roomDoor.OriginPosition = new Vector2(room.GetHorizontalEnd(), room.GetVerticalStart() + offset1); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset2, + roomDoor.OriginPosition = new Vector2I(room.GetHorizontalEnd(), room.GetVerticalStart() + offset1); + nextRoomDoor.OriginPosition = new Vector2I(nextRoom.GetHorizontalStart() + offset2, nextRoom.GetVerticalEnd()); - cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + cross = new Vector2I(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); return true; } - private bool TryConnect_NW_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + private bool TryConnect_NW_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2I cross) { var offset1 = 0; var offset2 = 0; @@ -1037,14 +1037,14 @@ return false; } - roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, room.GetVerticalStart()); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart(), + roomDoor.OriginPosition = new Vector2I(room.GetHorizontalStart() + offset1, room.GetVerticalStart()); + nextRoomDoor.OriginPosition = new Vector2I(nextRoom.GetHorizontalStart(), nextRoom.GetVerticalStart() + offset2); - cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + cross = new Vector2I(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); return true; } - private bool TryConnect_EN_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + private bool TryConnect_EN_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2I cross) { var offset1 = 0; var offset2 = 0; @@ -1056,14 +1056,14 @@ return false; } - roomDoor.OriginPosition = new Vector2(room.GetHorizontalEnd(), + roomDoor.OriginPosition = new Vector2I(room.GetHorizontalEnd(), room.GetVerticalStart() + offset1); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart() + offset2, nextRoom.GetVerticalStart()); - cross = new Vector2(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); + nextRoomDoor.OriginPosition = new Vector2I(nextRoom.GetHorizontalStart() + offset2, nextRoom.GetVerticalStart()); + cross = new Vector2I(nextRoomDoor.OriginPosition.X, roomDoor.OriginPosition.Y); return true; } - private bool TryConnect_SW_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2 cross) + private bool TryConnect_SW_Door(RoomInfo room, RoomInfo nextRoom, RoomDoorInfo roomDoor, RoomDoorInfo nextRoomDoor, ref Vector2I cross) { var offset1 = 0; var offset2 = 0; @@ -1075,10 +1075,10 @@ return false; } - roomDoor.OriginPosition = new Vector2(room.GetHorizontalStart() + offset1, + roomDoor.OriginPosition = new Vector2I(room.GetHorizontalStart() + offset1, room.GetVerticalEnd()); - nextRoomDoor.OriginPosition = new Vector2(nextRoom.GetHorizontalStart(), nextRoom.GetVerticalStart() + offset2); - cross = new Vector2(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); + nextRoomDoor.OriginPosition = new Vector2I(nextRoom.GetHorizontalStart(), nextRoom.GetVerticalStart() + offset2); + cross = new Vector2I(roomDoor.OriginPosition.X, nextRoomDoor.OriginPosition.Y); return true; } diff --git a/DungeonShooting_Godot/src/framework/map/RoomDoorInfo.cs b/DungeonShooting_Godot/src/framework/map/RoomDoorInfo.cs index 9de13d0..6e029fa 100644 --- a/DungeonShooting_Godot/src/framework/map/RoomDoorInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/RoomDoorInfo.cs @@ -29,7 +29,7 @@ /// /// 原点坐标, 单位: 格 /// - public Vector2 OriginPosition; + public Vector2I OriginPosition; /// /// 与下一道门是否有交叉点 @@ -39,7 +39,7 @@ /// /// 与下一道门的交叉点, 单位: 格 /// - public Vector2 Cross; + public Vector2I Cross; /// /// 占位导航网格 @@ -50,4 +50,15 @@ /// 门实例 /// public RoomDoor Door; + + /// + /// 世界坐标下的原点坐标, 单位: 像素 + /// + public Vector2I GetWorldOriginPosition() + { + return new Vector2I( + OriginPosition.X * GameConfig.TileCellSize, + OriginPosition.Y * GameConfig.TileCellSize + ); + } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/RoomInfo.cs b/DungeonShooting_Godot/src/framework/map/RoomInfo.cs index c086079..0f7abad 100644 --- a/DungeonShooting_Godot/src/framework/map/RoomInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/RoomInfo.cs @@ -75,6 +75,11 @@ public AffiliationArea Affiliation; /// + /// 静态精灵绘制画布 + /// + public RoomStaticSpriteCanvas StaticSpriteCanvas; + + /// /// 是否处于闭关状态, 也就是房间门没有主动打开 /// public bool IsSeclusion { get; private set; } = false; @@ -90,9 +95,9 @@ /// /// 获取房间的全局坐标, 单位: 像素 /// - public Vector2 GetWorldPosition() + public Vector2I GetWorldPosition() { - return new Vector2( + return new Vector2I( Position.X * GameConfig.TileCellSize, Position.Y * GameConfig.TileCellSize ); @@ -102,9 +107,9 @@ /// 获取房间左上角的 Tile 距离全局坐标原点的偏移, 单位: 像素 /// /// - public Vector2 GetOffsetPosition() + public Vector2I GetOffsetPosition() { - return RoomSplit.RoomInfo.Position.AsVector2() * GameConfig.TileCellSize; + return RoomSplit.RoomInfo.Position.AsVector2I() * GameConfig.TileCellSize; } /// @@ -138,6 +143,23 @@ { return Position.Y; } + + /// + /// 获取房间宽度, 单位: 像素 + /// + public int GetWidth() + { + return Size.X * GameConfig.TileCellSize; + } + + + /// + /// 获取房间高度, 单位: 像素 + /// + public int GetHeight() + { + return Size.Y * GameConfig.TileCellSize; + } public void Destroy() { @@ -157,6 +179,11 @@ activityMark.QueueFree(); } ActivityMarks.Clear(); + + if (StaticSpriteCanvas != null) + { + StaticSpriteCanvas.Destroy(); + } } /// diff --git a/DungeonShooting_Godot/src/framework/map/RoomStaticSpriteCanvas.cs b/DungeonShooting_Godot/src/framework/map/RoomStaticSpriteCanvas.cs new file mode 100644 index 0000000..e4e8ecb --- /dev/null +++ b/DungeonShooting_Godot/src/framework/map/RoomStaticSpriteCanvas.cs @@ -0,0 +1,33 @@ + +using Godot; + +public class RoomStaticSpriteCanvas : IDestroy +{ + public bool IsDestroyed { get; private set; } + /// + /// 画布节点实例 + /// + public ImageCanvas CanvasSprite { get; } + /// + /// 房间坐标相对于画布坐标偏移量, 单位: 像素 + /// + public Vector2I RoomOffset { get; set; } + + public RoomStaticSpriteCanvas(Node root, Vector2I position, int width, int height) + { + CanvasSprite = new ImageCanvas(width, height); + //CanvasSprite.Clear(new Color(1, 1, 1, 0.2f)); + CanvasSprite.GlobalPosition = position; + root.AddChild(CanvasSprite); + } + + public void Destroy() + { + if (IsDestroyed) + { + return; + } + + IsDestroyed = true; + } +} \ No newline at end of file diff --git a/DungeonShooting_Godot/src/framework/map/image/ImageCanvas.cs b/DungeonShooting_Godot/src/framework/map/image/ImageCanvas.cs index f20d8b6..dcd939c 100644 --- a/DungeonShooting_Godot/src/framework/map/image/ImageCanvas.cs +++ b/DungeonShooting_Godot/src/framework/map/image/ImageCanvas.cs @@ -143,6 +143,23 @@ _texture.Dispose(); } + /// + /// 使用透明色替换掉整个画布 + /// + public void Clear() + { + Clear(new Color(0, 0, 0, 0)); + } + + /// + /// 使用指定颜色替换掉整个画布 + /// + public void Clear(Color color) + { + _canvas.Fill(color); + Redraw(); + } + private void Redraw() { _texture.Update(_canvas); diff --git a/DungeonShooting_Godot/src/framework/map/image/ImageCanvas_Static.cs b/DungeonShooting_Godot/src/framework/map/image/ImageCanvas_Static.cs index 8341a17..bf021fa 100644 --- a/DungeonShooting_Godot/src/framework/map/image/ImageCanvas_Static.cs +++ b/DungeonShooting_Godot/src/framework/map/image/ImageCanvas_Static.cs @@ -52,11 +52,13 @@ { RenderViewportSize = new Vector2I(1024, 185); RenderViewport = new SubViewport(); + RenderViewport.Name = "ImageCanvasViewport"; RenderViewport.Size = RenderViewportSize; RenderViewport.RenderTargetUpdateMode = SubViewport.UpdateMode.Always; RenderViewport.TransparentBg = true; RenderViewport.CanvasItemDefaultTextureFilter = Viewport.DefaultCanvasItemTextureFilter.Nearest; var camera = new Camera2D(); + camera.Name = "ImageCanvasCamera"; camera.AnchorMode = Camera2D.AnchorModeEnum.FixedTopLeft; RenderViewport.AddChild(camera); _viewportTexture = RenderViewport.GetTexture(); diff --git a/DungeonShooting_Godot/src/game/GameApplication.cs b/DungeonShooting_Godot/src/game/GameApplication.cs index e76a4cf..73ecc5c 100644 --- a/DungeonShooting_Godot/src/game/GameApplication.cs +++ b/DungeonShooting_Godot/src/game/GameApplication.cs @@ -88,7 +88,7 @@ public GameApplication() { Instance = this; - + //初始化配置表 ExcelConfig.Init(); //初始化房间配置数据 @@ -113,6 +113,8 @@ ActivityObject.IsDebug = Debug; //Engine.TimeScale = 0.2f; + ImageCanvas.Init(GetTree().CurrentScene); + //窗体大小改变 GetWindow().SizeChanged += OnWindowSizeChanged; RefreshSubViewportSize(); diff --git a/DungeonShooting_Godot/src/game/room/DungeonManager.cs b/DungeonShooting_Godot/src/game/room/DungeonManager.cs index 244e1e7..4c9cd0d 100644 --- a/DungeonShooting_Godot/src/game/room/DungeonManager.cs +++ b/DungeonShooting_Godot/src/game/room/DungeonManager.cs @@ -40,7 +40,6 @@ private World _world; //用于检查房间敌人的计时器 - private int _affiliationIndex = 0; private float _checkEnemyTimer = 0; @@ -220,7 +219,9 @@ //创建门 CreateDoor(roomInfo); //创建房间归属区域 - CreateRoomAisleAffiliation(roomInfo); + CreateRoomAffiliation(roomInfo); + //创建静态精灵画布 + CreateRoomStaticSpriteCanvas(roomInfo); } //挂载房间导航区域 @@ -294,18 +295,117 @@ } //创建房间归属区域 - private void CreateRoomAisleAffiliation(RoomInfo roomInfo) + private void CreateRoomAffiliation(RoomInfo roomInfo) { var affiliation = new AffiliationArea(); - affiliation.Name = "AffiliationArea" + (_affiliationIndex++); + affiliation.Name = "AffiliationArea" + roomInfo.Id; affiliation.Init(roomInfo, new Rect2( roomInfo.GetWorldPosition() + new Vector2(GameConfig.TileCellSize, GameConfig.TileCellSize), (roomInfo.Size - new Vector2I(2, 2)) * GameConfig.TileCellSize)); roomInfo.Affiliation = affiliation; - _world.AddChild(affiliation); + _world.AffiliationAreaRoot.AddChild(affiliation); } - + + //创建静态精灵画布 + private void CreateRoomStaticSpriteCanvas(RoomInfo roomInfo) + { + var worldPos = roomInfo.GetWorldPosition(); + var pos = new Vector2I((int)worldPos.X, (int)worldPos.Y); + + int minX = pos.X; + int minY = pos.Y; + int maxX = minX + roomInfo.GetWidth(); + int maxY = minY + roomInfo.GetHeight(); + + //遍历每一个连接的门, 计算计算canvas覆盖范围 + foreach (var doorInfo in roomInfo.Doors) + { + var connectDoor = doorInfo.ConnectDoor; + switch (connectDoor.Direction) + { + case DoorDirection.E: + case DoorDirection.W: + { + var (px1, py1) = connectDoor.GetWorldOriginPosition(); + var py2 = py1 + 4 * GameConfig.TileCellSize; + if (px1 < minX) + { + minX = (int)px1; + } + else if (px1 > maxX) + { + maxX = (int)px1; + } + + if (py1 < minY) + { + minY = (int)py1; + } + else if (py1 > maxY) + { + maxY = (int)py1; + } + + if (py2 < minY) + { + minY = (int)py2; + } + else if (py2 > maxY) + { + maxY = (int)py2; + } + } + break; + case DoorDirection.S: + case DoorDirection.N: + { + var (px1, py1) = connectDoor.GetWorldOriginPosition(); + var px2 = px1 + 4 * GameConfig.TileCellSize; + if (px1 < minX) + { + minX = (int)px1; + } + else if (px1 > maxX) + { + maxX = (int)px1; + } + + if (py1 < minY) + { + minY = (int)py1; + } + else if (py1 > maxY) + { + maxY = (int)py1; + } + + if (px2 < minX) + { + minX = (int)px2; + } + else if (px2 > maxX) + { + maxX = (int)px2; + } + } + break; + } + } + + minX -= GameConfig.TileCellSize; + minY -= GameConfig.TileCellSize; + maxX += GameConfig.TileCellSize; + maxY += GameConfig.TileCellSize; + var staticSpriteCanvas = new RoomStaticSpriteCanvas( + _world.StaticSpriteRoot, + new Vector2I(minX, minY), + maxX - minX, maxY - minY + ); + staticSpriteCanvas.RoomOffset = new Vector2I(worldPos.X - minX, worldPos.Y - minY); + roomInfo.StaticSpriteCanvas = staticSpriteCanvas; + } + /// /// 玩家第一次进入某个房间回调 /// diff --git a/DungeonShooting_Godot/src/game/room/World.cs b/DungeonShooting_Godot/src/game/room/World.cs index cb6810d..622803c 100644 --- a/DungeonShooting_Godot/src/game/room/World.cs +++ b/DungeonShooting_Godot/src/game/room/World.cs @@ -20,6 +20,9 @@ /// 地图根节点 /// [Export] public TileMap TileRoot; + + [Export] public Node2D StaticSpriteRoot; + [Export] public Node2D AffiliationAreaRoot; /// /// 是否暂停