I think i've found a bug related with TMX maps and transparent tiles.
The map i'm using contains these layers:
- lower: full of ground-type tiles (water, grass...). It has no transparent tiles
- upper: where the trees, buildings and that kind of things are placed.There are a lot of transparent/unused tiles.
This is the map file with the tileset:
When i try to load it from AndEngine, it simply crashes and LogCat displays the following error:
Using xml Syntax Highlighting
- E/AndroidRuntime(2092): FATAL EXCEPTION: UpdateThread
- E/AndroidRuntime(2092): java.lang.NullPointerException
- E/AndroidRuntime(2092): at org.andengine.extension.tmx.TMXLayer.addTileByGlobalTileID(TMXLayer.java:265)
- E/AndroidRuntime(2092): at org.andengine.extension.tmx.TMXLayer.initializeTMXTilesFromDataString(TMXLayer.java:238)
- E/AndroidRuntime(2092): at org.andengine.extension.tmx.TMXParser.endElement(TMXParser.java:197)
- E/AndroidRuntime(2092): at org.apache.harmony.xml.ExpatParser.endElement(ExpatParser.java:158)
- E/AndroidRuntime(2092): at org.apache.harmony.xml.ExpatParser.appendBytes(Native Method)
- E/AndroidRuntime(2092): at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:518)
- E/AndroidRuntime(2092): at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:479)
- E/AndroidRuntime(2092): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:318)
- E/AndroidRuntime(2092): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:275)
- E/AndroidRuntime(2092): at org.andengine.extension.tmx.TMXLoader.load(TMXLoader.java:117)
- E/AndroidRuntime(2092): at org.andengine.extension.tmx.TMXLoader.loadFromAsset(TMXLoader.java:102)
Parsed in 0.000 seconds, using GeSHi 1.0.8.4
If i delete the "upper" layer (the one without transparent tiles) from the tmx file, it loads correctly.
Taking a look to AndEngine's TMXLayer class...
org.andengine.extension.tmx.TMXLayer.addTileByGlobalTileID(TMXLayer.java:265):
Using java Syntax Highlighting
- if(this.mTexture == null) {
- this.mTexture = tmxTileTextureRegion.getTexture();
- super.initBlendFunction(this.mTexture);
- } else {
- if(this.mTexture != tmxTileTextureRegion.getTexture()) {
- throw new AndEngineRuntimeException("All TMXTiles in a TMXLayer need to be in the same TMXTileSet.");
- }
- }
Parsed in 0.030 seconds, using GeSHi 1.0.8.4
A few lines above that, i found this:
Using java Syntax Highlighting
- final ITextureRegion tmxTileTextureRegion;
- if(pGlobalTileID == 0) {
- tmxTileTextureRegion = null;
- } else {
- tmxTileTextureRegion = tmxTiledMap.getTextureRegionFromGlobalTileID(pGlobalTileID);
- }
Parsed in 0.030 seconds, using GeSHi 1.0.8.4
When a transparent tile is found (pGlobalTileID), tmxTileTextureRegion is set to null. Then why the code tries to do this.mTexture = tmxTileTextureRegion.getTexture() for transparent tiles? That is what is causing a NullPointerException.
Is that normal and should i keep a transparent tile in my tileset in order to avoid 0 globalTileIDs, or is it a bug?
IMHO, 0 globalTileIDs should be ignored, at least the process related with texture loading.
Note: I don't have much experience with AndEngine, sorry if i misunderstood something.
