小白问题:cocos2d-js 3.12 大家是如何读取数据资源的,比如JSON

cocos2d-js 3.12 大家是如何读取数据资源的,比如JSON格式的数据资源,希望大牛不吝赐教!

cc.loader.loadJson 是异步的,这样处理起来不是很理想,或者大家有什么好的方案,可以传授一下吗?

这么久都没有人回答 ???

同是小白帮顶

那你就游戏开始或者进入场景前用loadJson加载了再进入游戏、场景。接下来就同步使用了。

进入场景了加载了,可是怎么同步使用呀?我想存到一个全局变量里,不会搞了。。。

下面接口都是直接查cpp代码的,js不一定能用.

首先需要获取到文件内容
var content = cc.fileUtils.getStringFromFile(‘mayuyu.json’)
fileUtils在native的时候好像叫做jsb, 具体的不记得了

然后将json转为object
var obj = JSON.stringify(content);

首先谢谢回复!
cc.fileUtils 是原生平台才有的API,但是在web引擎中已经被删除了

var FortInfo = [];
MyStructMgr.initFortInfo = function ()
{
cc.loader.loadJson( resJSON.FortJson ,function(err,data){
if( err )
{
console.log(“JSON-ERR:” +err );
}
else
{
for( var i in data )
{
var Info = {};
Info.nType = data[i].index;
Info.nScore = data[i].fortscore;
Info.needdiamond = data[i].needdiamond;
Info.framename = data[i].framename;
FortInfo.push( Info );
}
}

});

};

给你一套思路吧,这种加载一般需要在一个专门的资源加载场景里做

    // 全局的静态数据, static data
    sd = sd || {}
    
    var LoadingScene = cc.Scene.extend({
        _progress: undefined,   // 加载进度(最大100代表加载完毕)
        
        _JSON_PROGRESS: 20,     // json占的加载进度
        _OTHERS_PROGRESS: 80,   // 可能还需要加载其他的资源, 例如图片, 音乐
        
        ctor: function(){
            this._progress = 0
        }
        
        onEnter: function(){
            cc.loader.loadJson("res/sdMonster.json", function(err, sdMonster){
                if (err){
                    // 加载数据失败的处理
                    return    
                }
                
                sd.sdMonster = sdMonster    // 保存怪物的静态数据, 可以在任意地方访问
                _progress += _JSON_PROGRESS
                checkProgress()
            })
        },
        
        checkProgress: function(){
            if (this._progress >= 100){
                // 资源加载完毕, 可以进入下一个界面了
                cc.director.replaceScene(new anotherScene())
            }
        }
    })

首先感谢回复。有个疑问哦:
FortInfo里的数据全是push进去的,那取的时候怎么知道哪个是我想要的值呢?我也有想过用这个思路,不过我试着用对象存储的,不过因为是异步的,也不是很方便存储。

好的,谢谢回复,我再想想

var Info = {};
Info.nType = data[i].index;
Info.nScore = data[i].fortscore;
Info.needdiamond = data[i].needdiamond;
Info.framename = data[i].framename;
FortInfo.push( Info );

实际上push的Info 是一个字典,可以获取这个字典并根据属性如nType来获取相应的数据

直接写成js文件就好了。。。

我的游戏客户端基本上没脚本,只有一个initScene.js,每次游戏开始都是从服务器下载脚本,图片文件热更新都是cc.loader进行的
因为之前用游戏框架的热更新,android是热更新下来文件后不会执行,ios没问题,于是自己重新写热更新,连服务器IP都是更新获取,不怕被封IP,呵呵