簡介
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上關於動畫的實現也很詳細。