天天看点

coco2d-x分析之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