让cocos2dx 支持Staggered格式的tmx

来源:互联网 发布:古代画家排名知乎 编辑:程序博客网 时间:2024/04/28 19:38

     
   

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 CCPointpos){    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 CCPointpos){    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_POINTSret );    return ret;}
实现的函数如下:

CCPoint CCTMXLayer::positionForStagAt(const CCPointpos){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了。

0 0
原创粉丝点击