资源不只是可以通过编辑器绑定获取.
其实他还可以使用代码来动态加载.
cc.loader
1.它有3个默认的Pipeline(管道):
(1)assetLoader:主要用于加载资源,加载asset类型资源和释放这些资源
(2)downloader:主要用于下载文件,文本,图像,脚本,声音,字体,自定义的download
(3)loader:第三个是默认的Pipeline可以加载json,image,plist,fnt,uuid;
2.资源分为本地(assets目录下)和远程资源
3.加载分为同步和异步, cc.Loader加载资源是 异步的
本地资源加载
1在代码里加载资源必须要求资源放在assets/resources文件夹下
因为这是一种优化策略:根据场景的依赖关系来打包我们的资源
就是说你这个资源用到了,他才打包,如果没用到他就不打包.
这样能够节省资源,去掉无用的资源, 在代码里使用随时有可能去掉
他认为不用的资源,但是无法判断在代码里加载的资源是哪些,
所以使用一种方案,所有resources目录下的资源都会被打包进去.
所以资源你不在代码里加载的,不要放在resources目录下.
2加载的时候资源url不需要加assets/resources这个部分
3.cc.loader.loadRes(url,onComplete回调函数)
4.loadResArray([],type类型,progressCallback,completeCallback);
5.loadResDir(url[type][progressCallback][completeCallback])
他是加载一个路劲下的资源
6getRes(url,[type]); 获取资源id
加载播放一个声音mp3 第二个参数是加载完成的回调函数
加载完后在回调函数里进行播放即可.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
local_load: function (){
//本地加载声音
//第一个参数是url 不要后缀名
cc.loader.loadRes( "bgFight" , function (err,prefab){
if (err){
//这里就是有错误发生
console.log(err);
return ;
}
//这里就是没出错 并且输出他的信息
console.log(prefab);
//因为他是一个audio Clip
this .audio.clip = prefab;
//播放
console.log( "播放" );
this .audio.play();
}.bind( this ));
},
|
加载图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
local_load: function (){
//和声音不同 这里要写加载的类型
cc.loader.loadRes( "texture/powered" ,cc.SpriteFrame,
function (err,pre){
//加载资源的回调函数
if (err){
//这里就是有错误发生
console.log(err);
return ;
}
//否则这里就是spriteFrame对象
console.log(pre);
this .spr.spriteFrame = pre;
}.bind( this ));
}
|
获取资源getRes 例如一个游戏,在进入下一个场景之前,有一个场景
加载资源,那么到了新的场景之后,我们就找到这个加载好的资源
远程资源加载
1 cc.loader.load(url,结束回调函数);
使用互联网上 或者远程部署的图片
2 cc.loader.load({url"",type""},结束回调函数);
3 远程加载任意类型文件
去百度一张图片 或者自己搭建一个web服务器
1
2
3
4
5
6
7
8
9
10
11
12
|
//远程加载
cc.loader.load( "http://game.people.com.cn/NMediaFile/2015/1029/MAIN201510290900000533552743089.jpg"
, function (err,ret){
//他没有type 他返回的是cc.Texture2D对象
if (err){
console.log(err);
return ;
}
//因为这个返回的是 cc.Texture2D的对象
//所以需要调用这个设置一下
this .spr.spriteFrame.setTexture(ret);
}.bind( this ));
|
成功加载了但是他变得很小,如果想用原始大小呢
只需要设置精灵大小为这个 texture2D的大小即可 使用他默认大小
1
|
this .spr.node.setContentSize(ret.getContentSize())
|
从服务器加载一个mp3播放,有可能你的url没有后缀名,
使用第二种方法 ,就可以指定type啦,有后缀名也可以指定
1
2
3
4
5
6
7
|
cc.loader.load({url: "http://127.0.0.1:8001/asdbp.mp3" ,type: "mp3" },
function (err,ret){
console.log( "播放" );
this .audio.clip = ret;
this .audio.play();
}.bind( this ));
|
加载json数据
1
2
3
4
5
6
|
cc.loader.load({url" , function (err,ret){
console.log(ret);
}
) |
就是说你想要什么类型 只要在type添加就行
1
|
cc.loader.load({url "http://127.0.0.1:8001/psonsetn.abced" ,type: "abced" } ,
|
资源卸载
1.每个场景有个自动释放资源,勾选上这个场景的资源会自动释放,
不勾选上这个场景的资源不释放.
还有个延时加载资源:他的作用是如果关闭,那这个场景间接或直接递归
依赖的所有资源都将被加载,全部加载后才会触发场景切换.
如果开启:
这个场景直接或间接依赖的所有贴图,粒子和声音都将被延迟到场景
切换后才加载,使场景加载速度极大提升,同时,玩家进入场景后可能会
看到一些资源陆续显示出来,并且激活,这种方式适合网页游戏.
注意,spine和TieldMap依赖的资源永远都不会被延迟加载.
2.代码加载的资源,默认是不会收这个选项的影响的,除非设置
setAutoRelease(url,bool)
使用这个 API 可以在单个资源上改变这个默认行为,
强制在切换场景时保留或者释放指定资源。
3.手动释放资源
loadRes/releaseRes
load/release
releaseAsset(资源对象的object)
我加载一个图片,异步加载好后 立刻释放, 然后5秒之后
在显示图片,他就显示不出来了,因为他被释放掉了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
local_load: function (){
//和声音不同 这里要写加载的类型
cc.loader.loadRes( "texture/powered" ,cc.SpriteFrame,
function (err,pre){
//加载资源的回调函数
if (err){
//这里就是有错误发生
console.log(err);
return ;
}
////////////异步加载好后 立刻释放
cc.loader.releaseRes( "texture/powered" ,cc.SpriteFrame);
//否则这里就是spriteFrame对象
console.log(cc.loader.getRes( "texture/powered" ),cc.SpriteFrame);
}.bind( this ));
this .scheduleOnce( function (){
this .spr.spriteFrame =
cc.loader.getRes( "texture/powered" ,cc.SpriteFrame);
}.bind( this ),5);
|
本文转自超级极客51CTO博客,原文链接:http://blog.51cto.com/12158490/2066813,如需转载请自行联系原作者