<帧动画>
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()方法创建。
扫描二维码关注公众号,回复:
145241 查看本文章
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); }