Cocos2d-x 影象渲染和動畫——序列幀動畫
阿新 • • 發佈:2019-02-16
建立方法
手動新增序列幀到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();
}