cocos2dx之CCTMXTiledMap

来源:互联网 发布:股票1272战法源码指标 编辑:程序博客网 时间:2024/05/16 15:30

CCTMXTiledMap:

瓦片上地图集类具有如下几个特性:

1,每个图素都是一个精灵

2,每个图素的精灵类在需要时调用tiltAt函数被创建

3.,每个图素都可以进行旋转缩放等设置

4,在运行时可以添加和删除

5,可以修改Z轴顺序来改变遮挡关系

6,每个图素都可以设置锚点

7.,每个层都可以添加节点

8,每个图素都可以有唯一的标签

9,每个图素都可以有唯一的Z轴值


如下在利用工具创建了一个tmx文件,我们利用CCTMXTiledMap类来解析它,例子代码如下:

void MyMapLayer::initLayer() {    CCSize winSize = CCDirector::sharedDirector()->getWinSize();    CCTMXTiledMap *map = CCTMXTiledMap::create("TileMaps/orthogonal-test4.tmx");    this->addChild(map, 1, 1);    map->setAnchorPoint(ccp(0.5f, 0.5f));    map->setPosition(ccp(winSize.width / 2.0f, winSize.height / 2.0f));    CCArray *arratSprite = map->getChildren(); // get the sprite objects from the map    int iCount = arratSprite->count();    CCSpriteBatchNode *batchChild = NULL;    CCObject *object = NULL;    CCARRAY_FOREACH(arratSprite, object) {        batchChild = (CCSpriteBatchNode *)(object);        if(batchChild == NULL) {            break;        }         batchChild->getTexture()->setAntiAliasTexParameters(); // set the sprite抗锯齿    }    map->setScale(2.0f);    //    arrayAllSprites = CCArray::create(4);    mapLayer = map->layerNamed("Layer 0");    CCSize layerSize = mapLayer->getLayerSize();    CCSprite *sprite = mapLayer->tileAt(ccp(0, 0));//获得相应位置的精灵    arrayAllSprites->addObject(sprite);    mapLayer->removeChild(sprite, true);    sprite = mapLayer->tileAt(ccp(0, layerSize.height - 1));    arrayAllSprites->addObject(sprite);    mapLayer->removeChild(sprite, true);    sprite = mapLayer->tileAt(ccp(layerSize.width - 1, layerSize.height - 1));     arrayAllSprites->addObject(sprite);    mapLayer->removeChild(sprite, true);    sprite = mapLayer->tileAt(ccp(layerSize.width - 1, 0));    arrayAllSprites->addObject(sprite);    mapLayer->removeChild(sprite, true);    removeSprite(1);}


再举个例子,我们让它取得精灵在layer层进行穿梭:

    CCSprite *sprite = mapLayer->tileAt(ccp(0, 0));    arrayAllSprites->addObject(sprite);    CCActionInterval *action = CCMoveBy::create(4, ccp(50, -50));    sprite->runAction(CCRepeatForever::create(dynamic_cast<CCActionInterval *>(CCSequence::create(action, action->reverse(), NULL))));    float width_size = layerSize.width / 14;//这里要注意了,我这里取得的是像素点的大小    CCSprite *sprite1 = mapLayer->tileAt(ccp(width_size, 0));    mapLayer->reorderChild(sprite1, 10);    CCActionInterval *action1 = CCMoveBy::create(4, ccp(50, 50));    sprite1->runAction(CCRepeatForever::create(dynamic_cast<CCActionInterval *>(CCSequence::create(action1, action1->reverse(), NULL))));


在tmx地图中,每一个tile其实就是一个CCSprite,我们都可以通过CCTMXLayer根据tile的坐标获取它的CCSprite,并对tile进行调整。


还可以利用CCTMXObjectGroup来获取TMX中的Objects,例子代码:

    CCTMXTiledMap *map = CCTMXTiledMap::create(/*"TileMaps/iso-test-zorder.tmx"*/"TileMaps/ortho-objects.tmx");
    map->setAnchorPoint(ccp(0.5f, 0.5f));
    map->setPosition(ccp(winSize.width / 2.0f, winSize.height / 2.0f + 150));
    CCTMXObjectGroup *group = map->objectGroupNamed("Object Group 1");
    CCArray *arraySprite = group->getObjects();

1 0