Cocos2dx 3.0 過渡篇(十)資源加載進度條Loading...
尊重原創,轉載請注明來自:star特530的CSDN博客 https://blog.csdn.net/start530/article/details/19420317
本來這篇博文是昨晚就要寫的,可是因為今早要去參加考駕照相關的體檢,而我最害怕的就是視力沒能達到5.0,畢竟這階段對著屏幕的時間過久。
所以呢,昨晚我幾乎沒碰電腦,沒玩手機,早睡早起。體檢順利通過!首先,我要說的是:這次我要寫的主題是進度條。 額,等等,先收起你手裏憤怒的西瓜刀。我也才知道TestCpp也有這個例子啊。不過TestCpp裏的隻有label的變化,而我的多加了個進度條。
請容我對我的這種手段取個好聽的名稱:畫龍點睛!
恩,步驟如下:
1、創建label和progressTimer;
2、加載資源,每加載一張都調用回調函數;
3、加載完成,進入新的界麵。
首先看下頭文件:HelloWorld.h
- #ifndef __HELLOWORLD_SCENE_H__
- #define __HELLOWORLD_SCENE_H__
- #include "cocos2d.h"
- class HelloWorld : public cocos2d::Layer
- {
- public:
- HelloWorld():m_numSp(20),m_loadedSp(0),loadProgress(NULL){};
- static cocos2d::Scene* createScene();
- virtual bool init();
- void loadingCallback(Object* pSender);//加載一張圖片完成後跳轉的毀掉函數
- void gotoNewLayer();//加載完後的跳轉函數
- CREATE_FUNC(HelloWorld);
- private:
- cocos2d::ProgressTimer* loadProgress;//進度條
- cocos2d::LabelTTF* percentLabel;//加載進度label
- cocos2d::LabelTTF* loadLabel;//顯示 loading: 的label
- int m_numSp;//要加載的精靈數目,初始化為 20 張
- int m_loadedSp;//已加載的精靈數目
- };
- #endif // __HELLOWORLD_SCENE_H__
1、創建
- Size visibleSize = Director::getInstance()->getVisibleSize();
- Point origin = Director::getInstance()->getVisibleOrigin();
- loadLabel = LabelTTF::create("Loading:","Arial",20);//創建顯示Loading: 的label
- loadLabel->setPosition(Point(visibleSize.width/2-30,visibleSize.height/2+30));
- this->addChild(loadLabel,1);
- percentLabel = LabelTTF::create("0%","Arial",20);//創建顯示百分比的label
- percentLabel->setPosition(Point(visibleSize.width/2+35,visibleSize.height/2+30));
- this->addChild(percentLabel,2);
- auto loadBg = Sprite::create("sliderTrack.png");//進程條的底圖
- loadBg->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
- this->addChild(loadBg,1);
- loadProgress = ProgressTimer::create(Sprite::create("sliderProgress.png"));//創建一個進程條
- loadProgress->setBarChangeRate(Point(1,0));//設置進程條的變化速率
- loadProgress->setType(ProgressTimer::Type::BAR);//設置進程條的類型
- loadProgress->setMidpoint(Point(0,1));//設置進度的運動方向
- loadProgress->setPosition(Point(visibleSize.width/2,visibleSize.height/2));
- loadProgress->setPercentage(0.0f);//設置初始值為0
- this->addChild(loadProgress,2);
2、加載圖片
- //加載20張圖片,每加載完一張就調用回調函數:loadingCallback
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld1.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld2.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld3.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld4.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld5.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld6.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld7.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
- Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png",this,callfuncO_selector(HelloWorld::loadingCallback));
3、圖片加載後的回調函數:
- void HelloWorld::loadingCallback(Object* pSender)
- {
- ++m_loadedSp;//每進到這個函數一次,讓m_loadedSp + 1
- char buf_str[16];
- sprintf(buf_str,"%d%%",(int)(((float)m_loadedSp / m_numSp) * 100),m_numSp);
- percentLabel->setString(buf_str);//更新percentLabel的值
- float newPercent = 100 - ((float)m_numSp - (float)m_loadedSp)/((float)m_numSp/100);//計算進度條當前的百分比
- //因為加載圖片速度很快,所以就沒有使用ProgressTo,
- //或者ProgressFromTo這種動作來更新進度條
- loadProgress->setPercentage(newPercent);//更新進度條
- //圖片加載完成後
- if(m_loadedSp == m_numSp)
- {
- this->removeChild(loadProgress);//將添加的幾個對象刪除掉
- this->removeChild(percentLabel);
- this->removeChild(loadLabel);
- //加載完既要跳轉到gotoNewLayer,在這裏可以
- //創建新的Scene,新的Layer,或者其他什麼亂七八糟的
- this->gotoNewLayer();
- }
- }
4、進入新的界麵
- void HelloWorld::gotoNewLayer()
- {
- auto size = Director::getInstance()->getWinSize();
- auto sp = Sprite::create("HelloWorld.png");//用之前加載到緩存中的圖片,創建一個精靈。
- sp->setPosition(Point(size.width/2,size.height/2));
- this->addChild(sp,1);
- }
因為代碼裏注釋都寫的挺詳細的,所以我也就不說太多廢話了。
恩,寫完了。這篇是下班後加班寫的,外麵又下了大雨,我要趕緊衝回去吃飯了。風一般的男紙。
尊重原創,轉載請注明原址:https://blog.csdn.net/start530?viewmode=contents
最後更新:2017-04-03 12:56:12