Guest User

Untitled

a guest
Apr 29th, 2016
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package com.bla.game.TiledMaps;
  2.  
  3. import com.badlogic.gdx.Gdx;
  4. import com.badlogic.gdx.assets.loaders.FileHandleResolver;
  5. import com.badlogic.gdx.files.FileHandle;
  6. import com.badlogic.gdx.graphics.Texture;
  7. import com.badlogic.gdx.graphics.g2d.TextureRegion;
  8. import com.badlogic.gdx.maps.ImageResolver;
  9. import com.badlogic.gdx.maps.MapProperties;
  10. import com.badlogic.gdx.maps.tiled.TiledMap;
  11. import com.badlogic.gdx.maps.tiled.TiledMapTile;
  12. import com.badlogic.gdx.maps.tiled.TiledMapTileSet;
  13. import com.badlogic.gdx.maps.tiled.TmxMapLoader;
  14. import com.badlogic.gdx.maps.tiled.tiles.AnimatedTiledMapTile;
  15. import com.badlogic.gdx.maps.tiled.tiles.StaticTiledMapTile;
  16. import com.badlogic.gdx.utils.*;
  17.  
  18. import java.io.IOException;
  19. import java.util.StringTokenizer;
  20.  
  21. /**
  22.  * Created by nooooobz on 29/04/2016.
  23.  */
  24. public class TmxMapLoaderFromString extends TmxMapLoader
  25. {
  26.     public TiledMap load (String xmldata)
  27.     {
  28.         return load(xmldata, new TmxMapLoader.Parameters());
  29.     }
  30.  
  31.     public TiledMap load (String xmldata, TmxMapLoader.Parameters parameters) {
  32.         try {
  33.             this.convertObjectToTileSpace = parameters.convertObjectToTileSpace;
  34.             this.flipY = parameters.flipY;
  35.             root = xml.parse(xmldata);
  36.             ObjectMap<String, Texture> textures = new ObjectMap<String, Texture>();
  37.             Array<FileHandle> textureFiles = loadTilesets(root);
  38.             textureFiles.addAll(loadImages(root));
  39.  
  40.             for (FileHandle textureFile : textureFiles) {
  41.                 Texture texture = new Texture(textureFile, parameters.generateMipMaps);
  42.                 texture.setFilter(parameters.textureMinFilter, parameters.textureMagFilter);
  43.                 textures.put(textureFile.path(), texture);
  44.             }
  45.  
  46.             ImageResolver.DirectImageResolver imageResolver = new ImageResolver.DirectImageResolver(textures);
  47.             TiledMap map = loadTilemap(root, null, imageResolver);
  48.             map.setOwnedResources(textures.values().toArray());
  49.             return map;
  50.         } catch (IOException e) {
  51.             throw new GdxRuntimeException("Couldn't load tilemap", e);
  52.         }
  53.     }
  54.  
  55.     protected Array<FileHandle> loadImages (XmlReader.Element root) throws IOException {
  56.         Array<FileHandle> images = new Array<FileHandle>();
  57.  
  58.         for (XmlReader.Element imageLayer : root.getChildrenByName("imagelayer")) {
  59.             XmlReader.Element image = imageLayer.getChildByName("image");
  60.             String source = image.getAttribute("source", null);
  61.  
  62.             if (source != null) {
  63.                 Gdx.app.log("loadImages","source!=null !!");
  64.                 FileHandle handle = getRelativeFileHandle(null, source);
  65.  
  66.                 if (!images.contains(handle, false)) {
  67.                     images.add(handle);
  68.                 }
  69.             }
  70.         }
  71.  
  72.         return images;
  73.     }
  74.  
  75.  
  76.     protected Array<FileHandle> loadTilesets (XmlReader.Element root) throws IOException {
  77.         Array<FileHandle> images = new Array<FileHandle>();
  78.         for (XmlReader.Element tileset : root.getChildrenByName("tileset")) {
  79.             String source = tileset.getAttribute("source", null);
  80.             if (source != null) {
  81.  
  82.                 Gdx.app.log("loadTilesets","source!=null !!");
  83.  
  84.                 FileHandle tsxFile = getRelativeFileHandle(null, source);
  85.                 tileset = xml.parse(tsxFile);
  86.                 XmlReader.Element imageElement = tileset.getChildByName("image");
  87.                 if (imageElement != null) {
  88.                     String imageSource = tileset.getChildByName("image").getAttribute("source");
  89.                     FileHandle image = getRelativeFileHandle(tsxFile, imageSource);
  90.                     images.add(image);
  91.                 } else {
  92.                     for (XmlReader.Element tile : tileset.getChildrenByName("tile")) {
  93.                         String imageSource = tile.getChildByName("image").getAttribute("source");
  94.                         FileHandle image = getRelativeFileHandle(tsxFile, imageSource);
  95.                         images.add(image);
  96.                     }
  97.                 }
  98.             } else {
  99.                 XmlReader.Element imageElement = tileset.getChildByName("image");
  100.                 if (imageElement != null) {
  101.                     String imageSource = tileset.getChildByName("image").getAttribute("source");
  102.                     FileHandle image = Gdx.files.internal(imageSource);;//getRelativeFileHandle(tmxFile, imageSource);
  103.                     images.add(image);
  104.                 } else {
  105.                     Gdx.app.log("loadTilesets","imageElement==null !!");
  106.                     for (XmlReader.Element tile : tileset.getChildrenByName("tile")) {
  107.                         String imageSource = tile.getChildByName("image").getAttribute("source");
  108.                         FileHandle image = getRelativeFileHandle(null, imageSource);
  109.                         images.add(image);
  110.                     }
  111.                 }
  112.             }
  113.         }
  114.         return images;
  115.     }
  116.  
  117.     protected TiledMap loadTilemap (XmlReader.Element root, FileHandle tmxFile, ImageResolver imageResolver) {
  118.         TiledMap map = new TiledMap();
  119.  
  120.         String mapOrientation = root.getAttribute("orientation", null);
  121.         int mapWidth = root.getIntAttribute("width", 0);
  122.         int mapHeight = root.getIntAttribute("height", 0);
  123.         int tileWidth = root.getIntAttribute("tilewidth", 0);
  124.         int tileHeight = root.getIntAttribute("tileheight", 0);
  125.         int hexSideLength = root.getIntAttribute("hexsidelength", 0);
  126.         String staggerAxis = root.getAttribute("staggeraxis", null);
  127.         String staggerIndex = root.getAttribute("staggerindex", null);
  128.         String mapBackgroundColor = root.getAttribute("backgroundcolor", null);
  129.  
  130.         MapProperties mapProperties = map.getProperties();
  131.         if (mapOrientation != null) {
  132.             mapProperties.put("orientation", mapOrientation);
  133.         }
  134.         mapProperties.put("width", mapWidth);
  135.         mapProperties.put("height", mapHeight);
  136.         mapProperties.put("tilewidth", tileWidth);
  137.         mapProperties.put("tileheight", tileHeight);
  138.         mapProperties.put("hexsidelength", hexSideLength);
  139.         if (staggerAxis != null) {
  140.             mapProperties.put("staggeraxis", staggerAxis);
  141.         }
  142.         if (staggerIndex != null) {
  143.             mapProperties.put("staggerindex", staggerIndex);
  144.         }
  145.         if (mapBackgroundColor != null) {
  146.             mapProperties.put("backgroundcolor", mapBackgroundColor);
  147.         }
  148.         mapTileWidth = tileWidth;
  149.         mapTileHeight = tileHeight;
  150.         mapWidthInPixels = mapWidth * tileWidth;
  151.         mapHeightInPixels = mapHeight * tileHeight;
  152.  
  153.         if (mapOrientation != null) {
  154.             if ("staggered".equals(mapOrientation)) {
  155.                 if (mapHeight > 1) {
  156.                     mapWidthInPixels += tileWidth / 2;
  157.                     mapHeightInPixels = mapHeightInPixels / 2 + tileHeight / 2;
  158.                 }
  159.             }
  160.         }
  161.  
  162.         XmlReader.Element properties = root.getChildByName("properties");
  163.         if (properties != null) {
  164.             loadProperties(map.getProperties(), properties);
  165.         }
  166.         Array<XmlReader.Element> tilesets = root.getChildrenByName("tileset");
  167.         for (XmlReader.Element element : tilesets) {
  168.             loadTileSet(map, element, tmxFile, imageResolver);
  169.             root.removeChild(element);
  170.         }
  171.         for (int i = 0, j = root.getChildCount(); i < j; i++) {
  172.             XmlReader.Element element = root.getChild(i);
  173.             String name = element.getName();
  174.             if (name.equals("layer")) {
  175.                 loadTileLayer(map, element);
  176.             } else if (name.equals("objectgroup")) {
  177.                 loadObjectGroup(map, element);
  178.             }
  179.             else if (name.equals("imagelayer")) {
  180.                 loadImageLayer(map, element, tmxFile, imageResolver);
  181.             }
  182.         }
  183.         return map;
  184.     }
  185.  
  186.     protected void loadTileSet (TiledMap map, XmlReader.Element element, FileHandle tmxFile, ImageResolver imageResolver) {
  187.         if (element.getName().equals("tileset")) {
  188.             String name = element.get("name", null);
  189.             int firstgid = element.getIntAttribute("firstgid", 1);
  190.             int tilewidth = element.getIntAttribute("tilewidth", 0);
  191.             int tileheight = element.getIntAttribute("tileheight", 0);
  192.             int spacing = element.getIntAttribute("spacing", 0);
  193.             int margin = element.getIntAttribute("margin", 0);
  194.             String source = element.getAttribute("source", null);
  195.  
  196.             int offsetX = 0;
  197.             int offsetY = 0;
  198.  
  199.             String imageSource = "";
  200.             int imageWidth = 0, imageHeight = 0;
  201.  
  202.             FileHandle image = null;
  203.             if (source != null) {
  204.                 FileHandle tsx = getRelativeFileHandle(tmxFile, source);
  205.                 try {
  206.                     element = xml.parse(tsx);
  207.                     name = element.get("name", null);
  208.                     tilewidth = element.getIntAttribute("tilewidth", 0);
  209.                     tileheight = element.getIntAttribute("tileheight", 0);
  210.                     spacing = element.getIntAttribute("spacing", 0);
  211.                     margin = element.getIntAttribute("margin", 0);
  212.                     XmlReader.Element offset = element.getChildByName("tileoffset");
  213.                     if (offset != null) {
  214.                         offsetX = offset.getIntAttribute("x", 0);
  215.                         offsetY = offset.getIntAttribute("y", 0);
  216.                     }
  217.                     XmlReader.Element imageElement = element.getChildByName("image");
  218.                     if (imageElement != null) {
  219.                         imageSource = imageElement.getAttribute("source");
  220.                         imageWidth = imageElement.getIntAttribute("width", 0);
  221.                         imageHeight = imageElement.getIntAttribute("height", 0);
  222.                         image = getRelativeFileHandle(tsx, imageSource);
  223.                     }
  224.                 } catch (IOException e) {
  225.                     throw new GdxRuntimeException("Error parsing external tileset.");
  226.                 }
  227.             } else {
  228.                 XmlReader.Element offset = element.getChildByName("tileoffset");
  229.                 if (offset != null) {
  230.                     offsetX = offset.getIntAttribute("x", 0);
  231.                     offsetY = offset.getIntAttribute("y", 0);
  232.                 }
  233.                 XmlReader.Element imageElement = element.getChildByName("image");
  234.                 if (imageElement != null) {
  235.                     imageSource = imageElement.getAttribute("source");
  236.                     imageWidth = imageElement.getIntAttribute("width", 0);
  237.                     imageHeight = imageElement.getIntAttribute("height", 0);
  238.                     image = getRelativeFileHandle(tmxFile, imageSource);
  239.                 }
  240.             }
  241.  
  242.             TiledMapTileSet tileset = new TiledMapTileSet();
  243.             tileset.setName(name);
  244.             tileset.getProperties().put("firstgid", firstgid);
  245.             if (image != null) {
  246.                 TextureRegion texture = imageResolver.getImage(image.path());
  247.  
  248.                 MapProperties props = tileset.getProperties();
  249.                 props.put("imagesource", imageSource);
  250.                 props.put("imagewidth", imageWidth);
  251.                 props.put("imageheight", imageHeight);
  252.                 props.put("tilewidth", tilewidth);
  253.                 props.put("tileheight", tileheight);
  254.                 props.put("margin", margin);
  255.                 props.put("spacing", spacing);
  256.  
  257.                 int stopWidth = texture.getRegionWidth() - tilewidth;
  258.                 int stopHeight = texture.getRegionHeight() - tileheight;
  259.  
  260.                 int id = firstgid;
  261.  
  262.                 for (int y = margin; y <= stopHeight; y += tileheight + spacing) {
  263.                     for (int x = margin; x <= stopWidth; x += tilewidth + spacing) {
  264.                         TextureRegion tileRegion = new TextureRegion(texture, x, y, tilewidth, tileheight);
  265.                         TiledMapTile tile = new StaticTiledMapTile(tileRegion);
  266.                         tile.setId(id);
  267.                         tile.setOffsetX(offsetX);
  268.                         tile.setOffsetY(flipY ? -offsetY : offsetY);
  269.                         tileset.putTile(id++, tile);
  270.                     }
  271.                 }
  272.             } else {
  273.                 Array<XmlReader.Element> tileElements = element.getChildrenByName("tile");
  274.                 for (XmlReader.Element tileElement : tileElements) {
  275.                     XmlReader.Element imageElement = tileElement.getChildByName("image");
  276.                     if (imageElement != null) {
  277.                         imageSource = imageElement.getAttribute("source");
  278.                         imageWidth = imageElement.getIntAttribute("width", 0);
  279.                         imageHeight = imageElement.getIntAttribute("height", 0);
  280.                         image = getRelativeFileHandle(tmxFile, imageSource);
  281.                     }
  282.                     TextureRegion texture = imageResolver.getImage(image.path());
  283.                     TiledMapTile tile = new StaticTiledMapTile(texture);
  284.                     tile.setId(firstgid + tileElement.getIntAttribute("id"));
  285.                     tile.setOffsetX(offsetX);
  286.                     tile.setOffsetY(flipY ? -offsetY : offsetY);
  287.                     tileset.putTile(tile.getId(), tile);
  288.                 }
  289.             }
  290.             Array<XmlReader.Element> tileElements = element.getChildrenByName("tile");
  291.  
  292.             Array<AnimatedTiledMapTile> animatedTiles = new Array<AnimatedTiledMapTile>();
  293.  
  294.             for (XmlReader.Element tileElement : tileElements) {
  295.                 int localtid = tileElement.getIntAttribute("id", 0);
  296.                 TiledMapTile tile = tileset.getTile(firstgid + localtid);
  297.                 if (tile != null) {
  298.                     XmlReader.Element animationElement = tileElement.getChildByName("animation");
  299.                     if (animationElement != null) {
  300.  
  301.                         Array<StaticTiledMapTile> staticTiles = new Array<StaticTiledMapTile>();
  302.                         IntArray intervals = new IntArray();
  303.                         for (XmlReader.Element frameElement: animationElement.getChildrenByName("frame")) {
  304.                             staticTiles.add((StaticTiledMapTile) tileset.getTile(firstgid + frameElement.getIntAttribute("tileid")));
  305.                             intervals.add(frameElement.getIntAttribute("duration"));
  306.                         }
  307.  
  308.                         AnimatedTiledMapTile animatedTile = new AnimatedTiledMapTile(intervals, staticTiles);
  309.                         animatedTile.setId(tile.getId());
  310.                         animatedTiles.add(animatedTile);
  311.                         tile = animatedTile;
  312.                     }
  313.  
  314.                     String terrain = tileElement.getAttribute("terrain", null);
  315.                     if (terrain != null) {
  316.                         tile.getProperties().put("terrain", terrain);
  317.                     }
  318.                     String probability = tileElement.getAttribute("probability", null);
  319.                     if (probability != null) {
  320.                         tile.getProperties().put("probability", probability);
  321.                     }
  322.                     XmlReader.Element properties = tileElement.getChildByName("properties");
  323.                     if (properties != null) {
  324.                         loadProperties(tile.getProperties(), properties);
  325.                     }
  326.                 }
  327.             }
  328.  
  329.             for (AnimatedTiledMapTile tile : animatedTiles) {
  330.                 tileset.putTile(tile.getId(), tile);
  331.             }
  332.  
  333.             XmlReader.Element properties = element.getChildByName("properties");
  334.             if (properties != null) {
  335.                 loadProperties(tileset.getProperties(), properties);
  336.             }
  337.             map.getTileSets().addTileSet(tileset);
  338.         }
  339.     }
  340.  
  341.     protected static FileHandle getRelativeFileHandle (FileHandle file, String path)
  342.     {
  343.         FileHandle result = Gdx.files.internal(path);
  344.         return result;
  345.     }
  346. }
Add Comment
Please, Sign In to add comment