(在TMX地图中添加并且移动精灵)---> 将地图层和精灵层分开
将地图层和精灵层分开: class TieldMap:public cocos2d::Layer中, this->addChild(地图层); this->addChild(精灵层);
下面文章的目的: a.先将图片组成帧动画信息(Animation),然后载入到动画缓存中,根据帧动画名获得帧动画信息。根据帧动画信息创建出序列帧动画(Animate)。b. 将地图层和精灵层分开
a. 角色素材 (png图片)
(1) 先将图片组成帧动画信息(Animation),然后载入到动画缓存
void TieldMap::addSpriteName(std::string fileName) { float size = 81.25; //图片的大小除以4 for (int i = 0; i < 4; i++) { auto animation = Animation::create(); animation->setDelayPerUnit(0.2); for (int n = 0; n < 4; n++) { //创建动画帧 Rect rect = Rect(n*size, i*size, size, size); auto spriteFrame = SpriteFrame::create(fileName, rect); animation->addSpriteFrame(spriteFrame); //检测每个动画帧是否成功创建 //if (i==2&&n==0) //{ // auto sprite = Sprite::createWithSpriteFrame(spriteFrame); // sprite->setPosition(visibleSize / 2); // this->addChild(sprite); //} } //检查是否可以执行动画 //if (i == 2) //{ // auto animate = Animate::create(animation); // auto sprite = Sprite::create(); // sprite->setPosition(visibleSize / 2); // sprite->runAction(animate); // this->addChild(sprite); //} //动画缓存 AnimationCache::getInstance()->addAnimation(animation, animationName[i]); } }
(2) 初始化函数中init(),创建精灵执行动画
this->addSpriteName("mp.png"); auto animation = AnimationCache::getInstance()->getAnimation("RIGHT"); auto animate = Animate::create(animation); sprite = Sprite::create(); sprite->setTag(2); sprite->setAnchorPoint(Vec2::ZERO); sprite->setPosition(map->getTileSize().width,map->getTileSize().height*11); sprite->runAction(RepeatForever::create(animate)); this->addChild(sprite);
(3) 上面将精灵添加完毕,开始移动精灵
//精灵执行动作 auto move = MoveBy::create(5, Vec2(320, 0)); auto backs = move->reverse(); auto func = [this]() {this->sprite->setFlippedX(true);}; auto callFunc = CallFunc::create(func); auto func1= [this]() {this->sprite->setFlippedX(false); }; auto callFunc1 = CallFunc::create(func1); auto seq = Sequence::create(move, callFunc, backs, callFunc1, NULL); sprite->runAction(RepeatForever::create(seq));
效果: 精灵添加到地图层,并且精灵可以来回移动
Cocos2d-x 中可以获取TMX地图中某一个位置的瓷砖,可以移动,旋转,删除该处的瓷砖。如果要获取某个位置的瓷砖,首先获取这个瓷砖所在的图层,根据图层获取瓷砖。
//Cocos2d-x中,使用这个TMXTiledMap来加载tmx文件 auto map = TMXTiledMap::create("map01.tmx"); map->setAnchorPoint(Vec2(0, 0)); map->setTag(1); this->addChild(map);
TMXLayer:Cocos2dx对TMX地图图层的封装,通过TMXLayer封装好的方法可以获取图层,获取某个位置的瓷砖,移除某位置的 瓷砖。
(1) 获取图层
//layerName: 图层名 TMXLayer* getLayer(const std::string& layerName) const; layer = map->getLayer("tree");
(2) 从图层中获取瓷砖某个位置的瓷砖
Sprite*getTileAt(constVec2&tileCoordinate);
tileCoordinate: 表示瓷砖在图层的位置(列,行)。位置可以直接从Tiled中获得。该函数返回的是精灵,操作和别的精灵对象一样。该精灵对象已经被添加到图层中。
(3) 图层删除精灵
//根据添加到图层中的瓷砖 在 图层的位置 (列,行) void removeTileAt(const Vec2& tileCoordinate); //child: 要删除的对象 cleanup: true void removeChild(Node* child, bool cleanup) ;