Cocos2d-x 3.x plist+png 作動畫

***************************************轉載請註明出處: http://blog.csdn.net/lttree******************************************web

前言:windows

此次的東西,實際上是在作完2048後,我有個Flash想用。緩存

就像,每天系列,開頭會有 」提米「 的叫聲+動畫, 是否是感受很帶感。app

以前,作第一個遊戲的時候,有作一套78幀的Flash,函數

可是當時不會用,如今正好拿過來用了,嘿嘿~工具

正文:oop

此次例子,就拿我這幾天想作的 FlappyBird 的小鳥爲例吧:動畫

1.首先,咱們先來作須要的資源,this

這個有三個層次(目前我知道的)spa

① 加載每一個圖片

② 把全部圖片壓縮到一張圖片中,而後分割取出。

③藉助於plist文件與png共同取出圖片。

前兩種,比較簡單,並且效率不是很高,我就直接用這三者最好的,plist+png

其實,plist通常是用在mac上的,

在windows製做plist能夠用 TexturePacker,

(能夠在這裏下載: https://www.codeandweb.com/texturepacker/download  )

很是方便的一個工具,

安裝完畢,打開,須要選擇你的引擎,固然咱們選擇的是cocos2d的:

打開之後,會出現以下界面:

這個工具的使用細節,我不是很懂= =。

詳細的能夠問問度娘。

我只知道,點上面那個按鈕,添加,你所須要壓縮在PNG裏的圖片:

這個技巧不須要我多說了吧:

按住Ctrl 能夠單個多選,

按住Shift能夠連續多選。

選出圖片,並把他們加入進來。

若是沒有圖片,拿下面的湊合一下吧:

  

而後點擊 左上角 的File按鈕:

而後,在下拉的菜單中,選  Public sprite sheet ,而後就選擇存放 PNG和PLIST的目錄:

先是plist目錄,而後是PNG目錄,最好兩個文件名是同樣的。

接着,就會給你輸出出來了:

OK,你就能夠到存放的地方看你所生成的兩個文件了。

2.接下來就是Cocos2d-x  中調用部分了。

把兩個文件(plist和png) 複製到Resource 裏面,

在VS2012 中 右鍵點擊Resource 文件夾,添加->現有項,將二者添加進來。

這裏,我就直接在HelloWorld界面,放小鳥飛行動畫了。

在HelloWorldScene.cpp的Init函數中加入,以下代碼:

// ①建立緩存,將圖片讀取進來  CCSpriteFrameCache * cache = CCSpriteFrameCache::sharedSpriteFrameCache();  
  cache -> addSpriteFramesWithFile("hero_bird.plist");  // ②建立第一幀,設置位置,加入到當前場景  CCSprite *sp = CCSprite::createWithSpriteFrameName("bird_hero_01.png");  sp -> setPosition(Point(visibleSize.width/3,visibleSize.height/2));  this -> addChild( sp );  // ③建立集合,存每一張圖片  Vector< SpriteFrame* > sfme = Vector< SpriteFrame* >::Vector();  char str[20] = {0};  for( int i = 1 ; i < 4 ; ++i )  {    // ④ 獲取圖片名字,加入到集合中    sprintf(str,"bird_hero_%02d.png",i);    SpriteFrame *fname = cache -> spriteFrameByName( str );    sfme.pushBack( fname );  }    // ⑤ 建立動畫,設置播放速度  CCAnimation *animation = CCAnimation::createWithSpriteFrames( sfme , 0.1f );  sp -> runAction ( CCRepeatForever::create(CCAnimate::create(animation )));

來解釋一下:

前面①、② 無需多說,

③,這個之前用CCArray或者Array,

如今不行了,反正我是3.0和3.2都不能用Array,會在⑤

createWithSpriteFrames出問題,

由於追到這個函數定義,能夠發現:

Animation* Animation::createWithSpriteFrames(const Vector<SpriteFrame*>& frames, float delay/* = 0.0f*/, unsigned int loops/* = 1*/)
{
    Animation *animation = new Animation();
    animation->initWithSpriteFrames(frames, delay, loops);
    animation->autorelease();    return animation;
}

它的第一個參數必須爲:

const Vector<SpriteFrame*>& frames

這點就要和  以前版本不一樣,要注意一下。

而後是 ④

這個獲取圖片名字,爲何是:

sprintf(str,"bird_hero_%02d.png",i); 呢?

由於%02d,能夠保證,取i後,不夠的用0補足,

好比,若是是%d,

當i等於1, 獲取的名字是: bird_hero_1

而%02d,獲取名字是: bird_hero_01

Ok,運行一下,就能夠發現小鳥在飛翔啦~ 

PS:如何做爲一個開場動畫呢?

個人方法就是在上述代碼後,加一句計劃任務,

多長時間後的跳轉:

this->scheduleOnce(schedule_selector(InkmooFlash::jumpToMain), 4);

這樣,算好播放一幀多久,總共多少幀,就能夠作成開場動畫啦~。~

***************************************轉載請註明出處: http://blog.csdn.net/lttree******************************************

相關文章
相關標籤/搜索