最近想写一个游戏,也算是对之前学习的知识的一个应用吧,于是找了一下网上的资料,就学习了一下 ,
原文地址出处http://bbs.9ria.com/thread-242089-1-1.html 这里有源码下载,但是我觉得仔细的分析一下,对于
真正到了想提前加载大量图片的时候,可以通过创建多个CCTextureCache对象调用loadCallback函数和并创建多个Sprite对象添加进场景中,大概代码如下:
但是这样进度条读取还是会非常快,所以基本上很多图片时才会用得到loadingScene
原文地址出处http://bbs.9ria.com/thread-242089-1-1.html 这里有源码下载,但是我觉得仔细的分析一下,对于
初学者是很有好处的,以下是我的个人的分析:
BaseLayer.cpp
#include "BaseLayer.h" //根据原作者所说,这个类主要是将CCScene类的一些方法进行了再封装以方便使用
USING_NS_CC;
CCScene* BaseLayer::scene(){ //该类是返回基础场景的
CCScene* scene=CCScene::create(); //创建场景
BaseLayer* layer= BaseLayer::create(); //创建基础层
scene->addChild(scene); //将层添加进入场景这里应该是addChild(layer);
return scene;
}
bool BaseLayer::init(){ //基础场景初始化
bool isRet=false;
do
{
CC_BREAK_IF(!CCLayer::init()); //判断场景是否初始化,如果初始化失败则返回false,如果成功返回true
isRet=true;
} while (0);
return isRet;
}
CCSize BaseLayer::getWinSize(){ //得到屏幕尺寸
return CCDirector::sharedDirector()->getVisibleSize();
}
CCPoint BaseLayer::getWinOrigin(){ //得到初始坐标
return CCDirector::sharedDirector()->getVisibleOrigin();
}
LoadingLayer.h
#ifndef __LOADING_LAYER_H__
#define __LOADING_LAYER_H__
#include "BaseLayer.h"
class LoadingLayer:public BaseLayer{
public:
virtual bool init();
CREATE_FUNC(LoadingLayer);
static cocos2d::CCScene* scene();
void loadCallBack(cocos2d::CCObject* ped);// 异步加载图片时 的回调函数
LoadingLayer();
private:
int loadingNum;//用来记录当前的加载图片的数量
int totalNum;// 一共要加载的图片数量
bool setUpdateView();// 用来初始化页面的 基本的纹理
};
#endif
LoadingLayer.cpp
#include "LoadingLayer.h"
USING_NS_CC;
bool LoadingLayer::init(){
bool isRet=false;
do
{
CC_BREAK_IF(!BaseLayer::init()); //判断基础场景是否初始化
CC_BREAK_IF(!this->setUpdateView()); //判断是否成功进行异步加载图片
CCTextureCache::sharedTextureCache()->addImageAsync("gmbg/longding.png",this,callfuncO_selector(LoadingLayer::loadCallBack));
isRet=true; //使用纹理缓冲器异步加载图片,当前用的背景是longding.png,同时进行回调函数的加载
} while (0); //如果成功则返回true
return isRet;
}
CCScene* LoadingLayer::scene(){ //返回当前加载场景
CCScene* scene=CCScene::create();
LoadingLayer* layer=LoadingLayer::create(); //将层添加进场景中
scene->addChild(layer);
return scene;
}
void LoadingLayer::loadCallBack(CCObject* ped){ //加载回调函数,由于这个示例只加载一个图片资源,所以一次就跳转
loadingNum++; //
CCProgressTimer* pt=(CCProgressTimer*)this->getChildByTag(1); //通过tag取得进度条对象
float now=pt->getPercentage();
pt->setPercentage(100/totalNum+now);
if(loadingNum<totalNum){
}else{
// 加载完的时候跳转到响应的界面 ,这里应该就是可以跳转到其他场景的地方
CCLOG("loading over");
}
}
LoadingLayer::LoadingLayer(){ //构造函数初始化加载总数为1,正加载数为0
this->loadingNum=0;
this->totalNum=1;
}
bool LoadingLayer::setUpdateView(){ //
bool isRet=false;
do
{
// 设置进度条的背景图片 我们把他放到屏幕下方的1/5处
CCSprite* loadbackimg=CCSprite::create("gmbg/lodingbg.png");
CC_BREAK_IF(!loadbackimg);
loadbackimg->setPosition(ccp(getWinSize().width/2+getWinOrigin().x,getWinSize().height/5+getWinOrigin().y));
this->addChild(loadbackimg,1);//添加背景精灵
// 添加进度条
CCSprite* loadimg=CCSprite::create("gmbg/longding.png");
CC_BREAK_IF(!loadimg);
CCProgressTimer* pt = CCProgressTimer::create(loadimg);
pt->setType(kCCProgressTimerTypeBar);// 设置成横向的
//可以看作是按矩形显示效果的进度条类型
pt->setMidpoint(ccp(0,0));
// 用来设定进度条横向前进的方向从左向右或是从右向左
pt->setBarChangeRate(ccp(1,0));
//重新设置锚点
float tex=getWinSize().width/2+getWinOrigin().x;
float tey=getWinSize().height/5+getWinOrigin().y-5;
pt->setPosition(ccp(tex,tey));
pt->setPercentage(0); //初始化百分百为0
this->addChild(pt,2,1);//原方法为addChild(CCNode *pNode,int zOrder,int tag)
isRet=true;
} while (0);
return isRet;
}
真正到了想提前加载大量图片的时候,可以通过创建多个CCTextureCache对象调用loadCallback函数和并创建多个Sprite对象添加进场景中,大概代码如下:
HelloWorld::HelloWorld():m_nNumberOfSprites(20),m_nNumberOfLoadedSprites(0)
{
}
这里有20个图片
//加载图片到Cache...每加载一次就调用我们自己写的回调函数
CCTextureCache::sharedTextureCache()->addImageAsync("img/bg.png", this, callfuncO_selector(HelloWorld::loadingCallBack));
CCTextureCache::sharedTextureCache()->addImageAsync("img/01.png", this, callfuncO_selector(HelloWorld::loadingCallBack));
CCTextureCache::sharedTextureCache()->addImageAsync("img/02.png", this, callfuncO_selector(HelloWorld::loadingCallBack));
//回调函数
void HelloWorld::loadingCallBack(CCObject *obj)
{
++m_nNumberOfLoadedSprites;//每调用一次就+1
char tmp[10];
//这里格式化,因为我们只加载了20张图片,所以除以总数后就是0.05,所以每加载一次就涨5%
sprintf(tmp,"%%%d",(int)(((float)m_nNumberOfLoadedSprites / m_nNumberOfSprites) * 100));
m_pLabelPercent->setString(tmp);//重设标签的内容
CCSprite *s1 = CCSprite::create("img/01.png");
CCSprite *s2 = CCSprite::create("img/02.png");
CCSprite *s3 = CCSprite::create("img/03.png");
CCSprite *s4 = CCSprite::create("img/04.png");
CCSprite *s5 = CCSprite::create("img/05.png");
CCSprite *s6 = CCSprite::create("img/06.png");
this->addChild(s1);
this->addChild(s2);
this->addChild(s3);
this->addChild(s4);
但是这样进度条读取还是会非常快,所以基本上很多图片时才会用得到loadingScene