📄 xmlmapwriter.java
字号:
/* * Tiled Map Editor, (c) 2004-2006 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Adam Turk <aturk@biggeruniverse.com> * Bjorn Lindeijer <b.lindeijer@xs4all.nl> */package tiled.io.xml;import java.awt.Color;import java.awt.Image;import java.awt.Rectangle;import java.io.*;import java.util.Enumeration;import java.util.Iterator;import java.util.Properties;import java.util.Vector;import java.util.prefs.Preferences;import java.util.zip.GZIPOutputStream;import tiled.core.*;import tiled.io.ImageHelper;import tiled.io.MapWriter;import tiled.io.PluginLogger;import tiled.mapeditor.selection.SelectionLayer;import tiled.util.Base64;import tiled.util.TiledConfiguration;/** * @version $Id: XMLMapWriter.java 688 2006-07-08 11:55:38Z bjorn $ */public class XMLMapWriter implements MapWriter{ private static final int LAST_BYTE = 0x000000FF; /** * Saves a map to an XML file. * * @param filename the filename of the map file */ public void writeMap(Map map, String filename) throws Exception { OutputStream os = new FileOutputStream(filename); if (filename.endsWith(".tmx.gz")) { os = new GZIPOutputStream(os); } Writer writer = new OutputStreamWriter(os); XMLWriter xmlWriter = new XMLWriter(writer); xmlWriter.startDocument(); writeMap(map, xmlWriter, filename); xmlWriter.endDocument(); writer.flush(); if (os instanceof GZIPOutputStream) { ((GZIPOutputStream)os).finish(); } } /** * Saves a tileset to an XML file. * * @param filename the filename of the tileset file */ public void writeTileset(TileSet set, String filename) throws Exception { OutputStream os = new FileOutputStream(filename); Writer writer = new OutputStreamWriter(os); XMLWriter xmlWriter = new XMLWriter(writer); xmlWriter.startDocument(); writeTileset(set, xmlWriter, filename); xmlWriter.endDocument(); writer.flush(); } public void writeMap(Map map, OutputStream out) throws Exception { Writer writer = new OutputStreamWriter(out); XMLWriter xmlWriter = new XMLWriter(writer); xmlWriter.startDocument(); writeMap(map, xmlWriter, "/."); xmlWriter.endDocument(); writer.flush(); } public void writeTileset(TileSet set, OutputStream out) throws Exception { Writer writer = new OutputStreamWriter(out); XMLWriter xmlWriter = new XMLWriter(writer); xmlWriter.startDocument(); writeTileset(set, xmlWriter, "/."); xmlWriter.endDocument(); writer.flush(); } private static void writeMap(Map map, XMLWriter w, String wp) throws IOException { w.startElement("map"); w.writeAttribute("version", "0.99b"); switch (map.getOrientation()) { case Map.MDO_ORTHO: w.writeAttribute("orientation", "orthogonal"); break; case Map.MDO_ISO: w.writeAttribute("orientation", "isometric"); break; case Map.MDO_OBLIQUE: w.writeAttribute("orientation", "oblique"); break; case Map.MDO_HEX: w.writeAttribute("orientation", "hexagonal"); break; case Map.MDO_SHIFTED: w.writeAttribute("orientation", "shifted"); break; } w.writeAttribute("width", map.getWidth()); w.writeAttribute("height", map.getHeight()); w.writeAttribute("tilewidth", map.getTileWidth()); w.writeAttribute("tileheight", map.getTileHeight()); writeProperties(map.getProperties(), w); int firstgid = 1; Iterator itr = map.getTilesets().iterator(); while (itr.hasNext()) { TileSet tileset = (TileSet)itr.next(); tileset.setFirstGid(firstgid); writeTilesetReference(tileset, w, wp); firstgid += tileset.getMaxTileId(); } Iterator ml = map.getLayers(); while (ml.hasNext()) { MapLayer layer = (MapLayer)ml.next(); writeMapLayer(layer, w); } w.endElement(); } private static void writeProperties(Properties props, XMLWriter w) throws IOException { if (!props.isEmpty()) { w.startElement("properties"); for (Enumeration keys = props.keys(); keys.hasMoreElements();) { String key = (String)keys.nextElement(); w.startElement("property"); w.writeAttribute("name", key); w.writeAttribute("value", props.getProperty(key)); w.endElement(); } w.endElement(); } } /** * Writes a reference to an external tileset into a XML document. In the * degenerate case where the tileset is not stored in an external file, * writes the contents of the tileset instead. */ private static void writeTilesetReference(TileSet set, XMLWriter w, String wp) throws IOException { String source = set.getSource(); if (source == null) { writeTileset(set, w, wp); } else { w.startElement("tileset"); try { w.writeAttribute("firstgid", set.getFirstGid()); w.writeAttribute("source", source.substring( source.lastIndexOf(File.separatorChar) + 1)); if (set.getBaseDir() != null) { w.writeAttribute("basedir", set.getBaseDir()); } } finally { w.endElement(); } } } private static void writeTileset(TileSet set, XMLWriter w, String wp) throws IOException { String tilebmpFile = set.getTilebmpFile(); String name = set.getName(); w.startElement("tileset"); if (name != null) { w.writeAttribute("name", name); } w.writeAttribute("firstgid", set.getFirstGid()); if (tilebmpFile != null) { w.writeAttribute("tilewidth", set.getTileWidth()); w.writeAttribute("tileheight", set.getTileHeight()); int tileSpacing = set.getTileSpacing(); if (tileSpacing != 0) { w.writeAttribute("spacing", tileSpacing); } } if (set.getBaseDir() != null) { w.writeAttribute("basedir", set.getBaseDir()); } if (tilebmpFile != null) { w.startElement("image"); w.writeAttribute("source", getRelativePath(wp, tilebmpFile)); Color trans = set.getTransparentColor(); if (trans != null) { w.writeAttribute("trans", Integer.toHexString( trans.getRGB()).substring(2)); } w.endElement(); // Write tile properties when necessary. Iterator tileIterator = set.iterator(); while (tileIterator.hasNext()) { Tile tile = (Tile) tileIterator.next(); // todo: move the null check back into the iterator? if (tile != null && !tile.getProperties().isEmpty()) { w.startElement("tile"); w.writeAttribute("id", tile.getId()); writeProperties(tile.getProperties(), w); w.endElement(); } } } else { // Embedded tileset Preferences prefs = TiledConfiguration.node("saving"); boolean embedImages = prefs.getBoolean("embedImages", true); boolean tileSetImages = prefs.getBoolean("tileSetImages", false); if (tileSetImages) { Enumeration ids = set.getImageIds(); while (ids.hasMoreElements()) { String id = (String)ids.nextElement(); w.startElement("image"); w.writeAttribute("format", "png"); w.writeAttribute("id", id); w.startElement("data"); w.writeAttribute("encoding", "base64"); w.writeCDATA(new String(Base64.encode( ImageHelper.imageToPNG( set.getImageById(Integer.parseInt(id)))))); w.endElement(); w.endElement(); } } else if (!embedImages) { String imgSource = prefs.get("tileImagePrefix", "tile") + "set.png"; w.startElement("image"); w.writeAttribute("source", imgSource); String tilesetFilename = wp.substring(0, wp.lastIndexOf(File.separatorChar) + 1) + imgSource; FileOutputStream fw = new FileOutputStream(new File( tilesetFilename)); //byte[] data = ImageHelper.imageToPNG(setImage); //fw.write(data, 0, data.length); w.endElement(); fw.close(); } // Check to see if there is a need to write tile elements Iterator tileIterator = set.iterator(); boolean needWrite = !set.isOneForOne(); if (embedImages) { needWrite = true; } else { // As long as one has properties, they all need to be written. // TODO: This shouldn't be necessary while (tileIterator.hasNext()) { Tile tile = (Tile)tileIterator.next(); if (!tile.getProperties().isEmpty()) { needWrite = true; break; } } } if (needWrite) { tileIterator = set.iterator(); while (tileIterator.hasNext()) { Tile tile = (Tile)tileIterator.next(); // todo: move this check back into the iterator? if (tile != null) { writeTile(tile, w); } } } } w.endElement();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -