Пример #1
0
        protected override TiledMap Read(ContentReader reader, TiledMap existingInstance)
        {
            var backgroundColor = reader.ReadColor();
            var renderOrder     = (TiledRenderOrder)Enum.Parse(typeof(TiledRenderOrder), reader.ReadString(), true);
            var tiledMap        = new TiledMap(firstGid: reader.ReadInt32(),
                                               width: reader.ReadInt32(),
                                               height: reader.ReadInt32(),
                                               tileWidth: reader.ReadInt32(),
                                               tileHeight: reader.ReadInt32(),
                                               orientation: (TiledMapOrientation)reader.ReadInt32())
            {
                BackgroundColor = backgroundColor,
                RenderOrder     = renderOrder
            };

            tiledMap.LargestTileWidth  = reader.ReadInt32();
            tiledMap.LargestTileHeight = reader.ReadInt32();

            // determine if we have some tiles that are larger than our standard tile size and if so mark this map for requiring culling
            if (tiledMap.LargestTileWidth > tiledMap.TileWidth || tiledMap.LargestTileHeight > tiledMap.TileHeight)
            {
                tiledMap.requiresLargeTileCulling = true;
            }

            ReadCustomProperties(reader, tiledMap.Properties);

            var tilesetCount = reader.ReadInt32();

            for (var i = 0; i < tilesetCount; i++)
            {
                var isStandardTileset = reader.ReadBoolean();

                // image collections will have not texture associated with them
                var       textureName = reader.ReadString();
                Texture2D texture     = null;
                if (textureName != string.Empty)
                {
                    var textureAssetName = reader.GetRelativeAssetPath(textureName);
                    texture = reader.ContentManager.Load <Texture2D>(textureAssetName);
                }

                var tileset = tiledMap.CreateTileset(
                    texture: texture,
                    firstId: reader.ReadInt32(),
                    tileWidth: reader.ReadInt32(),
                    tileHeight: reader.ReadInt32(),
                    isStandardTileset: isStandardTileset,
                    spacing: reader.ReadInt32(),
                    margin: reader.ReadInt32(),
                    tileCount: reader.ReadInt32(),
                    columns: reader.ReadInt32());
                ReadCustomProperties(reader, tileset.Properties);

                // tiledset tile array
                var tileCount = reader.ReadInt32();
                for (var j = 0; j < tileCount; j++)
                {
                    var tile = new TiledTilesetTile(reader.ReadInt32(), tiledMap);

                    var tileAnimationFrameCount = reader.ReadInt32();
                    if (tileAnimationFrameCount > 0)
                    {
                        tile.AnimationFrames = new List <TiledTileAnimationFrame>(tileAnimationFrameCount);
                    }

                    for (var k = 0; k < tileAnimationFrameCount; k++)
                    {
                        tile.AnimationFrames.Add(new TiledTileAnimationFrame(reader.ReadInt32(), reader.ReadSingle()));
                    }

                    // image source is optional
                    var isFromImageCollection = reader.ReadBoolean();
                    if (isFromImageCollection)
                    {
                        var rect = new Rectangle(reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32(), reader.ReadInt32());
                        ((TiledImageCollectionTileset)tileset).SetTileTextureRegion(tileset.FirstId + tile.Id, rect);
                    }

                    ReadCustomProperties(reader, tile.Properties);

                    var tileObjectGroupCount = reader.ReadInt32();
                    if (tileObjectGroupCount > 0)
                    {
                        tile.ObjectGroups = new List <TiledObjectGroup>(tileObjectGroupCount);
                    }
                    for (var k = 0; k < tileObjectGroupCount; k++)
                    {
                        tile.ObjectGroups.Add(ReadObjectGroup(reader, tiledMap));
                    }

                    // give the TiledTilesetTile a chance to process and cache any data required
                    tile.ProcessProperties();

                    // if this tile is from an image collection and it has no properties there is no need to keep it around since we
                    // already grabbed the image source above
                    if (!(isFromImageCollection && tile.Properties.Count == 0))
                    {
                        tileset.Tiles.Add(tile);
                    }
                }
            }

            var layerCount = reader.ReadInt32();

            for (var i = 0; i < layerCount; i++)
            {
                var layer = ReadLayer(reader, tiledMap);
                ReadCustomProperties(reader, layer.Properties);
            }


            var objectGroupCount = reader.ReadInt32();

            for (var i = 0; i < objectGroupCount; i++)
            {
                tiledMap.ObjectGroups.Add(ReadObjectGroup(reader, tiledMap));
            }

            return(tiledMap);
        }