cc.loader
存在3個默認Pipeline:
| 管道名 | 功能 |
|---|---|
| assetLoader | 用于加載資源,默認為第一個管道,用于識別資源類型,并確定如何下載它,還有釋放資源 |
| downloader | 用于下載資源,默認為第二個管道, 它用于下載具有多個處理程序的文件:純文本,圖像,腳本,音頻,字體,uuid。 可以使用addDownloadHandlers添加自己的下載功能(自定義下載) |
| loader | 默認情況下為第三個管道。 它用于加載JSON,圖像,plist,fnt,uuid類資源。 您可以使用addLoadHandlers添加您自己的下載功能 |
資源分為本地資源(assets目錄下)與遠程資源兩個種類
加載都是一個異步的過程
在cocos creator中使用代碼加載資源必須要求資源在assets/resources/ 文件夾下
loader.loadRes()使用
loadRes() 有4個參數(shù)
| 參數(shù)列表 | 對應(yīng)功能 |
|---|---|
| url | 資源文件的url地址 |
| type | 如果寫上這個參數(shù)就會只加載該類型的資源 |
| progressCallback(completedCount,totalCount,item) | 當進程更改時調(diào)用的回調(diào)函數(shù) |
| completeCallback(err,ret) | 當資源加載時調(diào)用的回調(diào)函數(shù) |
代碼實現(xiàn)本地加載資源
start () {
this.local_load();//調(diào)用加載函數(shù)
},
local_load:function(){
cc.loader.loadRes("Super",function(err,ret){
if(err){
cc.log(err);
return;
}
else{
cc.log(ret);
this.Audio.clip = ret;
this.Audio.play();
cc.log("正在播放?"+this.Audio.isPlaying); //檢測是否在播放
}
}.bind(this));
cc.loader.loadRes("block",cc.SpriteFrame,function(err,ret){
if(err){
cc.log(err);
return;
}
cc.log("ret = "+ret);
this.SpriteRes.spriteFrame = ret;
//等效于this.SpriteRes.spriteFrame = cc.load.getRes("block",cc.SpriteFrame);
//不過getRes也可以在其他場景繼續(xù)使用
}.bind(this));
},
運行結(jié)果

打印出true結(jié)果就代表聲音正在播放了,并且圖片加載進去了
遠程加載
如果需要從遠程的服務(wù)器中獲取資源,此時需要cc.load.load(url,callback) 與本地加載資源API類似
只不過有一點不同,我們可以傳入一個表{url:xxxx,type:xxx(如:MP3,png)},creator就可以識別出文件類型
cc.loader.load({url: 'http://example.com/getImageREST?file=a.png', type: 'png'}, function (err, tex) {
cc.log('Should load a texture from RESTful API by specify the type: ' + (tex instanceof cc.Texture2D));
});
資源的釋放
場景中的屬性檢查器上有一個自動釋放資源,但是它無法清理代碼加載的資源
如果需要自動清理,可以使用setAutoRelease(url,autoRelease),強制在切換場景時保留或者釋放指定資源
手動釋放資源
| 加載資源類型 | 對應(yīng)釋放 |
|---|---|
loadRes() 本地加載資源 |
使用releaseRes(url,type)釋放資源 |
load() 遠程加載 |
使用release(asset) 釋放資源 |
releaseAsset(asset) |
通過資源對象自身來釋放資源。 |
cc.Class({
extends: cc.Component,
properties: {
// foo: {
// default: null, // The default value will be used only when the component attaching
// to a node for the first time
// url: cc.Texture2D, // optional, default is typeof default
// serializable: true, // optional, default is true
// visible: true, // optional, default is true
// displayName: 'Foo', // optional
// readonly: false, // optional, default is false
// },
// ...
audio: {
type: cc.AudioSource,
default: null,
},
sprite: {
type: cc.Sprite,
default: null,
},
},
// use this for initialization
onLoad: function () {
},
start: function() {
// this.local_load();
this.remote_load();
},
remote_load: function() {
// 加載遠程的圖片 release 卸載資源
cc.loader.load("http://127.0.0.1:6080/splash.png", function(err, ret) {
if(err) {
console.log(err);
return;
}
// ret is cc.Texture2D這樣對象
this.sprite.spriteFrame.setTexture(ret);
this.sprite.node.setContentSize(ret.getContentSize()); // 使用這個圖片的大小
// end
}.bind(this));
// end
// 從服務(wù)器加載mp3來進行播放, type,就是url不帶類型,我們就使用url + type的模式來制定類型
cc.loader.load({url: "http://127.0.0.1:6080/bg.mp3", type: "mp3"}, function(err, ret) {
if (err) {
console.log(err);
return;
}
this.audio.clip = ret;
this.audio.play();
}.bind(this));
// end
// 從服務(wù)器加載json文件
cc.loader.load({url: "http://127.0.0.1:6080/project.json", type: "json"}, function(err, ret) {
if (err) {
console.log(err);
return;
}
console.log(ret);
}.bind(this));
// end
//
cc.loader.load({url: "http://127.0.0.1:6080/test.mydata", type: "mydata"}, function(err, ret) {
if (err) {
console.log(err);
return;
}
console.log(ret);
}.bind(this));
// end
},
local_load: function() {
// 本地加載聲音
// 注意:這里不需要后綴名, assets/resources/這個也不需要 releaseRes卸載資源
cc.loader.loadRes("bg", function(err, ret){
if(err) {
console.log(err);
return;
}
console.log(ret); // audio clip
this.audio.clip = ret;
this.audio.play();
}.bind(this));
// end
// 本地加載圖片
cc.loader.loadRes("img/disk", cc.SpriteFrame, function(err, ret) {
if (err) {
console.log(err);
return;
}
// spriteFrame對象
// 例如我們的游戲,在進入下一個場景之前,有一個資源加載場景,那么到了新的場景后,我們就能夠找到這個加載好的資源
// cc.loader.getRes();
this.sprite.spriteFrame = cc.loader.getRes("img/disk", cc.SpriteFrame);
// end
}.bind(this));
// end
},
// called every frame, uncomment this function to activate update callback
// update: function (dt) {
// },
});