tiled支持创建Staggered格式的地图而cocos2dx本身是不支持此种格式的显示的,所以我们就改动cocos2dx小小的代码来实现支持。代码很简单,而且未动着主体框架的代码,只是tilemap_parallax_nodes目录下的简单修改。
首先在CCTMXTiledMap.h文件中定义枚举类型:
/**PossibleorientationsoftheTMXmap*/ enum { /**Orthogonalorientation*/ CCTMXOrientationOrtho,/**Hexagonalorientation*/ CCTMXOrientationHex,/**Isometricorientation*/ CCTMXOrientationIso,/**Hexagonalorientation*/ CCTMXOrientationStaggered,//此处我加入了Staggered格式来支持,因为以后的解析需要用到 };
然后使用CCTMXOrientationIso作为关键字搜索需要用到枚举的地方,我们可以看到有如下一些:
很多地方的都是case,那么仿造一个就行了,
如:
intCCTMXLayer::vertexZForPos(constCCPoint&pos) { intret=0; unsignedintmaxVal=0; if(m_bUseAutomaticVertexZ) { switch(m_uLayerOrientation) { caseCCTMXOrientationStaggered: caseCCTMXOrientationIso: maxVal=(unsignedint)(m_tLayerSize.width+m_tLayerSize.height); ret=(int)(-(maxVal-(pos.x+pos.y))); break; caseCCTMXOrientationOrtho: ret=(int)(-(m_tLayerSize.height-pos.y)); break; caseCCTMXOrientationHex: CCAssert(0,"TMXHexazOrdernotsupported"); break; default: "TMXinvalidvalue"); break; } } else { ret=m_nVertexZvalue; } returnret; }
最关键的是CCTMXLayer.cpp文件中
positionAt
函数,此函数负责绘制Staggered格式的地图
CCPointpositionAt(constCCPoint&pos) { CCPointret=CCPointZero; switch(m_uLayerOrientation) { caseCCTMXOrientationStaggered: ret=positionForStagAt(pos); break; caseCCTMXOrientationOrtho: ret=positionForOrthoAt(pos); break; caseCCTMXOrientationIso: ret=positionForIsoAt(pos); break; caseCCTMXOrientationHex: ret=positionForHexAt(pos); break; } ret=CC_POINT_PIXELS_TO_POINTS(ret); returnret; }
实现的函数如下:
positionForStagAt(constCCPoint&pos) { CCPointxy=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); returnxy; }
最终效果如下:
由此我们就可以使用CCTMXTiledMap来处理45度Staggered格式的tmx了