***************************************轉載請註明出處: 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******************************************