1. 程式人生 > >Cocos2d-x 影象渲染和動畫——序列幀動畫

Cocos2d-x 影象渲染和動畫——序列幀動畫

建立方法

手動新增序列幀到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();
}