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