欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Cocos2dx <基础> 帧动画

程序员文章站 2024-03-25 20:22:22
...

<帧动画>

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

<使用合图播放动画>

Cocos2dx <基础> 帧动画

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


相关标签: Cocos2dx 游戏