from:http://blog.csdn.net/wuyakenihao/article/details/9305055
在游戏开发中有些资源需要预先加载在内存中这样方便我们在以后的使用。从而加快游戏的速度。特别 是预先从网络上下载资源的更需要一个友好的界面来告诉用户程序正在加载中。这个时候就需要我们做一个loading 界面
废话不多说下面开始讲解思路
1 当加载图片的时候使用 CCTextureCache::sharedTextureCache()->addImageAsync("gmbg/longding.png",this,callfuncO_selector(LoadingLayer::loadCallBack));
这个方法 其中 loadCallBack 是回调函数 当然在使用网络加载图片资源的时候 回调方法也设置成这个 就OK
2 加载特效使用的 是cocos2d-x 中进度条
部分代码如下
- // 添加进度条
- 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);
- this->addChild(pt,2,1);
- #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
- 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;
- } while (0);
- return isRet;
- }
- 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);
- this->addChild(pt,2,1);
- isRet=true;
- } while (0);
- return isRet;
- void LoadingLayer::loadCallBack(CCObject* ped){
- loadingNum++;
- CCProgressTimer* pt=(CCProgressTimer*)this->getChildByTag(1);
- float now=pt->getPercentage();
- pt->setPercentage(100/totalNum+now);
- if(loadingNum<totalNum){
- }else{
- // 加载完的时候跳转到响应的界面
- CCLOG("loading over");
- }
- }
程序写到这里 基本就完成了一个简答的 loading 界面 收工 下面贴出 运行出来的界面
看完上面的代码有些同学可能会疑惑为什么我的 LoadingLayer 继承了 BaseLayer 其实BaseLayer 继承了 CCLayer 我只是我把一些比较通用的东西封装到 这个BaseLayer 中 方便在后面的程序中调用 在以后的程序中这个类可能会逐渐添加一些通用的属性或者方法。
到这里 我们的一个简单的 LoadingLayer 就OK 了 下一节 我将讲解当loading 完毕之后 跳进 游戏的开始 界面 和开始游戏界面的大家,希望大家耐心看。
附上源码连接地址 里面带图片资源 和class 两个 文件夹 覆盖新创建的项目的目录 即可出现 当前效果
其它:
//重新设置锚点
float tex=getWinSize().width/2+getWinOrigin().x;
float tey=getWinSize().height/5+getWinOrigin().y-5;
pt->setPosition(ccp(tex,tey));
//==> 这个是设置坐标点 不是设置锚点
设置锚点是:setAnchorPoint();