【首先吐槽一下:对于Cocos creator,一方面自己对相关知识不太熟悉,但是另一方面cocos creator 的api文档也太不完善了,想实现对Json文件进行数据读写的功能花了我一天时间。还好,最终在cocos中文网引擎开发人员和某个牛人的帮助下把问题解决了!!如果cocos creator 的文档在不完善,对于新入门的人真是个煎熬!】 下面直接贴代码。
由于cocos creator官方文档没有完善的文件数据读写api,所以只能用cocos2d-js的 jsb.fileUtils类,相关内容可以自己去查找。以下是api链接:
http://cocos2d-x.org/docs/api-ref/js/v3x/symbols/jsb.fileUtils.html#getStringFromFile
首先是Json文件的读取:
//load()方法,数据文件必须放到resources下
cc.loader.load(cc.url.raw('resources/data.json'), function(err,res){
if (err) {
cc.log(err);
}else{
let list=res;
cc.log("load:");
cc.log("list:"+list.name);
}
});
//louadRes()方法,默认路径就是resources
cc.loader.loadRes('data', function(err,res){
if (err) {
cc.log(err);
}else{
let list=res;
cc.log("loadRes:");
cc.log("list:"+list.sex);
}
});
注意:当使用以上代码还报文件不存在或Download text failed的错,那就要检查下资源管理器里是不是有两个resources文件夹,其中一个是最近新建的,另一个可能是以前新建的但是被删除过,但是删除不彻底,因为cocos creator里面的资源都是有一个唯一标识的uuid,所以,还必须找到E:\Projects\你的项目\library\uuid-to-mtime.json这个文件,在里面找到之前的resources文件uuid,先剪切放到文本文件,然后保存uuid-to-mtime.Json,重启软件,看是否能进去,不能的话再把剪切出来的uuid复制回去,在重启就可以了。
//writeToFile()写入数据到文件,存储格式为xml,不是Json格式
if(cc.sys.isNative) {
cc.log("Path:"+jsb.fileUtils.getWritablePath());
cc.log( jsb.fileUtils.writeToFile({"new":"value"},jsb.fileUtils.getWritablePath()+'data.json'));
cc.log("fullPathForFilename:"+jsb.fileUtils.fullPathForFilename("resources/data.json"));
}
//writeStringToFile()写入数据到文件,存储格式为json,读取数据用load()方法
cc.log("writeStringToFile:"+jsb.fileUtils.writeStringToFile('{"a":"b","c":"d"}', jsb.fileUtils.getWritablePath()+'kk.json'));
cc.log("getValueMapFromFile:"+JSON.stringify(jsb.fileUtils.getValueMapFromFile(jsb.fileUtils.getWritablePath()+"kk.json")));
var arry=JSON.stringify(jsb.fileUtils.getStringFromFile(jsb.fileUtils.getWritablePath()+"kk.json"));
cc.log("arry:"+arry);
cc.loader.load(jsb.fileUtils.getWritablePath()+"kk.json", function(err,res){
if (err) {
cc.log(err);
}else{
let list=res;
cc.log("list:"+list.a);
}
});
相关参考:http://www.dubox.org/archives/225.html
cc.sys.localStorage.setItem(key, value)
上面的方法需要两个参数,用来索引的字符串键值 key
,和要保存的字符串数据 value
。
假如我们要保存玩家持有的金钱数,假设键值为 gold
:
cc.sys.localStorage.setItem('gold', 100);
对于复杂的对象数据,我们可以通过将对象序列化为 JSON 后保存:
userData = {
name: 'Tracer',
level: 1,
gold: 100
};
cc.sys.localStorage.setItem('userData', JSON.stringify(userData));
cc.sys.localStorage.getItem(key)
和 setItem
相对应,getItem
方法只要一个键值参数就可以取出我们之前保存的值了。对于上文中储存的用户数据:
var userData = JSON.parse(cc.sys.localStorage.getItem('userData'));
当我们不再需要一个存储条目时,可以通过下面的接口将其移除:
cc.sys.localStorage.removeItem(key)
对于单机游戏来说,对玩家存档进行加密可以延缓游戏被破解的时间。要加密存储数据,只要在将数据通过JSON.stringify
转化为字符串后调用你选中的加密算法进行处理,再将加密结果传入 setItem
接口即可。
您可以搜索并选择一个适用的加密算法和第三方库,比如 encryptjs, 将下载好的库文件放入你的项目,存储时:
var encrypt=require('encryptjs');
var secretkey= 'open_sesame'; // 加密密钥
var dataString = JSON.stringify(userData);
var encrypted = encrypt.encrypt(dataString,secretkey,256);
cc.sys.localStorage.setItem('userData', encrypted);
读取时:
var cipherText = cc.sys.localStorage.getItem('userData');
var userData=JSON.parse(encrypt.decrypt(cipherText,secretkey,256));
注意 数据加密不能保证对用户档案的完全掌控,如果您需要确保游戏存档不被破解,请使用服务器进行数据存取。