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;
///
/// 是否暂停