diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn index faf871a..d7de309 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0008.tscn @@ -154,7 +154,7 @@ position = Vector2(-2, -3) [node name="FirePoint" type="Marker2D" parent="AnimatedSprite"] -position = Vector2(7, -1.5) +position = Vector2(12, -1.5) [node name="Collision" type="CollisionShape2D" parent="."] position = Vector2(3, 0) diff --git a/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn b/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn index 70a21c3..285a2fa 100644 --- a/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn +++ b/DungeonShooting_Godot/prefab/weapon/Weapon0009.tscn @@ -154,7 +154,7 @@ position = Vector2(-2, -2) [node name="FirePoint" type="Marker2D" parent="AnimatedSprite"] -position = Vector2(13, -0.5) +position = Vector2(19, -1.5) [node name="Collision" type="CollisionShape2D" parent="."] position = Vector2(6, 0) diff --git a/DungeonShooting_Godot/project.godot b/DungeonShooting_Godot/project.godot index 843e374..8fdcd2e 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/TestLoadTileSetConfig.tscn" +run/main_scene="res://scene/Main.tscn" config/features=PackedStringArray("4.2", "C#") config/icon="res://icon.png" diff --git a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/TileSet.json b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/TileSet.json index 5bb1ccf..b1c5bb6 100644 --- a/DungeonShooting_Godot/resource/map/tileSet/TileSet1/TileSet.json +++ b/DungeonShooting_Godot/resource/map/tileSet/TileSet1/TileSet.json @@ -7,7 +7,7 @@ "Terrain": { "F": { "0": [ - 0, + 80, 64 ] }, diff --git a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs index 3f92d14..62544f0 100644 --- a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs +++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetSplit.cs @@ -78,6 +78,12 @@ { var asText = ResourceManager.LoadText("res://" + TileSetPath); _tileSetInfo = JsonSerializer.Deserialize(asText); + + if (_tileSet != null) + { + _tileSet.Dispose(); + _tileSet = null; + } } /// @@ -102,7 +108,7 @@ //物理层 0 _tileSet.AddPhysicsLayer(); _tileSet.SetPhysicsLayerCollisionLayer(0, PhysicsLayer.Wall); - _tileSet.SetPhysicsLayerCollisionMask(0, PhysicsLayer.Wall); + _tileSet.SetPhysicsLayerCollisionMask(0, PhysicsLayer.None); Debug.Log("GetPhysicsLayersCount: " + _tileSet.GetPhysicsLayersCount()); //地形层 0 _tileSet.AddTerrainSet(); @@ -113,6 +119,7 @@ foreach (var tileSetSourceInfo in _tileSetInfo.Sources) { var tileSetAtlasSource = new TileSetAtlasSource(); + _tileSet.AddSource(tileSetAtlasSource); //纹理 var image = tileSetSourceInfo.GetSourceImage(); tileSetAtlasSource.Texture = ImageTexture.CreateFromImage(image); @@ -153,29 +160,86 @@ 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); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 0), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 0), true); + + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 1), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 1), false); + + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 2), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 2), false); + + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 3), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 3), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 3), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 3), true); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 3), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 3), false); + + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 4), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 4), false); + + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 0), false); + SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 0), false); } } return _tileSet; } - private static void SetAtlasSourceYSortOrigin(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I coords, int ySortOrigin) + /// + /// 设置地图块的 Y 排序原点。 + /// + private static void SetAtlasSourceYSortOrigin(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I bitCoords, int ySortOrigin) { - var index = terrainInfo.TerrainCoordsToIndex(coords, type); + var index = terrainInfo.TerrainCoordsToIndex(bitCoords, type); var cellData = terrainInfo.GetTerrainBit(index, type); if (cellData != null) { @@ -185,6 +249,41 @@ } } + /// + /// 设置Atlas源碰撞信息, isHalf: 是否半块 + /// + private static void SetAtlasSourceCollision(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I bitCoords, bool isHalf) + { + var index = terrainInfo.TerrainCoordsToIndex(bitCoords, type); + var cellData = terrainInfo.GetTerrainBit(index, type); + if (cellData != null) + { + var pos = terrainInfo.GetPosition(cellData); + var tileData = tileSetAtlasSource.GetTileData(pos, 0); + tileData.AddCollisionPolygon(0); + if (isHalf) + { + tileData.SetCollisionPolygonPoints(0, 0, new[] + { + new Vector2(-8, 0), + new Vector2(8, 0), + new Vector2(8, 8), + new Vector2(-8, 8) + }); + } + else + { + tileData.SetCollisionPolygonPoints(0, 0, new [] + { + new Vector2(-8, -8), + new Vector2(8, -8), + new Vector2(8, 8), + new Vector2(-8, 8) + }); + } + } + } + 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 4b00c73..53043ad 100644 --- a/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs +++ b/DungeonShooting_Godot/src/framework/map/serialize/tileSet/TileSetTerrainInfo.cs @@ -38,19 +38,19 @@ return new Vector2I(ints[0] / GameConfig.TileCellSize, ints[1] / GameConfig.TileCellSize); } - public int TerrainCoordsToIndex(Vector2I coords, byte type) + public int TerrainCoordsToIndex(Vector2I bitCoords, byte type) { if (type == 1) { - return coords.Y * GameConfig.TerrainBitSize1.X + coords.X; + return bitCoords.Y * GameConfig.TerrainBitSize1.X + bitCoords.X; } else if (type == 2) { - return coords.Y * GameConfig.TerrainBitSize2.X + coords.X; + return bitCoords.Y * GameConfig.TerrainBitSize2.X + bitCoords.X; } else if (type == 3) { - return coords.Y * GameConfig.TerrainBitSize3.X + coords.X; + return bitCoords.Y * GameConfig.TerrainBitSize3.X + bitCoords.X; } return -1; diff --git a/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs b/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs index 3784a40..2f87a29 100644 --- a/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs +++ b/DungeonShooting_Godot/src/test/TestLoadTileSetConfig.cs @@ -26,7 +26,6 @@ new Vector2I(10, 12), new Vector2I(11, 12), }, 0, 0, false); - ResourceSaver.Save(tileSet, "res://" + GameConfig.RoomTileSetDir + "test_tile_set.tres"); } //初始化TileSet配置