效果展示:
步骤如下:
1、创建label和progressTimer;
2、加载资源
3、每加载一张都调用回调函数;首先看下头文件:HelloWorld.h
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__
#include "cocos2d.h"
using namespace cocos2d;
class HelloWorld : public cocos2d::Layer
{
public:
// there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::Scene* createScene();
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// a selector callback
void menuCloseCallback(cocos2d::Ref* pSender);
// implement the "static create()" method manually
CREATE_FUNC(HelloWorld);
void loadingCallback(Ref *pSender);
private:
//进度条
ProgressTimer *timer;
int totolImage;//总图片
int loadImage;//加载图片的总数:
Label* percentLabel;//加载进度label
Label* loadLabel;//显示 loading: 的label
};
#endif // __HELLOWORLD_SCENE_H__
1.创建:
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
//创建显示Loading: 的label
loadLabel = Label::create("Loading:","Arial",30);
loadLabel->setPosition(Point(visibleSize.width/2-30,visibleSize.height/2+30));
this->addChild(loadLabel,1);
//创建显示百分比的label
percentLabel = Label::create("0%","Arial",30);
percentLabel->setPosition(Point(visibleSize.width/2+35,visibleSize.height/2+30));
this->addChild(percentLabel,2);
//设置固定的滑动条上面的精灵:
Sprite *down = Sprite::create("down.png");
down->setScale(2, 2);
down->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2-55));
this->addChild(down);
totolImage = 500;
//初始化进度条,底纹为grass.png
timer = ProgressTimer::create(Sprite::create("grass.png"));
timer->setType(cocos2d::ProgressTimer::Type::BAR);//设置进度条为条形类型
timer->setMidpoint(Vec2(0,1));//设置运动方向
timer->setBarChangeRate(Vec2(1,0));//设置进度条的变化速率
timer->setPercentage(0.0f);//设置进度条的初始百分比为0
timer->setScale(2);
timer->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2));//设置进度条的位置
this->addChild(timer);
//这里我们加载500张的重复图片,这时候季度条会读取慢一点,有利于我们观察:
for(int i = 1;i<=500;i++){
Director::getInstance()->getTextureCache()->addImageAsync("HelloWorld.png", CC_CALLBACK_1(HelloWorld::loadingCallback, this));
}
return true;
}
void HelloWorld::loadingCallback(Ref *pSender){
Size visibleSize = Director::getInstance()->getVisibleSize();
//每进到这个函数一次,让m_loadedSp + 1
loadImage++;
//进度条当前的百分比
float newPercent = 100 - ((float)totolImage - (float)loadImage)/((float)totolImage/100);
//或者ProgressFromTo这种动作来更新进度条
timer->setPercentage(newPercent);//更新进度条
//更定loadLabel的数值
char buf_str[16];
sprintf(buf_str," %d%%",(int)(((float)loadImage / totolImage) * 100));
percentLabel->setString(buf_str);//更新percentLabel的值
//图片加载完成后
if(loadImage == totolImage)
{
//如果你想在进度结束的时候,进入下一个页面,那么你可以移除以下的label和进度条:
//这样有利于内存的利用。
// this->removeChild(timer);
// this->removeChild(percentLabel);
// this->removeChild(loadLabel);
//加载完成后显示开始游戏
MenuItemImage *image = MenuItemImage::create("kaishi.png", "kashi1.png");
image->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2-60));
image->setScale(2, 2);
this->addChild(image);
}
}
这样,我们的一个根据实际情况加载的进度就创建完成了。