diff --git a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs index d0ee602..3f92d14 100644 --- a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs +++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs @@ -1,4 +1,5 @@  +using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; using Godot; @@ -98,11 +99,12 @@ { //TileSet网格大小 _tileSet.TileSize = GameConfig.TileCellSizeVector2I; - //物理层 + //物理层 0 _tileSet.AddPhysicsLayer(); _tileSet.SetPhysicsLayerCollisionLayer(0, PhysicsLayer.Wall); - _tileSet.SetPhysicsLayerCollisionMask(0, PhysicsLayer.None); - //地形层 + _tileSet.SetPhysicsLayerCollisionMask(0, PhysicsLayer.Wall); + Debug.Log("GetPhysicsLayersCount: " + _tileSet.GetPhysicsLayersCount()); + //地形层 0 _tileSet.AddTerrainSet(); _tileSet.SetTerrainSetMode(0, TileSet.TerrainMode.CornersAndSides); _tileSet.AddTerrain(0); @@ -129,23 +131,60 @@ //初始化地形 tileSetAtlasSource.InitTerrain(terrainInfo, 0, 0); //ySort - var index = terrainInfo.TerrainCoordsToIndex(new Vector2I(0, 2)); - if (terrainInfo.T.TryGetValue(index, out var value)) - { - var pos = terrainInfo.GetPosition(value); - var tileData = tileSetAtlasSource.GetTileData(pos, 0); - tileData.YSortOrigin = 23; - } + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 2), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 2), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 2), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 2), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 3), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 3), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 3), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 3), 23); + + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 3), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 3), 23); + + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 3), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 3), 23); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 3), 23); + + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 0), 7); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 0), 7); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 0), 7); + SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 0), 7); //碰撞器 - + var index = terrainInfo.TerrainCoordsToIndex(new Vector2I(0, 0), 1); + var cellData = terrainInfo.GetTerrainBit(index, 1); + var pos = terrainInfo.GetPosition(cellData); + var tileData = tileSetAtlasSource.GetTileData(pos, 0); + tileData.AddCollisionPolygon(0); + tileData.SetCollisionPolygonPoints(0, 0, new [] + { + new Vector2(0, 0), + new Vector2(8, 0), + new Vector2(8, 8), + new Vector2(0, 8), + }); + _tileSet.AddSource(tileSetAtlasSource); } } return _tileSet; } - + + private static void SetAtlasSourceYSortOrigin(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I coords, int ySortOrigin) + { + var index = terrainInfo.TerrainCoordsToIndex(coords, type); + var cellData = terrainInfo.GetTerrainBit(index, type); + if (cellData != null) + { + var pos = terrainInfo.GetPosition(cellData); + var tileData = tileSetAtlasSource.GetTileData(pos, 0); + tileData.YSortOrigin = ySortOrigin; + } + } + public void Destroy() { if (IsDestroyed) return; diff --git a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs index 63a1bfa..4b00c73 100644 --- a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs @@ -10,14 +10,17 @@ { //---------------------- 地板 ---------------------- + //type = 3 [JsonInclude] public Dictionary F; //---------------------- 侧方墙壁 -------------------------- + //type = 2 [JsonInclude] public Dictionary M; //---------------------- 顶部墙壁47格 ---------------------- + //type = 1 [JsonInclude] public Dictionary T; public void InitData() @@ -35,9 +38,22 @@ return new Vector2I(ints[0] / GameConfig.TileCellSize, ints[1] / GameConfig.TileCellSize); } - public uint TerrainCoordsToIndex(Vector2I coords) + public int TerrainCoordsToIndex(Vector2I coords, byte type) { - return (uint)(coords.Y * GameConfig.TerrainBitSize1.X + coords.X); + if (type == 1) + { + return coords.Y * GameConfig.TerrainBitSize1.X + coords.X; + } + else if (type == 2) + { + return coords.Y * GameConfig.TerrainBitSize2.X + coords.X; + } + else if (type == 3) + { + return coords.Y * GameConfig.TerrainBitSize3.X + coords.X; + } + + return -1; } public TileSetTerrainInfo Clone() @@ -133,6 +149,81 @@ F[0] = cellData; } } + + /// + /// 移除地形掩码 + /// + public void RemoveTerrainBit(int index, byte type) + { + if (type == 1) //顶部墙壁 + { + switch (index) + { + case 0: T.Remove(TerrainPeering.Center| TerrainPeering.Bottom); break; + case 1: T.Remove(TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom); break; + case 2: T.Remove(TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom); break; + case 3: T.Remove(TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Bottom); break; + case 4: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom); break; + case 5: T.Remove(TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 6: T.Remove(TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom); break; + case 7: T.Remove(TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom); break; + case 8: T.Remove(TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 9: T.Remove(TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 10: T.Remove(TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 11: T.Remove(TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.LeftBottom| TerrainPeering.Bottom); break; + case 12: T.Remove(TerrainPeering.Top| TerrainPeering.Center| TerrainPeering.Bottom); break; + case 13: T.Remove(TerrainPeering.Top| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom); break; + case 14: T.Remove(TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom); break; + case 15: T.Remove(TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Bottom); break; + case 16: T.Remove(TerrainPeering.Top| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 17: T.Remove(TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 18: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 19: T.Remove(TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.LeftBottom| TerrainPeering.Bottom); break; + case 20: T.Remove(TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 21: T.Remove(TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom); break; + case 22: break; + case 23: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom); break; + case 24: T.Remove(TerrainPeering.Top| TerrainPeering.Center); break; + case 25: T.Remove(TerrainPeering.Top| TerrainPeering.Center| TerrainPeering.Right); break; + case 26: T.Remove(TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right); break; + case 27: T.Remove(TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center); break; + case 28: T.Remove(TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom); break; + case 29: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 30: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom); break; + case 31: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Bottom); break; + case 32: T.Remove(TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 33: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 34: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 35: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.LeftBottom| TerrainPeering.Bottom); break; + case 36: T.Remove(TerrainPeering.Center); break; + case 37: T.Remove(TerrainPeering.Center| TerrainPeering.Right); break; + case 38: T.Remove(TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right); break; + case 39: T.Remove(TerrainPeering.Left| TerrainPeering.Center); break; + case 40: T.Remove(TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.LeftBottom| TerrainPeering.Bottom); break; + case 41: T.Remove(TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right); break; + case 42: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right); break; + case 43: T.Remove(TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom| TerrainPeering.RightBottom); break; + case 44: T.Remove(TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Center| TerrainPeering.Right); break; + case 45: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right); break; + case 46: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.RightTop| TerrainPeering.Left| TerrainPeering.Center| TerrainPeering.Right| TerrainPeering.Bottom); break; + case 47: T.Remove(TerrainPeering.LeftTop| TerrainPeering.Top| TerrainPeering.Left| TerrainPeering.Center); break; + } + } + else if (type == 2) //侧方墙壁 + { + switch (index) + { + case 0: M.Remove(0); break; + case 1: M.Remove(1); break; + case 2: M.Remove(2); break; + case 3: M.Remove(3); break; + } + } + else if (type == 3) //地板 + { + F.Remove(0); + } + } /// /// 获取指定索引的地形掩码存储的数据 diff --git a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainCellDropHandler.cs b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainCellDropHandler.cs index 7427078..b35f9dc 100644 --- a/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainCellDropHandler.cs +++ b/DungeonShooting_Godot/src/game/ui/tileSetEditorTerrain/up/TerrainCellDropHandler.cs @@ -74,7 +74,15 @@ private void SetTerrainBitData(int[] cellData) { - _panel.EditorPanel.TileSetSourceInfo.Terrain.SetTerrainBit(_cell.Index, _cell.Data, cellData); + if (cellData == null) + { + _panel.EditorPanel.TileSetSourceInfo.Terrain.RemoveTerrainBit(_cell.Index, _cell.Data); + } + else + { + _panel.EditorPanel.TileSetSourceInfo.Terrain.SetTerrainBit(_cell.Index, _cell.Data, cellData); + } + EventManager.EmitEvent(EventEnum.OnTileSetDirty); } } \ No newline at end of file diff --git a/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs b/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs index 2f87a29..3784a40 100644 --- a/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs +++ b/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs @@ -26,6 +26,7 @@ new Vector2I(10, 12), new Vector2I(11, 12), }, 0, 0, false); + ResourceSaver.Save(tileSet, "res://" + GameConfig.RoomTileSetDir + "test_tile_set.tres"); } //初始化TileSet配置