Creator 提供了 cc.loader.loadRes 这个 API 来专门加载那些位于 resources 目录下的 Asset。和 cc.loader.load 不同的是,loadRes 一次只能加载单个 Asset。调用时,你只要传入相对 resources 的路径即可,并且路径的结尾处 不能 包含文件扩展名。
单个资源加载
音效和音乐的播放控制
/**
* [playEffect description]
* @param {[type]} filename [url]
* @param {[type]} boolean [是否循环 true or false]
* @param {[type]} val [音量]
* @return {[type]} [description]
*/
cc.playEffect=function(filename,boolean,val){
if(parseInt(cc.sys.localStorage.getItem('effect')) == 1){
cc.loader.loadRes('effect/'+filename,cc.AudioClip,function (err,clip){
cc.audioEngine.play(clip,boolean,val);
});
}
},
/**
* [playMusic description]
* @param {[type]} filename [url]
* @param {[type]} boolean [是否循环 true or false]
* @param {[type]} val [音量]
* @return {[type]} [description]
*/
cc.playMusic=function(filename,boolean,val){
if(parseInt(cc.sys.localStorage.getItem('music')) == 1){
cc.loader.loadRes('music/'+filename,cc.AudioClip,function (err,clip){
cc.audioEngine.playMusic(clip,boolean);
cc.audioEngine.setMusicVolume(val);
});
}
}
加载图片,图集,预制体
1.加载图片
// load the sprite frame of (project/assets/resources/imgs/cocos.png) from resources folder
cc.loader.loadRes('Texture/brick_10', cc.SpriteFrame,(err, spriteFrame)=> {
if (err) {
cc.error(err.message || err);
return;
}
this.node.getComponent(cc.Sprite).spriteFrame = spriteFrame;
});
2.加载图集中的 SpriteFrame
// 加载 SpriteAtlas(图集),并且获取其中的一个 SpriteFrame
// 注意 atlas 资源文件(plist)通常会和一个同名的图片文件(png)放在一个目录下, 所以需要在第二个参数指定资源类型
cc.loader.loadRes("Texture/sheep", cc.SpriteAtlas,(err, atlas)=> {
var frame = atlas.getSpriteFrame('sheep_down_0');
sprite.spriteFrame = frame;
});
3.加载预制体
// 加载 Prefab
cc.loader.loadRes("test assets/prefab", function (err, prefab) {
var newNode = cc.instantiate(prefab);
newNode.parent = parentNode; // 将生成的敌人加入节点树
});
资源释放
loadRes
加载进来的单个资源如果需要释放,可以调用 cc.loader.releaseRes
,releaseRes
可以传入和 loadRes
相同的路径和类型参数。
cc.loader.releaseRes("test assets/image", cc.SpriteFrame);
cc.loader.releaseRes("test assets/anim");
此外,你也可以使用 cc.loader.releaseAsset
来释放特定的 Asset 实例。
cc.loader.releaseAsset(spriteFrame);
资源批量加载
cc.loader.loadResDir 可以加载相同路径下的多个资源:
// 加载 test assets 目录下所有资源
cc.loader.loadResDir("test assets", function (err, assets) {
// ...
});
// 加载 test assets 目录下所有 SpriteFrame,并且获取它们的路径
cc.loader.loadResDir("test assets", cc.SpriteFrame, function (err, assets, urls) {
// ...
});
//cc.Gender表示文件名字
cc.loader.loadResDir(cc.Gender, (err, res, url) => {
for (let i = 0; i < res.length; i++) {
cc.bsResMgr.add(url[i], res[i]);
}
});
加载远程资源和设备资源
在目前的 Cocos Creator 中,我们支持加载远程贴图资源,这对于加载用户头像等需要向服务器请求的贴图很友好,需要注意的是,这需要开发者直接调用 cc.loader.load。同时,如果用户用其他方式下载了资源到本地设备存储中,也需要用同样的 API 来加载,上文中的 loadRes 等 API 只适用于应用包内的资源和热更新的本地资源。下面是这个 API 的用法:
// 远程 url 带图片后缀名
var remoteUrl = "http://unknown.org/someres.png";
cc.loader.load(remoteUrl, function (err, texture) {
// Use texture to create sprite frame
});
// 远程 url 不带图片后缀名,此时必须指定远程图片文件的类型
remoteUrl = "http://unknown.org/emoji?id=124982374";
cc.loader.load({url: remoteUrl, type: 'png'}, function () {
// Use texture to create sprite frame
});
// 用绝对路径加载设备存储内的资源,比如相册
var absolutePath = "/dara/data/some/path/to/image.png"
cc.loader.load(absolutePath, function () {
// Use texture to create sprite frame
});
获取和加载资源API