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
<使用合图播放动画>
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);
}