Cocos2dx <6> 瓷砖地图(2)

时间:2022-04-20 16:06:34

(在TMX地图中添加并且移动精灵)---> 将地图层和精灵层分开

将地图层和精灵层分开:  class TieldMap:public cocos2d::Layer中, this->addChild(地图层); this->addChild(精灵层);

下面文章的目的: a.先将图片组成帧动画信息(Animation),然后载入到动画缓存中,根据帧动画名获得帧动画信息。根据帧动画信息创建出序列帧动画(Animate)。b. 将地图层和精灵层分开 

a.  角色素材 (png图片)

    Cocos2dx <6> 瓷砖地图(2)

   (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));

效果: 精灵添加到地图层,并且精灵可以来回移动

Cocos2dx <6> 瓷砖地图(2)

(读写TMX地图中的图层和瓷砖)

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中获得。该函数返回的是精灵,操作和别的精灵对象一样。该精灵对象已经被添加到图层中。

Cocos2dx <6> 瓷砖地图(2)


(3) 图层删除精灵

	//根据添加到图层中的瓷砖 在 图层的位置 (列,行)
	void removeTileAt(const Vec2& tileCoordinate);
	//child: 要删除的对象  cleanup: true
	void removeChild(Node* child, bool cleanup) ;