【已解决】[求助] - cocos2d-js如何进行文件读写?缓存服务器图片如何操作?

知道一个cc.loader

但不知道如何写文件

另外,如果从服务器请求一个图片进行展示,该如何进行呢?

盼复,谢谢!

好像可以通过cc.assetsManager来更新资源到本地

关于文件读写,只知道cc.loader来读

读写该如何弄?
加载一个URL图片又该如何弄呢?

文件的读取和使用,你直接引用具体的文件链接就可以了,不跨域的话,都很简单。加入资源列表,引擎会发起文件请求,然后你直接引用就可以了。

你如果要读写,具体的需求是啥?

感谢回复

因为APP中,有个要求是动态加载服务器上的图片,比如用户头像。

我是新手,所以只知道从本地图片文件加载精灵,因此以为需要把用户头像放到本地,再进行展示。

但这样,同步用户头像的方式似乎也不好。

所以,我想知道,如何将服务器上的图片(URL),展示在场景中

谢谢

1楼的兄弟已经回复你了呀,如果是你APP所对应的自己的缓存服务器集群里的图片,那一般都不是跨域的,你直接引用图片地址就行了。要是跨域了,好像就得去把文件拿到本地再加载了。

谢谢回复。

我测试时,在网页上是可以的,但是编译成原生app,比如cocos compile -p android
图片加载不了

能否进一步提供一下我这方面的思路?

其实,举个例子:
把我服务器上的某个URL图片:http://www.网站.com/abc.png
展示到app中(浏览器、app都可以展示)

最后仍然使用了assetsmanager解决了问题
谢谢大家相助

楼主好,最后你加载服务器图片具体是如何实现的,2.2.3版本可以吗?
谢谢啦!

我用的是cocos2d-js 3.0 beta

Step 1: 准备需要同步的在线资源

这里准备三个东西

第一个东西:http://127.0.0.1:3000/res/,里面放置需要同步的资源,比如:http://127.0.0.1:3000/res/update.log
第二个东西:http://127.0.0.1:3000/res/project.manifest,里面放置同步的详细信息
第三个东西:http://127.0.0.1:3000/res/version.manifest,里面放置同步的版本信息

project.manifest文件内容:


{
    "packageUrl" : "http://127.0.0.1:3000/res",
    "remoteManifestUrl" : "http://127.0.0.1:3000/res/project.manifest",
    "remoteVersionUrl" : "http://127.0.0.1:3000/res/version.manifest",
    "version" : "1.0.0",
    "groupVersions" : {
        "1" : "1.0.1"
    },
    "engineVersion" : "3.0 beta",

    "assets" : {
        "update" : {
            "path" : "update.log",
            "md5" : "a529eb05b181477c2b0aa7fc3f9d3967",
            "group" : "1"
        }
    },

    "searchPaths" : 
    ]
}

version.manifest文件内容:


{
    "packageUrl" : "http://127.0.0.1:3000/res",
    "remoteManifestUrl" : "http://127.0.0.1:3000/res/project.manifest",
    "remoteVersionUrl" : "http://127.0.0.1:3000/res/version.manifest",
    "version" : "1.0.0",
    "groupVersions" : {
        "1" : "1.0.1"
    },
    "engineVersion" : "3.0 beta"
}

Step 2: 项目中建立同步文件

路径:res/project.manifest,内容如下:


{
    "packageUrl" : "http://127.0.0.1:3000/res",
    "remoteManifestUrl" : "http://127.0.0.1:3000/res/project.manifest",
    "remoteVersionUrl" : "http://127.0.0.1:3000/res/version.manifest",
    "version" : "1.0.0",
    "groupVersions" : {
        "1" : "1.0.0"
    },
    "engineVersion" : "3.0 beta",

    "searchPaths" : 
    ]
}

注意groupVersions里面的版本号,比Step 1中的要低

Step 3: 在resource.js里面添加配置,方便程序中调用

路径:src/resource.js,文件内容:


var res = {
    ...
    Project_manifest : "res/project.manifest"
    ...
};

Step 4: 编写同步代码

路径:src/AssetsManager.js,文件内容:


