Cocos2dx <基础> 帧动画

<帧动画>

a. 将几个静态图片按照一定的顺序,连续播放的结果。

<Cocos2dx播放帧动画需要了解的几个类>

a. SpriteFrame: 精灵帧。精灵帧包含了对应纹理在大的纹理区域中的位置和大小, 对应纹理是否经过旋转和偏移。根据这些几何信息,,可以从大的纹理中找到正确的纹理区域作

    为精灵帧显示的图像。

	////使用纹理创建精灵帧
	auto tex = TextureCache::getInstance()->addImage("Game/role.png");
	auto spr = SpriteFrame::createWithTexture(tex,Rect(0,0,81.25,81.25));
	auto spi = Sprite::createWithSpriteFrame(spr);
	spi->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2));
	this->addChild(spi);
	//使用plist文件创建精灵帧
	SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Game/Plist.plist");
	auto sprite = Sprite::createWithSpriteFrameName("GodPlane.png");
	sprite->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2));
	this->addChild(sprite);

b. SpriteFrameCache: 精灵帧缓存;存放了多个精灵帧到缓存中,通过字典的方式存储单个精灵帧,key: 精灵帧的名字,值: SpriteFrame。一般处理的是plist文件。

    plist文件如果和对应的png图片在同一个目录下,则直接可以写plist文件名就可以了。

c. AnimationFrame: 动画帧信息,存储的是对应的精灵帧信息。通过Animation的getFrames()函数获得。

e. Animation: 动画信息。存储了所有的动画帧信息, 一般通过create()或者createWithSpriteFrames()方法创建。

f.  Animate: 动画处理类。 真正完成动画表演的类。

<创建帧动画的流程:>

  a. 创建精灵帧  b.将精灵帧添加到动画Animation中,一定要设置每帧播放的时间  c.创建动画处理类Animate

<使用合图播放动画>


std::string animationName[4] = {"DOWN","LEFT","RIGHT","UP"};
void TieldMap::onEnter()
{
	Layer::onEnter();
	auto visibleSize = Director::getInstance()->getVisibleSize();
	//根据png合图创建动画
	createAnimation();
	//执行动画
	playAnimation(2);
}
void TieldMap::createAnimation()
{
	auto visibleSize = Director::getInstance()->getVisibleSize();
	int x = 81.25;  //每个图片的宽,高
	for (int i=0;i<4;i++)
	{
		Animation* animation = Animation::create();
		animation->setDelayPerUnit(0.2);
		//将单行做成动画
		for (int n = 0; n < 4; n++)
		{
			//根据图片和范围创建精灵帧
			auto spriteFrame = SpriteFrame::create("Game/role.png", Rect(0 + x * n, 0+x*i, x, x));
			animation->addSpriteFrame(spriteFrame);
			//------检测精灵帧是否显示正确的区域
			if (n == 1&& i==0)
			{
				auto spi = Sprite::createWithSpriteFrame(spriteFrame);
				spi->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2));
				this->addChild(spi);
			}
		}
		//将动画添加到动画缓存中
		AnimationCache::getInstance()->addAnimation(animation, animationName[i]);
	}
}

void TieldMap::playAnimation(int index) 
{
	if (index<0||index>3) { return; };
	auto animation = AnimationCache::getInstance()->getAnimation(animationName[index]);
	auto sprite = Sprite::create();
	sprite->setPosition(Vec2(200, 300));
	auto animate = Animate::create(animation);
	sprite->runAction(RepeatForever::create(animate));
	this->addChild(sprite);
}
<使用PList文件创建动画>

//使用plist文件创建动画
void TieldMap::createPlist()
{
	auto animation = Animation::create();
	animation->setDelayPerUnit(0.2);
	//根据图片的数量(0---8),9张图片skill-01.png
	for (int i=0;i<9;i++)
	{
		std::string spriteFramesName = String::createWithFormat("skill-0%d.png",i+1)->getCString();
		auto spriteFrames = SpriteFrameCache::getInstance()->getSpriteFrameByName(spriteFramesName);
		//if (i==0)
		//{
		//	auto sprite = Sprite::createWithSpriteFrame(spriteFrames);
		//	sprite->setPosition(Vec2(500,300));
		//	this->addChild(sprite);
		//}
		animation->addSpriteFrame(spriteFrames);
	}
	//将动画放到动画缓存中
	AnimationCache::getInstance()->addAnimation(animation,"Skill");
}

void TieldMap::playAnimationplist(std::string name)
{
	if (name=="") { return; };
	auto animation = AnimationCache::getInstance()->getAnimation(name);
	auto sprite = Sprite::create();
	sprite->setPosition(Vec2(500, 350));
	auto animate = Animate::create(animation);
	sprite->runAction(RepeatForever::create(animate));
	this->addChild(sprite);
}


猜你喜欢

转载自blog.csdn.net/wue1206/article/details/80202823
今日推荐