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


很多地方的都是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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值