一、 问题背景
有时候,当我们场景上挂载的资源过多时,我们使用cc.director.loadScene切换场景时会等一段时间才会切换过去,这对游戏的体验是相当不好的。所以我们可以使用cc.director.preloadScene来进行预加载,如:https://space.bilibili.com/351545447
cc.director.preloadScene("sceneName", function () {
cc.director.loadScene("sceneName");
});
同时搭载一个加载进度条来实现显示加载进度,优化游戏体验:
二、 如何获取加载时的进度?
- Cocos Creator 2.0版本之前
在Cocos creator 2.0版本之前,我们可以使用下面这样的方法:
cc.loader.onProgress = function (completedCount, totalCount, item){
//先开监听
this.loading.progress = completedCount/totalCount;
this.loadLabel.string = Math.floor(completedCount/totalCount * 100) + "%";
}.bind(this);
cc.director.preloadScene("sceneName", function () {
cc.log("加载成功");
});
备注:loading就是你在脚本中绑定的进度条组件。
- Cocos Creator 2.0版本之后
Cocos creator升级到2.0版本后,onProgress貌似就无法使用了,所以上述那个方法无法获取到加载进度,但是在cc.director.preloadScene这个函数中新增了一个参数:
所以我们可以通过这个参数来获取加载的进度:
cc.director.preloadScene("sceneName", this.onProgress.bind(this), function(){
cc.log("加载成功");
})
**onProgress** :function(completedCount, totalCount, item){
this.loading.progress = completedCount/totalCount;
this.loadLabel.string = Math.floor(completedCount/totalCount * 100) + "%";
}
三、 源码角度分析本质
其实无论是预加载场景还是加载资源,本质调用的还是cc.loader.load这个api,看底层代码可以知道,源码部分截图如下:
- 预加载场景
- 加载资源
而cc.loader.load的内部实现的参数中就是带有这个回调函数的,如下图:
四、 结论
所以我们还可以这样写来获取加载场景的进度:
var info = cc.director._getSceneUuid(this.sceneName);
var self = this;
if (info) {
cc.loader.load({ uuid: info.uuid, type: 'uuid' }, function(completedCount, totalCount, item){
cc.log("已完成Items:" + completedCount);
cc.log("全部Items:" + totalCount);
cc.log("当前Item:" + item.url);
self._loadingNextStep = parseInt(completedCount / totalCount * 100);
cc.log("加载进度:" + self._loadingNextStep);
}, function(error, asset){
if (error) {
cc.errorID(1210, this.sceneName, error.message);
} else {
cc.log("加载完成");
}
}
});
}
网友评论