cocosjs 读取图片_Cocos2d-js 开发记录:图片数据资源等的异步加载

这里说的是在需要的使用加载图片,比如游戏中的某个关卡的图片,不用在游戏一开始就加载(万一用户玩不到那关,岂不是很冤,流量费了那么多),否则载入速度也慢。这种方式加载资源要用到cc.loader官方文档上有介绍(http://www.cocos2d-x.org/docs/manual/framework/html5/v3/cc-loader/zh),主要有

loadJs

loadJsWithImg

loadTxt

loadBinary

loadImg

loadJson

文档给出了一个例子如下:

cc.loader.loadTxt("res/a.txt", function(err, data){if(err) return console.log("load failed");//success

});

可见loadTxt中的第二个是一个回调函数(等待ajax数据返回后调用),文档中对启动load系列函数参数都没有说,其实都是如此,回调函数第一个参数表示是否有错误发生(成功的话是null),第二个参数data表示本次请求返回的数据(不同load系列函数会对返回数据进行一个解析,就是解析的结果了,比如loadImg)。其实第一次看文档的时候没看到这段示例代码,全是回调函数只有一个参数的示例代码,当时我就想啊,尼玛这异步调用数据怎么取啊?文档也不说一声,只好去看源码,开源的好处就是这样,以下是loadBinary的代码:

/**

* Load binary data by url.

* @function

* @param {String} url

* @param {Function} [cb]*/cc.loader.loadBinary= function(url, cb) {var self = this;var xhr = this.getXMLHttpRequest(),

errInfo= "load " + url + " failed!";

xhr.open("GET", url, true);if (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent)) {//IE-specific logic here

xhr.setRequestHeader("Accept-Charset", "x-user-defined");

xhr.onreadystatechange= function() {if (xhr.readyState == 4 && xhr.status == 200) {var fileContents = cc._convertResponseBodyToText(xhr["responseBody"]);

cb(null, self._str2Uint8Array(fileContents));

}elsecb(errInfo);

};

}else{if (xhr.overrideMimeType) xhr.overrideMimeType("text\/plain; charset=x-user-defined");

xhr.οnlοad= function() {

xhr.readyState== 4 && xhr.status == 200 ? cb(null, self._str2Uint8Array(xhr.responseText)) : cb(errInfo);

};

}

xhr.send(null);

};

cc.loader._str2Uint8Array= function(strData) {if (!strData)return null;var arrData = newUint8Array(strData.length);for (var i = 0; i < strData.length; i++) {

arrData[i]= strData.charCodeAt(i) & 0xff;

}returnarrData;

};

可以看到这里对回调函数的调用:

xhr.readyState == 4 && xhr.status == 200 ? cb(null, self._str2Uint8Array(xhr.responseText)) : cb(errInfo);

再来给出一个自己的使用实例(加载游戏关卡的参数和图片):

/*helper function to fetch level data using ajax*/

var fetch_level = function(level, callback, callback_data) {

cc.loader.loadJson("api/level/" + level, function(x, new_level_data) {

cc.log("fetch level json data:", new_level_data);

current_level_data=new_level_data;

cc.loader.loadImg(current_level_data.photo,function(x, img) {

cc.log("fetch level photo img:", img);

current_level_data.img=img;if (!!callback) {

callback(callback_data);

}

})

})

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值