Cocos动画

来源:互联网 发布:中国家具出口数据 编辑:程序博客网 时间:2024/05/22 11:00

动画基础

动画不同于动作,动作的针对单帧的,动画则是多帧组合的。

 

// 获得精灵帧缓存对象,并且将动画帧加载到缓存

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, constchar* 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(constchar* 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(constchar* 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文件,小图格式规律,动画时间间隔)就可以了

 

0 0
原创粉丝点击