动画基础
动画不同于动作,动作的针对单帧的,动画则是多帧组合的。
// 获得精灵帧缓存对象,并且将动画帧加载到缓存
SpriteFrameCache* cache = SpriteFrameCache::getInstance();
cache->addSpriteFramesWithFile("animations/grossini.plist");
// 从缓存中获取动画用的精灵帧,保存在frames,以备将来Animation使用
Vector<SpriteFrame*> frames; //Animation必须用精灵帧集合Vector做参数
for (int i = 1; i <= 14;++i)
{
char buf[128];
sprintf(buf, "grossini_dance_%02d.png", i); //从plist中知道的小图命名逻辑
SpriteFrame* frame = cache->getSpriteFrameByName(buf);
frames.pushBack(frame);
}
// Animation可以复用(一个Animation可以为多个Animate使用),Animate不可以(Animate理解为一个动作——Animate相当于播放器,Animation相当于光盘
Animation* animation = Animation::createWithSpriteFrames(frames,0.1f); //Animation保存了所有动画图片,以及动画时间间隔要求
Animate* animate = Animate::create(animation);
// 执行动画
Sprite* sprite = Sprite::create(); addChild(sprite);
sprite->setPosition(200,200);
//运行Animate动作
sprite->runAction(RepeatForever::create(animate));
动画缓存
既然Animation可以复用,那么一定有动画缓存:
添加
Animation* animation = Animation::createWithSpriteFrames(frames,0.1f);
AnimationCache::getInstance()->addAnimation(animation,"animation1");
也可以用另外一种方式:但是这种方式的plist有特别要求
AnimationCache::getInstance()->addAnimationsWithFile(plist文件);
缓存添加一个Animation同时也绑定一个名字
使用
Animate* animate = Animate::create(AnimationCache::getInstance()->
getAnimation("animation1"));
sprite->runAction(RepeatForever::create(animate));
从动画缓存中直接按名字取出使用
其他
Animation::setDelayPerUnit(delay);设置动画时间间隔
AnimationCache::getInstance()->removeAnimation("aa");删除某个缓存
动画缓存也是和其他缓存一块清除的AnimationCache::destroyInstance();
动画封装
void runAnimation(Sprite* sprite, const char* plist, const char* frameFormat= nullptr, float delay = 0.0f)
{
Animation* animation =getAnimation(plist, frameFormat, delay);
Animate* animate = Animate::create(animation);
RepeatForever* rep = RepeatForever::create(animate);
sprite->runAction(rep);
}
Animation* getAnimation(const char* plist, const char* frameFormat, float delay = 0.0f)
{
Animation* ani = AnimationCache::getInstance()->getAnimation(plist);
if (!ani)
{
loadAnimation(plist, frameFormat, delay);
ani = AnimationCache::getInstance()->getAnimation(plist);
}
ani->setDelayPerUnit(delay);
return ani;
}
void loadAnimation(const char* plist, const char* frameFormat, float delay = 0.0f)
{
// 获得精灵帧缓存对象,并且将动画帧加载到缓存
SpriteFrameCache* cache = SpriteFrameCache::getInstance();
cache->addSpriteFramesWithFile(plist);
Vector<SpriteFrame*> frames;
for (int i = 1;; ++i)
{
char buf[128];
sprintf(buf, frameFormat, i);
SpriteFrame* frame =cache->getSpriteFrameByName(buf);
if (frame == NULL)
break;
frames.pushBack(frame);
}
Animation* animation = Animation::createWithSpriteFrames(frames,delay);
AnimationCache::getInstance()->addAnimation(animation,plist);
}
使用时直接用runAnimation(运行sprite,plist文件,小图格式规律,动画时间间隔)就可以了