相信有很多的Cocos2dx的初学者在制作游戏时会遇到场景中的资源加载过多的话就会引起游戏进入的时候很卡的问题,因为那是游戏在一边加载图片一边显示图片。为了解决这个问题,给玩家一个流畅的游戏体验,我们需要将我们的游戏资源在游戏的正式开始前就尽量多的加载到游戏缓存中,下面我们就了解一下如何将资源预先加载到游戏缓存中:
1.要将我们需要用到的资源打包。
所使用工具:TexturePacker
将图片打包成plist文件,好处是可以降低Cocos2d游戏渲染的次数,因为我们Cocos2d引擎渲染是根据图片的纹理来渲染的,如果两张图片的纹理一样,那么他只需要渲染一次,我们可以将多张不同的图片通过打包将他们的纹理改成一致,从而降低我们的游戏渲染次数,提高我们的游戏性能。
2.实现资源的异步加载。
资源异步加载的方法:(TextureCache类)
在这个类中有一个addImageAsync的方法。
void TextureCache::addImageAsync(const std::string &path,const std::function<void(Texture2D*)>&callback);
这个方法有两个参数,第一个参数是个path,也就是文件的地址,第二个参数是个funnction就是一个回调函数。
具体函数如下:
首先是头文件
<pre name="code" class="cpp">/*
* LoadingScene.h
*
* Created on: 2016年4月23日
* Author: Administrator
*/
#ifndef LOADINGSCENE_H_
#define LOADINGSCENE_H_
#include <cocos2d.h>
#include <SimpleAudioEngine.h>
#include "BeginScene.h"
USING_NS_CC;
class LoadingScene: public cocos2d::Layer {
public:
static cocos2d::Scene*createScene();
virtual bool init();
CREATE_FUNC(LoadingScene)
;
private:
Sprite *loadSprite;
//场景切换
void nextScene(float dt);
//加载图片资源
void loadingTextureCallBack(Texture2D*texture);
//加载音频
void loadingAudio();
//清除缓存
void onExit();
//初始化用户数据
int _count;
std::thread* _loadingAudioThread;
};
#endif /* LOADINGSCENE_H_ */
Cpp文件
<pre name="code" class="html">/*
* LoadingScene.cpp
*
* Created on: 2016年4月23日
* Author: Administrator
*/
#include "LoadingScene.h"
#include "GlobalDefine.h"
USING_NS_CC;
using namespace CocosDenshion;
Scene*LoadingScene::createScene() {
auto scene = Scene::create();
auto layer = LoadingScene::create();
scene->addChild(layer);
return scene;
}
bool LoadingScene::init() {
if (!Layer::init()) {
return false;
}
loadSprite = Sprite::create("Loading.png");
loadSprite->setPosition(Vec2(WINSIZE.width/2,WINSIZE.height/2));
auto rotate = RotateBy::create(1.0f, 360);
loadSprite->runAction(RepeatForever::create(rotate));
this->addChild(loadSprite);
_count = 0;
// 图片和声音的异步加载
// 主界面
//开始页面资源
Director::getInstance()->getTextureCache()->addImageAsync(
"LittleBeeUI/BeginLayer.png",
CC_CALLBACK_1(LoadingScene::loadingTextureCallBack, this));
//通用资源
Director::getInstance()->getTextureCache()->addImageAsync(
"LittleBeeUI/GeneralUI.png",
CC_CALLBACK_1(LoadingScene::loadingTextureCallBack, this));
_loadingAudioThread = new std::thread(&LoadingScene::loadingAudio, this);
return true;
}
void LoadingScene::loadingTextureCallBack(Texture2D * texture) {
switch (_count++) {
case 0:
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(
"LittleBeeUI/BeginLayer.plist", texture);
break;
case 1:
SpriteFrameCache::getInstance()->addSpriteFramesWithFile(
"LittleBeeUI/GeneralUI.plist", texture);
this->schedule(schedule_selector(LoadingScene::nextScene), 1, 1, 1);
break;
default:
break;
}
}
void LoadingScene::loadingAudio() {
log("loadingAudio");
//初始化音乐
aduioEngine->preloadBackgroundMusic("Sound/Music_BG.mp3");
//初始化音效
aduioEngine->preloadEffect("Sound/Button.mp3");
}
void LoadingScene::nextScene(float dt) {
Director::getInstance()->replaceScene(
TransitionFade::create(2.0f, BeginScene::createScene()));
}
void LoadingScene::onExit() {
Layer::onExit();
_loadingAudioThread->join();
CC_SAFE_DELETE(_loadingAudioThread);
this->unschedule(schedule_selector(LoadingScene::nextScene));
}
通过回调函数增加count,从而使资源文件依次加载...