1. 程式人生 > >Cocos2d-序列幀動畫

Cocos2d-序列幀動畫

基礎原理

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

我們使用Animation類描述一個動畫,而精靈顯示動畫的動作則是一個Animate物件。動畫動作Animate是精靈顯示動畫的動作,它由一個動畫物件建立,並由精靈執行。

建立方法:手動新增序列幀到Animation類,使用檔案初始化Animation類。

手動新增

手動新增的方法需要將每一幀要顯示的精靈有序新增到Animation類中,並設定每幀的播放時間,讓動畫能夠勻速播放。另外,還要通過setRestoreOriginalFrame來設定是否在動畫播放結束後恢復到第一幀。建立好Animation例項後,需要建立一個Animate例項來播放序列幀動畫。

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)); addSpriteFrame,新增精靈幀到Animation例項 setDelayUnits,設定每一幀持續時間,以秒為單位 setRestoreOriginalFrame,設定是否在動畫播放結束後恢復到第一幀 clone,克隆一個該Animation例項

檔案新增

首先我們來了解下需要用到的AnimationCache類。AnimationCache可以載入xml/plist檔案,plist檔案裡儲存了組成動畫的相關資訊,通過該類獲取到plist檔案裡的動畫。
在使用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));
3.0開始,Cocos2d-x使用getInstance來獲取單例例項。

動畫快取

通常情況下,對於一個精靈動畫,每次建立時都需要載入精靈幀,按順序新增到陣列,再建立對應動作類,這是一個非常煩瑣的計算過程。對於使用頻率高的動畫,比如走路動畫,將其加入快取可以有效降低每次建立的巨大消耗。由於這個類的目的和快取內容都非常簡單直接,所以其介面也是最簡單了的,如下所示:
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();
}

值得注意的是清理的順序,我們推薦先清理動畫快取,然後清理精靈幀快取,最後是紋理快取。按照引用層級由高到低,以保證釋放引用有效。不然的話會丟失地址,無法繼續索引。

相關推薦

Cocos2d-序列動畫

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

關於cocos2d序列動畫plist檔案的建立

轉載請註明出處 用過的人都知道,cocos2d的動畫編輯器是多麼的坑,自從cocos2d支援Animation後,開始使用Animation動畫了。關於Animation的使用網上也有很多,但是我看了一下,主流的就是兩種方法,一是:手動新增,將plist檔案裡的精靈幀一

Cocos2d-x 3.x序列動畫

vector 序列幀 bash cpp ams with 序列 object -s Animation : 一個給精靈對象執行的幀動畫對象。 Animate:是將動畫包裝成動作的類。 AnimationCache:管理動畫的單例。 簡介 Animat

楓葉天空Cocos2d-x3.0系列教程二 序列動畫

更新日誌: 2014-01-31  增加了cocoStudio動畫編輯器的說明 內容概述: 從今天開始,我們就正式進入cocos2d-x3.0的開發教程了,本篇的核心內容是序列幀動畫。 準備工作 1、首先我們建立一個新的場景類,作為我們本系列教程的一

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

建立方法 手動新增序列幀到Animation類 在建立Animation例項時會用到以下幾個介面: addSpriteFrame,新增精靈幀到Animation例項 setDelayUnits,設定每一幀持續時間,以秒為單位 setRestoreOr

關於在unity中使用序列動畫

atime highlight ++ switch ati 是你 一秒 tor 報錯 //動畫數組 public object[] anim; //限制一秒多少幀 public float fps = 30; //幀序列 priv

Html5 序列動畫

下一個 XML default idt 毫秒 meta document etc array <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <he

UV序列動畫

sub sam ble parent image png ons custom 分享圖片 通過上圖實現一個火焰的序列幀動畫(使用UV實現美術只需要出一張圖,而不用每個火焰狀態出一張圖,節省了內存)。 shader如下: Shader "Custom/UVAnimatio

特效序列動畫,可指定開始和結束點

 直接貼程式碼: Shader "James/FX/MeshFrame" { Properties { [Enum(Add, 1, Blend, 10)] _DstBlend ("Blend Mode", Float) = 1 _Ma

WPF 序列動畫

直接上程式碼 private void LoadPics() { try { _storyboard = new Storyboard(); for (int i =

css精靈圖寫序列動畫

     最近寫一個H5要求序列幀動畫比較多,但是卻僅僅是作為裝飾,而不對其進行操作,為了減小記憶體以及更好的效能選擇了css動畫+css精靈圖的方式。 1.找工具製作css精靈圖。     聽說Win系統的css sprite很好用,可惜m

2014-10-31Android學習------序列動畫,開始,結束監聽的解決--------GIF動畫實現

寫一篇文章很辛苦啊!!! 轉載請註明,聯絡請郵件[email protected] 我學習Android都是結合原始碼去學習,這樣比較直觀,非常清楚的看清效果,覺得很好,今天的學習原始碼是網上找的個AnimationTest 原始碼 百度搜就知道很多下載的

【Unity】Unity製作序列動畫

工具:PhotoShop + Unity + 腦子 首先你的有素材 沒有可以在這裡下載 http://download.csdn.net/download/ldy597321444/10042175

寫的一個UGUI下Image控制元件做序列動畫的小工具

unity2D使用序列幀做動畫,一般都用2d SpriteRenderer,它的好處是能夠沿用圖片原有的大小和錨點。特別是我們使用TexturePacker打圖集的時候並且Trim邊緣空白的時候,可以直接使用它,而不用在程式中調整它的位置等資訊。 然而我們如果

cocos2d-x動畫實現(續)

猴子原創, 歡迎轉載,轉載請在明顯處註明! 謝謝。 幀動畫就是很多張png的序列圖實現輪流播放產生動畫效果。 那麼首先我們要一套動畫的序列圖,沒有圖的可以看引擎例子裡面的圖。很多張圖我們可以採

canvas——繪製序列動畫

程式碼中用的圖片:大小200*260方法一:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>序列幀動畫<

序列動畫,今天偶然發現的很有意思的動畫

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <ti

MovieClip序列動畫 視訊教程

 這節課我們要講解的是egret的movieclip動畫,使用movieClip動畫的時候,我們需要用到兩個檔案: SpriteSheet序列動畫圖(png) Json配置檔案 這兩個檔案可以用egret提供的一個軟體TextureMerger 生成或者flash軟體(

canvas 序列動畫

定義 initial 創建 eat UNC star pen frame 幀動畫 先引入 jquery.js frame-animation.js//先創建 canvas createCanvas:function () { var canva

Cocos2d-x開發實例介紹動畫使用

rect http splay end ram nal cache wtl 布爾 以下我們通過一個實例介紹一下幀動畫的使用。這個實比例如以下圖所看到的,點擊Gobutton開始播放動畫,這時候播放button標題變為Stop,點擊Stopbutton能夠停止播放動畫。以下