绝大多数游戏在启动后首先出现的是一个 “载入中” 的场景,此场景的用处是将游戏所需的图片、音乐、数据等资源从存储卡(或磁盘、闪存)读入内存,这样,后面需要用到这些资源时,可以直接从内存读取,以加快游戏的运行,提高流畅性。下面,就对资源的预加载机制做一个介绍。
资源的类型
预加载的目的是为了后续读取的快捷,所以,一般会预加载那些较大较复杂的文件,例如以下这些:
- 单张大图:背景大图
- 合成图:可多幅图片合成的大图,这里我们使用 TexturePacker 合成 plist+png 文件
- 骨骼动画:使用 Cocos Skeletal Animation Editor 创建的骨骼动画文件,ExportJson+plist+png 文件
- 场景:使用 Cocos Studio 创建的 csd 文件
- 声音:ogg 音乐文件
- 本地数据:游戏存档数据(格式为 json 文件)、游戏配置数据(例如关卡、飞机属性、子弹属性等固定的数据,格式为 sqlite 数据库文件)
- 远程数据:由于本游戏是弱联网游戏,所以保存在服务器上的数据不多。这里仅仅实现了用户登录、获取时间的功能
下面,我们将逐一介绍不同资源载入的方法。
加载方法
单张大图
- 定义 std::vector<std::string> m_imageArray,将需要加载的图片路径放到容器中
- 对每个图片逐个调用 Director::getInstance ()->getTextureCache ()->addImageAsync () 函数进行加载,注意他的第二个参数 CC_CALLBACK_1 (Preload::asynLoadingImageDone, this, m_imageArray [i]),当一张图片加载结束后,系统就会调用 Preload::asynLoadingImageDone 函数,同时传入图片的路径作为输入参数。
- 在回调函数 asynLoadingImageDone 中,首先要通知界面加载进度,然后根据图片的总数和待加载数判断是否已经全部记载完成,若全部加载成功,则通知 loadingDone (PreloadType::Image)
详细的代码如下所示:
//1、需要加载的png或jpg
m_imageArray.push_back("BigImg/Bag_Bg.png");
m_imageArray.push_back("BigImg/BigScreen_Bg.png");
m_imageArray.push_back("BigImg/Daily_Bg.png");
m_imageArray.push_back("BigImg/MainUI_Bg.jpg");
void Preload::asynLoadingImage()
{
//2、将图片加入全局cache中
m_iImageCnt = m_imageArray.size();
for (unsigned i = 0; i < m_imageArray.size(); i++)
{
Director::getInstance()->getTextureCache()->addImageAsync(
m_imageArray[i],
CC_CALLBACK_1(Preload::asynLoadingImageDone, this, m_imageArray[i]));
}
}
//3、单张图片加载成功后的回调函数
void Preload::asynLoadingImageDone(Texture2D* texture, const std::string& filename)
{
//通知观察者加载进度
this->notifyProgress(++m_iTmpProgress);
m_iImageCnt--;
//全部加载完成
if (0 == m_iImageCnt)
{
m_bImageLoaded = true;
this->loadingDone(PreloadType::Image);
}
}