diff --git a/src/org/andengine/extension/tmx/TMXLayer.java b/src/org/andengine/extension/tmx/TMXLayer.java index d149b92..28206d7 100644 --- a/src/org/andengine/extension/tmx/TMXLayer.java +++ b/src/org/andengine/extension/tmx/TMXLayer.java @@ -253,6 +253,7 @@ private void addTileByGlobalTileID(final int pGlobalTileID, final ITMXTileProper final ITextureRegion tmxTileTextureRegion; if(pGlobalTileID == 0) { + // it's a transparent tile tmxTileTextureRegion = null; } else { tmxTileTextureRegion = tmxTiledMap.getTextureRegionFromGlobalTileID(pGlobalTileID); @@ -260,22 +261,26 @@ private void addTileByGlobalTileID(final int pGlobalTileID, final ITMXTileProper final int tileHeight = this.mTMXTiledMap.getTileHeight(); final int tileWidth = this.mTMXTiledMap.getTileWidth(); - if(this.mTexture == null) { - this.mTexture = tmxTileTextureRegion.getTexture(); - super.initBlendFunction(this.mTexture); - } else { - if(this.mTexture != tmxTileTextureRegion.getTexture()) { - throw new AndEngineException("All TMXTiles in a TMXLayer need to be in the same TMXTileSet."); + if (tmxTileTextureRegion != null) { + // Unless this is a transparent tile, setup the texture + if (this.mTexture == null) { + this.mTexture = tmxTileTextureRegion.getTexture(); + super.initBlendFunction(this.mTexture); + } else { + if (this.mTexture != tmxTileTextureRegion.getTexture()) { + throw new AndEngineException("All TMXTiles in a TMXLayer (" + + mName + ") need to be in the same TMXTileSet."); + } } } final TMXTile tmxTile = new TMXTile(pGlobalTileID, column, row, tileWidth, tileHeight, tmxTileTextureRegion); tmxTiles[row][column] = tmxTile; - this.setIndex(this.getSpriteBatchIndex(column, row)); - this.drawWithoutChecks(tmxTileTextureRegion, tmxTile.getTileX(), tmxTile.getTileY(), tileWidth, tileHeight, Color.WHITE_PACKED); - this.submit(); // TODO Doesn't need to be called here, but should rather be called in a "init" step, when parsing the XML is complete. + if (pGlobalTileID != 0) { + this.setIndex(this.getSpriteBatchIndex(column, row)); + this.drawWithoutChecks(tmxTileTextureRegion, tmxTile.getTileX(), tmxTile.getTileY(), tileWidth, tileHeight, Color.WHITE_PACKED); + this.submit(); // TODO Doesn't need to be called here, but should rather be called in a "init" step, when parsing the XML is complete. - if(pGlobalTileID != 0) { /* Notify the ITMXTilePropertiesListener if it exists. */ if(pTMXTilePropertyListener != null) { final TMXProperties tmxTileProperties = tmxTiledMap.getTMXTileProperties(pGlobalTileID); diff --git a/src/org/andengine/extension/tmx/TMXParser.java b/src/org/andengine/extension/tmx/TMXParser.java index 705a72e..6753757 100644 --- a/src/org/andengine/extension/tmx/TMXParser.java +++ b/src/org/andengine/extension/tmx/TMXParser.java @@ -191,7 +191,12 @@ public void endElement(final String pUri, final String pLocalName, final String if(binarySaved) { final ArrayList tmxLayers = this.mTMXTiledMap.getTMXLayers(); try { - tmxLayers.get(tmxLayers.size() - 1).initializeTMXTilesFromDataString(this.mStringBuilder.toString().trim(), this.mDataEncoding, this.mDataCompression, this.mTMXTilePropertyListener); + TMXLayer layer = tmxLayers.get(tmxLayers.size() - 1); + layer.initializeTMXTilesFromDataString(this.mStringBuilder.toString().trim(), this.mDataEncoding, this.mDataCompression, this.mTMXTilePropertyListener); + if (layer.getTexture() == null) { + Debug.e("TMXLayer (" + layer.getName() + ") does not contain any tiles. Removing empty layer from TMXTiledMap."); + tmxLayers.remove(layer); + } } catch (final IOException e) { Debug.e(e); }