让cocos2dx 支持Staggered格式的tmx


     
   

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作为关键字搜索需要用到枚举的地方,我们可以看到有如下一些:

让cocos2dx 支持Staggered格式的tmx_第1张图片

很多地方的都是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;
}


最终效果如下:

让cocos2dx 支持Staggered格式的tmx_第2张图片


由此我们就可以使用CCTMXTiledMap 来处理45度Staggered格式的tmx了。

你可能感兴趣的:(让cocos2dx 支持Staggered格式的tmx)