public void Store(Map map, Stream stream)
        {
            TiledFormatOptionsDialog tiledFormatOptionsDialog
                = new TiledFormatOptionsDialog();

            if (tiledFormatOptionsDialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
            {
                throw new Exception("Store operation cancelled by user");
            }

            TmxEncoding tmxEncoding = tiledFormatOptionsDialog.TmxEncoding;

            XmlTextWriter xmlWriter = new XmlTextWriter(stream, Encoding.UTF8);

            xmlWriter.Formatting = Formatting.Indented;

            xmlWriter.WriteStartDocument();
            xmlWriter.WriteStartElement("map");
            xmlWriter.WriteAttributeString("version", "1.0");
            xmlWriter.WriteAttributeString("orientation", "orthogonal");

            // determine map with from a layer (all assumed same size)
            int mapWidth = 0, mapHeight = 0;
            int tileWidth = 32, tileHeight = 32;

            if (map.Layers.Count > 0)
            {
                Layer firstLayer = map.Layers[0];
                mapWidth   = firstLayer.LayerWidth;
                mapHeight  = firstLayer.LayerHeight;
                tileWidth  = firstLayer.TileWidth;
                tileHeight = firstLayer.TileHeight;
            }

            xmlWriter.WriteAttributeString("width", mapWidth.ToString());
            xmlWriter.WriteAttributeString("height", mapHeight.ToString());

            xmlWriter.WriteAttributeString("tilewidth", tileWidth.ToString());
            xmlWriter.WriteAttributeString("tileheight", tileHeight.ToString());

            // preserve tIDE map description as TMX map property
            if (map.Description.Length > 0)
            {
                map.Properties["@Description"] = map.Description;
            }

            StoreProperties(map, xmlWriter);

            map.Properties.Remove("@Description");

            // store tile sets
            StoreTileSets(map.TileSheets, xmlWriter);

            // store layers
            StoreLayers(map.Layers, xmlWriter, tmxEncoding);

            xmlWriter.WriteEndElement();

            xmlWriter.Flush();
        }
 private void StoreLayers(ReadOnlyCollection <Layer> layers, XmlWriter xmlTextWriter, TmxEncoding tmxEncoding)
 {
     foreach (Layer layer in layers)
     {
         StoreLayer(layer, xmlTextWriter, tmxEncoding);
     }
 }
        private void StoreLayer(Layer layer, XmlWriter xmlWriter, TmxEncoding tmxEncoding)
        {
            xmlWriter.WriteStartElement("layer");

            xmlWriter.WriteAttributeString("name", layer.Id);
            xmlWriter.WriteAttributeString("width", layer.LayerWidth.ToString());
            xmlWriter.WriteAttributeString("height", layer.LayerHeight.ToString());

            // visible by default - specify property otherwise
            if (!layer.Visible)
            {
                xmlWriter.WriteAttributeString("visible", "0");
            }

            // handle description as custom property
            layer.Properties["@Description"] = layer.Description;

            // store properties
            StoreProperties(layer, xmlWriter);

            xmlWriter.WriteStartElement("data");

            switch (tmxEncoding)
            {
            case TmxEncoding.Xml:
                xmlWriter.WriteAttributeString("encoding", "xml");
                break;

            case TmxEncoding.Base64:
                xmlWriter.WriteAttributeString("encoding", "base64");
                break;

            case TmxEncoding.Base64Gzip:
                xmlWriter.WriteAttributeString("encoding", "base64");
                xmlWriter.WriteAttributeString("compression", "gzip");
                break;

            case TmxEncoding.Base64Zlib:
                xmlWriter.WriteAttributeString("encoding", "base64");
                xmlWriter.WriteAttributeString("compression", "zlib");
                break;

            case TmxEncoding.Csv:
                xmlWriter.WriteAttributeString("encoding", "csv");
                break;
            }

            // annotate tilesheets with first gid to simplify mapping
            int firstGid = 1;

            foreach (TileSheet tileSheet in layer.Map.TileSheets)
            {
                tileSheet.Properties["@FirstGid"] = firstGid;
                firstGid += tileSheet.TileCount;
            }

            // convert to TMX tile indices using firstGid of each tile set
            List <int> tileIndices = new List <int>();

            for (int tileY = 0; tileY < layer.LayerHeight; tileY++)
            {
                for (int tileX = 0; tileX < layer.LayerWidth; tileX++)
                {
                    Tile tile = layer.Tiles[tileX, tileY];

                    int tileIndex = 0; // null tile index
                    if (tile != null)
                    {
                        tileIndex = tile.TileIndex + tile.TileSheet.Properties["@FirstGid"];
                    }

                    tileIndices.Add(tileIndex);
                }
            }

            switch (tmxEncoding)
            {
            case TmxEncoding.Xml:
                StoreLayerDataXml(tileIndices, xmlWriter);
                break;

            case TmxEncoding.Base64:
                StoreLayerDataBase64(tileIndices, xmlWriter, "none");
                break;

            case TmxEncoding.Base64Gzip:
                StoreLayerDataBase64(tileIndices, xmlWriter, "gzip");
                break;

            case TmxEncoding.Base64Zlib:
                StoreLayerDataBase64(tileIndices, xmlWriter, "zlib");
                break;

            case TmxEncoding.Csv:
                StoreLayerDataCsv(tileIndices, xmlWriter);
                break;
            }

            // data closing tag
            xmlWriter.WriteEndElement();

            // layer closing tag
            xmlWriter.WriteEndElement();
        }
Example #4
0
 private void StoreLayers(ReadOnlyCollection<Layer> layers, XmlWriter xmlTextWriter, TmxEncoding tmxEncoding)
 {
     foreach (Layer layer in layers)
         StoreLayer(layer, xmlTextWriter, tmxEncoding);
 }
Example #5
0
        private void StoreLayer(Layer layer, XmlWriter xmlWriter, TmxEncoding tmxEncoding)
        {
            xmlWriter.WriteStartElement("layer");

            xmlWriter.WriteAttributeString("name", layer.Id);
            xmlWriter.WriteAttributeString("width", layer.LayerWidth.ToString());
            xmlWriter.WriteAttributeString("height", layer.LayerHeight.ToString());

            // visible by default - specify property otherwise
            if (!layer.Visible)
                xmlWriter.WriteAttributeString("visible", "0");

            // handle description as custom property
            layer.Properties["@Description"] = layer.Description;

            // store properties
            StoreProperties(layer, xmlWriter);

            xmlWriter.WriteStartElement("data");

            switch (tmxEncoding)
            {
                case TmxEncoding.Xml:
                    xmlWriter.WriteAttributeString("encoding", "xml");
                    break;
                case TmxEncoding.Base64:
                    xmlWriter.WriteAttributeString("encoding", "base64");
                    break;
                case TmxEncoding.Base64Gzip:
                    xmlWriter.WriteAttributeString("encoding", "base64");
                    xmlWriter.WriteAttributeString("compression", "gzip");
                    break;
                case TmxEncoding.Base64Zlib:
                    xmlWriter.WriteAttributeString("encoding", "base64");
                    xmlWriter.WriteAttributeString("compression", "zlib");
                    break;
                case TmxEncoding.Csv:
                    xmlWriter.WriteAttributeString("encoding", "csv");
                    break;
            }

            // annotate tilesheets with first gid to simplify mapping
            int firstGid = 1;
            foreach (TileSheet tileSheet in layer.Map.TileSheets)
            {
                tileSheet.Properties["@FirstGid"] = firstGid;
                firstGid += tileSheet.TileCount;
            }

            // convert to TMX tile indices using firstGid of each tile set
            List<int> tileIndices = new List<int>();
            for (int tileY = 0; tileY < layer.LayerHeight; tileY++)
            {
                for (int tileX = 0; tileX < layer.LayerWidth; tileX++)
                {
                    Tile tile = layer.Tiles[tileX, tileY];

                    int tileIndex = 0; // null tile index
                    if (tile != null)
                        tileIndex = tile.TileIndex + tile.TileSheet.Properties["@FirstGid"];

                    tileIndices.Add(tileIndex);
                }
            }

            switch (tmxEncoding)
            {
                case TmxEncoding.Xml:
                    StoreLayerDataXml(tileIndices, xmlWriter);
                    break;
                case TmxEncoding.Base64:
                    StoreLayerDataBase64(tileIndices, xmlWriter, "none");
                    break;
                case TmxEncoding.Base64Gzip:
                    StoreLayerDataBase64(tileIndices, xmlWriter, "gzip");
                    break;
                case TmxEncoding.Base64Zlib:
                    StoreLayerDataBase64(tileIndices, xmlWriter, "zlib");
                    break;
                case TmxEncoding.Csv:
                    StoreLayerDataCsv(tileIndices, xmlWriter);
                    break;
            }

            // data closing tag
            xmlWriter.WriteEndElement();

            // layer closing tag
            xmlWriter.WriteEndElement();
        }