加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Cocos2d-x 序列帧动画

发布时间:2020-12-14 17:07:34 所属栏目:百科 来源:网络整理
导读:创建方法 手动添加序列帧到Animation类 在创建Animation实例时会用到以下几个接口: addSpriteFrame ,添加精灵帧到Animation实例 setDelayUnits ,设置每一帧持续时间,以秒为单位 setRestoreOriginalFrame ,设置是否在动画播放结束后恢复到第一帧 clone

创建方法

手动添加序列帧到Animation类

在创建Animation实例时会用到以下几个接口:

  • addSpriteFrame,添加精灵帧到Animation实例
  • setDelayUnits,设置每一帧持续时间,以秒为单位
  • setRestoreOriginalFrame,设置是否在动画播放结束后恢复到第一帧
  • clone,克隆一个该Animation实例
auto animation = Animation::create();
    for( int i=1;i<15;i++)
    {
        char szName[100] = {0};
        sprintf(szName,"Images/grossini_dance_%02d.png",i);
        animation->addSpriteFrameWithFile(szName);
    }
    // should last 2.8 seconds. And there are 14 frames.
    animation->setDelayPerUnit(2.8f / 14.0f);
    animation->setRestoreOriginalFrame(true);

    auto action = Animate::create(animation);
    _grossini->runAction(Sequence::create(action,action->reverse(),NULL));

使用文件初始化Animation类

在使用AnimationCache类时会用到以下几个接口:

  • addAnimationsWithFile,添加动画文件到缓存,plist文件
  • getAnimation,从缓存中获取动画对象
  • getInstance,获取动画缓存实例对象

使用文件添加的方法只需将创建好的plist文件添加到动画缓存里面,plist文件里包含了序列帧的相关信息。再用动画缓存初始化Animation实例,用Animate实例来播放序列帧动画。

auto cache = AnimationCache::getInstance();
    cache->addAnimationsWithFile("animations/animations-2.plist");
    auto animation2 = cache->getAnimation("dance_1");

    auto action2 = Animate::create(animation2);
    _tamara->runAction(Sequence::create(action2,action2->reverse(),NULL));

动画缓存

通常情况下,对于一个精灵动画,每次创建时都需要加载精灵帧,按顺序添加到数组,再创建对应动作类,这是一个非常烦琐的计算过程。对于使用频率高的动画,比如走路动画,将其加入缓存可以有效降低每次创建的巨大消耗。由于这个类的目的和缓存内容都非常简单直接,所以其接口也是最简单了的,如下所示:

  • static AnimationCache* getInstance(),全局共享的单例
  • void addAnimation(Animation *animation,const std::string& name),添加一个动画到缓存
  • void addAnimationsWithFile(const std::string& plist),添加动画文件到缓存
  • void removeAnimation(const std::string& name),移除一个指定的动画
  • Animation* getAnimation(const std::string& name),获得事先存入的动画

在内存警告时我们应该加入如下的清理缓存操作,推荐先清理动画缓存,然后清理精灵帧缓存,最后是纹理缓存。按照引用层级由高到低,以保证释放引用有效。

void releaseCaches()

{ AnimationCache::destroyInstance(); SpriteFrameCache::getInstance()->removeUnusedSpriteFrames(); TextureCache::getInstance()->removeUnuserdTextures(); }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读