tiled支持创建Staggered格式的地图而cocos2dx本身是不支持此种格式的显示的,所以我们就改动cocos2dx小小的代码来实现支持。代码很简单,而且未动着主体框架的代码,只是tilemap_parallax_nodes目录下的简单修改。
首先在CCTMXTiledMap.h文件中定义枚举类型:
/** Possible orientations of the TMX map */ enum { /** Orthogonal orientation */ CCTMXOrientationOrtho, /** Hexagonal orientation */ CCTMXOrientationHex, /** Isometric orientation */ CCTMXOrientationIso, /** Hexagonal orientation */ CCTMXOrientationStaggered, //此处我加入了Staggered格式来支持,因为以后的解析需要用到 };
然后使用CCTMXOrientationIso作为关键字搜索需要用到枚举的地方,我们可以看到有如下一些:
很多地方的都是case,那么仿造一个就行了,
如:
int CCTMXLayer::vertexZForPos(const CCPoint& pos) { int ret = 0; unsigned int maxVal = 0; if (m_bUseAutomaticVertexZ) { switch (m_uLayerOrientation) { case CCTMXOrientationStaggered: case CCTMXOrientationIso: maxVal = (unsigned int)(m_tLayerSize.width + m_tLayerSize.height); ret = (int)(-(maxVal - (pos.x + pos.y))); break; case CCTMXOrientationOrtho: ret = (int)(-(m_tLayerSize.height-pos.y)); break; case CCTMXOrientationHex: CCAssert(0, "TMX Hexa zOrder not supported"); break; default: CCAssert(0, "TMX invalid value"); break; } } else { ret = m_nVertexZvalue; } return ret; }
最关键的是CCTMXLayer.cpp文件中
positionAt
函数,此函数负责绘制Staggered格式的地图
CCPoint CCTMXLayer::positionAt(const CCPoint& pos) { CCPoint ret = CCPointZero; switch (m_uLayerOrientation) { case CCTMXOrientationStaggered: ret = positionForStagAt(pos); break; case CCTMXOrientationOrtho: ret = positionForOrthoAt(pos); break; case CCTMXOrientationIso: ret = positionForIsoAt(pos); break; case CCTMXOrientationHex: ret = positionForHexAt(pos); break; } ret = CC_POINT_PIXELS_TO_POINTS( ret ); return ret; }
实现的函数如下:
CCPoint CCTMXLayer::positionForStagAt(const CCPoint& pos) { CCPoint xy = CCPointMake( (( pos.x * m_tMapTileSize.width ) + m_tMapTileSize.width / 2) + ( (int)pos.y & 1) * m_tMapTileSize.width / 2, (pos.y + 1) * m_tMapTileSize.height / 2); return xy; }
最终效果如下:
由此我们就可以使用CCTMXTiledMap 来处理45度Staggered格式的tmx了。