標籤:style class http tar com get
一、幀動畫你能夠通過一系列圖片檔案,像例如以下這樣,建立一個動畫:[cpp] CCAnimation *animation = CCAnimation::create(); //從本地檔案系統中載入圖片檔案到CCSpriteFrame中區,然後加入到CCAnimation中 for (int i = 1; i < 15; i++) { char szImageFileName[128] = {0}; sprintf(szImageFileName, "Images/grossini_dance_%02d.png", i); animation->addSpriteFrameWithFileName(szImageFileName); } animation->setDelayPerUnit(2.8f / 14.0f); // 這個動畫包括14幀,將會持續2.8秒. animation->setRestoreOriginalFrame(true); // 14幀播放完之後返回到第一幀 CCAnimate *action = CCAnimate::create(animation); sprite->runAction(action); // 執行精靈對象 注意CCAnimation是由很多精靈幀組成,能夠設定間隔時間,期間等,它實際上是包括著一組資料。CCAnimate是一個動作,它是通過CCAnimation對象建立。二、精靈表動畫雖然手工動畫非常easy理解,但它非常少用在遊戲開發中。相反的,精靈表動畫的方式在2D動畫中常常使用。這是一個精靈表。它實際上就是一系列動畫幀圖片,或者是一個能用於一個情境的圖片集。 在OpenGLES1.1階段,精靈表由於下面幾點被廣泛應用:1、降低檔案讀寫時間。讀取一張圖片比讀取一堆小檔案肯定要快。2、降低記憶體消耗。OpenGL ES 1.1隻可以使用2的幾次方大小的圖片(也就是寬度或者高度是2,4,864,128,256,512,1024,...)。也就是說,OpenGL ES1.1將會分配給每一個圖片2的幾次方大小的記憶體空間,即使你這張圖片達不到這種寬度和高度也會分配大於此圖片的2的n次方大小的空間。那麼運用這種圖片集的方式將會降低記憶體片段。3、降低OpenGL ES繪製調用而且加速渲染。Cocos2d-x v2.0升級到了OpenGL ES2.0.OpenGL ES2.0不會再分配2的幾次方的記憶體塊了,可是降低讀取時間和繪製調用的優勢依舊存在。那麼產生的動畫效果怎樣呢?正如我們所見,精靈表不是動畫的一個必須條件。可是考慮到以上的一些優勢,精靈表還是非常有效率的。在Cocos2dx中,有很多不同的方式來建立精靈表。三、通過.png 和 .plist檔案建立精靈表在cocos2dx 0.x和1.x版本號碼中,CCSpriteSheet就是為以上的目的設計。在V2.0中CCSpriteBatchNode替代了CCSpriteSheet。CCSpriteBatchNode對象包括了全部精靈幀的圖片紋理。即使它不會繪製,你也必需要把它加入到情境中,比如:[cpp] CCSpriteBatchNode* spritebatch = CCSpriteBatchNode::create("animations/grossini.png"); 下一步,你須要運用CCSpriteFrameCache執行個體來確保幀名字相應幀邊界。也就是說,圖片在哪一塊矩形地區中。比如:[cpp] CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache(); cache->addSpriteFramesWithFile("animations/grossini.plist"); 一旦你的精靈表和幀載入完畢,而且精靈表已經被加入到了情境中,你能夠通過createWithSpriteFrameName方法來建立精靈。而且通過addChild要加入到精靈表中:[cpp] m_pSprite1 = CCSprite::createWithSpriteFrameName("grossini_dance_01.png"); spritebatch->addChild(m_pSprite1); addChild(spritebatch); createWithSpriteFrameName 方法將會從grossini.plist中找到相應的座標以及矩形地區,之後再裁剪grossini.png的紋理成一個精靈幀。 如今我們建立一個CCArray對象而且天劍全部的幀動畫進去。在這個動畫的範例中,我們發現全部的14幀都有同樣的大小,所以我們能夠用一個嵌套的迴圈遍曆它們,而且當完畢加入14幀之後結束掉迴圈。[cpp] CCArray* animFrames = CCArray::createWithCapacity(15); char str[100] = {0}; for(int i = 1; i < 15; i++) { sprintf(str, "grossini_dance_%02d.png", i); CCSpriteFrame* frame = cache->spriteFrameByName( str ); animFrames->addObject(frame); } 最後,我們須要建立一個CCAnimate動作執行個體來執行CCSprite。以下我們能夠在CCRepeatForever動作中包裹CCAnimate動作來讓它一直執行下去,像這樣:[cpp] CCAnimation* animation = CCAnimation::createWithSpriteFrames(animFrames, 0.3f); m_pSprite1->runAction( CCRepeatForever::create( CCAnimate::create(animation) ) ); 四、檔案動畫CCAnimateCache可以載入一個描寫敘述一批節點的xml/plist檔案,包含幀名和他們的矩形地區。這個借口很easy使用。[cpp] CCAnimationCache *cache = CCAnimationCache::sharedAnimationCache(); // 緩衝在cocos2dx中一直是單例模式 cache->addAnimationsWithFile("animations/animations-2.plist"); CCAnimation animation = cache->animationByName("dance_1"); CCAnimate animate = CCAnimate::create(animation); sprite->runAction(animate);