var AssetsManagerLoaderScene = cc.Scene.extend({
    _am:null, //同步管理器
    _progress:null, //一个LabelTTF,显示同步进度
    _percent:0, //同步百分比
    run:function(){
        var layer = new cc.Layer();
        this.addChild(layer);

        this._progress = new cc.LabelTTF.create("0%", "Arial", 12);
        this._progress.x = cc.winSize.width / 2;
        this._progress.y = cc.winSize.height / 2 + 50;
        layer.addChild(this._progress);

        // 获取存储路径,我在MAC下测试时,结果是在~/目录里
        //如果放手机上测试,应该在手机存储卡里(待测试)
        var storagePath = (cc.fileUtils ? cc.fileUtils.getWritablePath() : "/");

        //如果是浏览器访问的,直接跳过更新
        //因为如果是Web方式访问,资源可以直接用URL进行创建
        //比如:cc.Sprite.create("http://127.0.0.1:3000/res/abc.jpg");
        if(cc.sys.browserType){
            cc.director.runScene(new NextScene());
            return;
        }

        //创建同步管理器,其中res.Project_manifest就是上面resource.js中设置的路径
        //storagePath就是上面获取的存储路径,资源将会自动同步到这个目录
        this._am = new cc.AssetsManager(res.Project_manifest, storagePath);
        this._am.retain();

        //下面这一堆代码,就是同步过程,通过事件监听方式,作对应的操作
        if (!this._am.getLocalManifest().isLoaded())
        {
            cc.log("Fail to update assets, step skipped.");
            cc.director.runScene(new NextScene());
        }
        else
        {
            var that = this;
            var listener = new cc.EventListenerAssetsManager(this._am, function(event) {
                    var scene;
                    switch (event.getEventCode()){
                        case cc.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST:
                            cc.log("No local manifest file found, skip assets update.");
                            cc.director.runScene(new NextScene());
                            break;
                        case cc.EventAssetsManager.UPDATE_PROGRESSION:
                            that._percent = event.getPercent();
                            break;
                        case cc.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST:
                        case cc.EventAssetsManager.ERROR_PARSE_MANIFEST:
                            cc.log("Fail to download manifest file, update skipped.");
                            cc.director.runScene(new NextScene());
                            break;
                        case cc.EventAssetsManager.ALREADY_UP_TO_DATE:
                        case cc.EventAssetsManager.UPDATE_FINISHED:
                            cc.log("Update finished.");
                            cc.director.runScene(new NextScene());
                            break;
                        case cc.EventAssetsManager.ERROR_UPDATING:
                            cc.log("Asset update error: " + event.getAssetId() + ", " + event.getMessage());
                            cc.director.runScene(new NextScene());
                            break;
                        default:
                            break;
                }
            });

            cc.eventManager.addListener(listener, 1);

            this._am.update(); //开始同步

            cc.director.runScene(this);
        }
        this.schedule(this.updateProgress, 0.5);
    },
    updateProgress:function(dt){
        this._progress.string = "" + this._percent;
    },
    onExit:function(){
        cc.log("AssetsManager::onExit");
        
        this._am.release();
        this._super();
    }
});

谢谢楼主,
我看到你写的浏览器访问跳过?真的吗?
我2.2.3用cc.Sprite是无法直接加载图片链接的,不管有没有跨域

本域试过了,应该是没问题的,比如我调试时的地址是:

http://127.0.0.1:63342/MyDemo/index.html

我有张图片是:res/CloseNormal.png

访问地址是:

代码中是:
var sp = cc.Sprite.create(“http://127.0.0.1:63342/MyDemo/res/CloseNormal.png”);
this.addChild(sp);

测试是可以显示的。

如果跨域的话,Web服务器设置一下header的Access-Control-Allow-Origin,我想应该也是可以的,不过没测试过

神奇!!
竟然今天同一域名下就成功了:3:

还是谢谢楼主,之后遇到跨域问题再试着你的方法!

我刚测试了一下跨域,也是没有问题的。

我在我的node.js中加入了一个跨域设置:

app.use(function(req, res, next){
res.header(“Access-Control-Allow-Origin”, “*”);
return next();
});

然后用:cc.Sprite(“http://外域地址/res/image.png”);
是可以正常创建的

谢谢楼主耐心解答!万分感谢! :855:

还是遇到跨域的问题:12:
我本域的JSON传递了跨域的图片链接,图片还是无法显示出来啊
这样设置似乎不起作用的啊?!用的是PHP:6:

你好, 我也想问问js的文件读取与保存,
比如我的cocos2d-js android平台 通过
cc.loader.loadImage(URL, function ( res, texture) {
得到texture,
把玩家的默认头像ImageView换成这个texture之后
如何把这个texture存到本地文件里面?
});

还有, 如何存储其他的明文到本地文件?

— Begin quote from ____

引用第2楼seanlin于2014-06-18 00:09发表的 :
文件的读取和使用,你直接引用具体的文件链接就可以了,不跨域的话,都很简单。加入资源列表,引擎会发起文件请求,然后你直接引用就可以了。

你如果要读写,具体的需求是啥? http://www.cocoachina.com/bbs/job.php?action=topost&tid=207112&pid=981096

— End quote

那跨域要怎么办呢,前提是不能修改跨域配置文件。

怎么放到本地的cache中的

cocos 2d-js 实现对文件的移动删除操作