[tiled] r656 - in trunk/src/tiled: io/xml mapeditor

svn@biggeruniverse.com svn at biggeruniverse.com
Sat Jun 3 08:53:57 PDT 2006


Author: aturk
Date: 2006-06-03 10:53:56 -0500 (Sat, 03 Jun 2006)
New Revision: 656

Modified:
   trunk/src/tiled/io/xml/XMLMapTransformer.java
   trunk/src/tiled/mapeditor/MapEditor.java
Log:
+ Fixed some problems with loading tilesets that have tileset images and per-tile 
  properties
+ Fixed an infinite loop case when looking for the first non-null tile if the 
  tileset is empty or has no non-null tiles

Modified: trunk/src/tiled/io/xml/XMLMapTransformer.java
===================================================================
--- trunk/src/tiled/io/xml/XMLMapTransformer.java	2006-06-02 15:45:17 UTC (rev 655)
+++ trunk/src/tiled/io/xml/XMLMapTransformer.java	2006-06-03 15:53:56 UTC (rev 656)
@@ -138,6 +138,20 @@
         }
     }
 
+    private static Node findChild(Node node, String childName) {
+        NodeList children = node.getChildNodes();
+
+        // Do an initial pass to see what's in here
+        for (int i = 0; i < children.getLength(); i++) {
+            Node child = children.item(i);
+            if (child.getNodeName().equalsIgnoreCase(childName)) {
+                return child;
+            }
+        }
+        
+        return null;
+    }
+    
     private Object unmarshalClass(Class reflector, Node node)
         throws InstantiationException, IllegalAccessException,
                InvocationTargetException {
@@ -319,86 +333,78 @@
             set.setBaseDir(basedir);
             set.setFirstGid(firstGid);
 
+            boolean hasTilesetImage = false;
             NodeList children = t.getChildNodes();
+            
+            //if we have a tileset image, load it (tileset can have only one image element)
+            Node child = findChild(t, "image");
+            if(child != null) {
+                String imgSource = getAttributeValue(child, "source");
+                String id = getAttributeValue(child, "id");
+                String transStr = getAttributeValue(child, "trans");
 
-            for (int i = 0; i < children.getLength(); i++) {
-                Node child = children.item(i);
+                hasTilesetImage = true;
+                
+                if (imgSource != null && id == null) {
+                    // Not a shared image, but an entire set in one image
+                    // file
 
-                if ("tile".equalsIgnoreCase(child.getNodeName())) {
-                    String id = getAttributeValue(child, "id");
-                    Tile tile = set.getTile(Integer.parseInt(id));
-
-                    if (tile == null) {
-                        // Tile not defined yet
-                        set.addTile(unmarshalTile(set, child, tilesetBaseDir));
-                    } else {
-                        // Reference to existing tile, just load properties
-                        Properties tileProps = tile.getProperties();
-                        NodeList children2 = child.getChildNodes();
-
-                        for (int i2 = 0; i2 < children2.getLength(); i2++) {
-                            Node child2 = children2.item(i2);
-                            if ("property".equalsIgnoreCase(child2.getNodeName())) {
-                                tileProps.setProperty(
-                                        getAttributeValue(child2, "name"),
-                                        getAttributeValue(child2, "value"));
-                            }
-                        }
+                    // FIXME: importTileBitmap does not fully support URLs
+                    String sourcePath = imgSource;
+                    if (!Util.checkRoot(imgSource)) {
+                        sourcePath = tilesetBaseDir + imgSource;
                     }
-                }
-                else if ("image".equalsIgnoreCase(child.getNodeName())) {
-                    String imgSource = getAttributeValue(child, "source");
-                    String id = getAttributeValue(child, "id");
-                    String transStr = getAttributeValue(child, "trans");
 
-                    if (imgSource != null && id == null) {
-                        // Not a shared image, but an entire set in one image
-                        // file
+                    logger.info("Importing " + sourcePath + "...");
 
-                        // FIXME: importTileBitmap does not fully support URLs
-                        String sourcePath = imgSource;
-                        if (!Util.checkRoot(imgSource)) {
-                            sourcePath = tilesetBaseDir + imgSource;
-                        }
+                    BufferedImage tilesetImage = ImageIO.read(new File(sourcePath));
 
-                        logger.info("Importing " + sourcePath + "...");
+                    if (transStr != null) {
+                        // In this case, the tileset image needs special
+                        // handling for transparency
+                        Color color = new Color(
+                                Integer.parseInt(transStr, 16));
+                        Toolkit tk = Toolkit.getDefaultToolkit();
+                        Image trans = tk.createImage(
+                                new FilteredImageSource(tilesetImage.getSource(),
+                                    new TransparentImageFilter(
+                                        color.getRGB())));
+                        BufferedImage img = new BufferedImage(
+                                trans.getWidth(null),
+                                trans.getHeight(null),
+                                BufferedImage.TYPE_INT_ARGB);
 
-                        BufferedImage tilesetImage = ImageIO.read(new File(sourcePath));
+                        img.getGraphics().drawImage(trans, 0, 0, null);
 
-                        if (transStr != null) {
-                            // In this case, the tileset image needs special
-                            // handling for transparency
-                            Color color = new Color(
-                                    Integer.parseInt(transStr, 16));
-                            Toolkit tk = Toolkit.getDefaultToolkit();
-                            Image trans = tk.createImage(
-                                    new FilteredImageSource(tilesetImage.getSource(),
-                                        new TransparentImageFilter(
-                                            color.getRGB())));
-                            BufferedImage img = new BufferedImage(
-                                    trans.getWidth(null),
-                                    trans.getHeight(null),
-                                    BufferedImage.TYPE_INT_ARGB);
+                        tilesetImage = img;
 
-                            img.getGraphics().drawImage(trans, 0, 0, null);
+                        set.setTransparentColor(color);
+                    }
 
-                            tilesetImage = img;
+                    set.importTileBitmap(tilesetImage, new BasicTileCutter(
+                            tileWidth, tileHeight, tileSpacing, 0),
+                        true);
 
-                            set.setTransparentColor(color);
-                        }
+                    set.setTilesetImageFilename(sourcePath);
+                } else {
+                    set.addImage(unmarshalImage(child, tilesetBaseDir),
+                            Integer.parseInt(getAttributeValue(child, "id")));
+                }
+            }
+            
+            //spin through and find tile elements
+            for (int i = 0; i < children.getLength(); i++) {
+                Node c = children.item(i);
 
-                        // todo: Store additional information to be able to
-                        // todo: determine whether tiles should be created
-                        // todo: at this time. Now defaults to creation since
-                        // todo: this used to be the only possible behaviour.
-                        set.importTileBitmap(tilesetImage, new BasicTileCutter(
-                                tileWidth, tileHeight, tileSpacing, 0),
-                                             true);
-
-                        set.setTilesetImageFilename(sourcePath);
+                if (c.getNodeName().equalsIgnoreCase("tile")) {
+                    Tile tile = unmarshalTile(set, c, tilesetBaseDir);
+                    if((!hasTilesetImage) || tile.getId() >= set.getMaxTileId()) {
+                        set.addTile(tile);
                     } else {
-                        set.addImage(unmarshalImage(child, tilesetBaseDir),
-                                Integer.parseInt(getAttributeValue(child, "id")));
+                        Tile myTile = set.getTile(tile.getId());
+                        myTile.setProperties(tile.getProperties());
+                        //TODO: there is the possibility here of overlaying images,
+                        //      which some people may want
                     }
                 }
             }

Modified: trunk/src/tiled/mapeditor/MapEditor.java
===================================================================
--- trunk/src/tiled/mapeditor/MapEditor.java	2006-06-02 15:45:17 UTC (rev 655)
+++ trunk/src/tiled/mapeditor/MapEditor.java	2006-06-03 15:53:56 UTC (rev 656)
@@ -1896,7 +1896,7 @@
                 while(it.hasNext() && firstTile == null) {
                     TileSet set = (TileSet)it.next();
                     int i=0;
-                    while(firstTile == null) {
+                    while(firstTile == null && i < set.getMaxTileId()) {
                         firstTile = set.getTile(i++);
                     }
                 }




More information about the tiled-commit mailing list