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(); }
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(); }