Cocos2d-x動畫播放(序列幀)


簡介

Cocos2d-x中,動畫的具體內容是依靠精靈顯示出來的,為了顯示動態圖片,我們需要不停切換精靈顯示的內容,通過把靜態的精靈變為動畫播放器從而實現動畫效果。動畫由幀組成,每一幀都是一個紋理,我們可以使用一個紋理序列來創建動畫。

我們使用Animation類描述一個動畫,而精靈顯示動畫的動作則是一個Animate對象。動畫動作Animate是精靈顯示動畫的動作,動畫與動畫動作的關系如同CD光盤與CD播放機的關系,前者記錄了動畫的內容,后者是播放動畫的工具,它由一個動畫對象創建,並由精靈執行。

創建方法

手動添加序列幀到Animation類
使用文件初始化Animation類

手動添加:

手動添加的方法需要將每一幀要顯示的精靈有序添加到Animation類中,並設置每幀的播放時間,讓動畫能夠勻速播放。另外,還要通過setRestoreOriginalFrame來設置是否在動畫播放結束后恢復到第一幀。創建好Animation實例后,需要創建一個Animate實例來播放序列幀動畫。代碼如下:

 1 auto animation = CCAnimation::create();
 2 for(int i = 1;i < 5;i++)
 3 {
 4 char str[10] = {0};
 5 sprintf(str,"0%d.png",i);
 6 animation->addSpriteFrameWithFile(str); 
 7 } 
 8 animation->setDelayPerUnit(2.5f/14.0f);         //2.5秒內實現14幀的播放
 9 animation->setRestoreOriginalFrame(true);
10 animation->setLoops(-1);
11 auto animate = CCAnimate::create(animation);
12 sprite->runAction(CCRepeatForever::create(CCSequence::create(animate,NULL)));

在創建Animation實例時會用到以下幾個接口:

addSpriteFrame,添加精靈幀到Animation實例
setDelayUnits,設置每一幀持續時間,以秒為單位
setRestoreOriginalFrame,設置是否在動畫播放結束后恢復到第一幀

文件添加:

首先我們來了解下需要用到的AnimationCache類。AnimationCache可以加載xml/plist文件,plist文件里保存了組成動畫的相關信息,通過該類獲取到plist文件里的動畫。

1 auto cache = AnimationCache::getInstance();
2 
3 cache->addAnimationsWithFile("animations.plist");
4 
5 auto animation2 = cache->getAnimation("animation");    // 其中animation可以換成上面講的str,str的獲得和上面的方法所用相同
6 
7 auto action2 = Animate::create(animation2);
8 
9 sprite->runAction(Sequence::create(action2, action2->reverse(), NULL));

還可以有另一種寫法:

 1 CCSpriteFrameCache *frameCache = CCSpriteFrameCache::sharedSpriteFrameCache();
 2 frameCache->addSpriteFramesWithFile("animations.plist");
 3 CCArray* animFrames = CCArray::createWithCapacity(15);
 4 char str[100] = {0};
 5 for(int i = 1; i < 15; i++)
 6 {
 7     sprintf(str, "grossini_dance_%02d.png",i);
 8     CCSpriteFrame *frame = frameCache->spriteFrameByName(str);
 9     animFrames->addObject(frame);
10 }
11  
12 CCAnimation *animation = CCAnimation::createWithSpriteFrames(animFrames, 0.2f);
13 CCAnimate *anim = CCAnimate::create(animation);

相比較來說,還是第一種方法簡單。

在使用AnimationCache類時會用到以下幾個接口:

addAnimationsWithFile,添加動畫文件到緩存,plist文件
getAnimation,從緩存中獲取動畫對象
getInstance,獲取動畫緩存實例對象

 

動畫緩存(AnimationCache)

通常情況下,對於一個精靈動畫,每次創建時都需要加載精靈幀,按順序添加到數組,再創建對應動作類,這是一個非常煩瑣的計算過程。對於使用頻率高的動畫,比如走路動畫,將其加入緩存可以有效降低每次創建的巨大消耗。由於這個類的目的和緩存內容都非常簡單直接,所以其接口也是最簡單了的,如下所示:

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),獲得事先存入的動畫
 

 

 

個人覺得http://zengrong.net/post/2006.htm上關於動畫的實現也很詳細。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM