最近用CCTextureCache的函数addImageAsync方法实现了异步加载资源,其中也参考了testcpp中的代码。下面直接上代码。
在init方法里
bool TestScene::init()
{
CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile("netload.plist","netload.png");
CCArray *arr = CCArray::create();
char str[64]={0};
//圆圈加载动画
for (int i = 1; i < 13; i++)
{
sprintf(str,"netload_%02d.png",i);
CCSpriteFrame* frame = cache->spriteFrameByName(str);
arr->addObject(frame);
}
CCAnimation* animation = CCAnimation::createWithSpriteFrames(arr,0.1f);
CCAnimate* animate = CCAnimate::create(animation);
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint visibleOrigin = CCDirector::sharedDirector()->getVisibleOrigin();
CCSprite* sprite = CCSprite::createWithSpriteFrameName("netload_01.png");
sprite->setPosition(ccp(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y+visibleSize.height/2));
sprite->runAction(CCRepeatForever::create(CCAnimate::create(animation)));
addChild(sprite);
//下面使用addImageAsync 来实现进度条,加载界面。
CCSprite* pbg = CCSprite::create("jindu1.png");
pbg->setPosition(ccp(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y + 20));//进度条的背景
pbg->setAnchorPoint(ccp(0.5,0));
addChild(pbg);
p1 = CCProgressTimer::create(CCSprite::create("jindu2.png"));
p1->setType(kCCProgressTimerTypeBar);
p1->setPosition(ccp(visibleOrigin.x+visibleSize.width/2,visibleOrigin.y + 20));
p1->setAnchorPoint(ccp(0.5,0));
p1->setMidpoint(ccp(0,0)); //设置进度条走的开始位置。
p1->setBarChangeRate(ccp(1,0));// 用来设置进度条动画方向的,(1,0)表示横方向,(0,1)表示纵方向。
p1->setPercentage(0);
addChild(p1);
char fileName[256] = {0};
for (int i = 1; i < 13; i++)
{
sprintf(fileName,"loading_%02d.png",i);
CCTextureCache::sharedTextureCache()->addImageAsync(fileName,this,callfuncO_selector(TestScene::loadCallback));
}
ttf = CCLabelTTF::create("loading 0%","Arial",24);
ttf->setPosition(ccp(visibleOrigin.x + visibleSize.width/2,visibleOrigin.y + visibleSize.height - 20));
addChild(ttf);
return true;
}
其中,addImageAsync方法添加资源,参数中有一个回调函数,意思是每加载一个资源调用一次,上面调用了loadCallback函数。
loadCallback 函数:
void TestScene::loadCallback(CCObject* pSender)
{
static int num = 0;
num++;
int p = (int)(((float)num / RESOURCE_NUM) * 100);
p1->setPercentage(p);
char tmp[50]={0};
sprintf(tmp,"loading %%%d", p);
ttf->setString(tmp);
if (num == RESOURCE_NUM )//资源加载完了,可以在这里进行场景的切换),这里只是把加载完的资源简单显示出来。
{
CCNode* node = getParent();
CCSprite* sprite = CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey("loading_01.png"));
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint visibleOrigin = CCDirector::sharedDirector()->getVisibleOrigin();
sprite->setAnchorPoint(ccp(1,0));
sprite->setPosition(ccp(visibleOrigin.x + visibleSize.width - 20,visibleOrigin.y + 20));
node->addChild(sprite);
//this->removeFromParentAndCleanup(true);//这是把这层从父节点中删除(
}
}
这里num如果和资源总数RESOURCE_NUM相等了,说明所有资源都已经加载完了。
效果图:未加载完: (这里所有图片资源来自于网上的游戏,只用于学习)
加载完:
为了以后方便查看,源码下载。