cocos creater 之 远程加载spine压缩资源

背景

TODO

资源

TODO

代码

_initSpineNode(path, finishCB, defaultPlayAnimationName){
    
    
        let self = this;
        //this.isRemote = false; /* hard Code 本地测试用 */
        this.isRemote = true
        if(this.isRemote){
    
    
            /* 加载远程资源(zip文件) */            
            let path = ""; /* test Code */
            var promise = new JSZip.external.Promise(function (resolve, reject) {
    
    
                JSZipUtils.getBinaryContent(path, function (err, data) {
    
    
                    if (err) {
    
    
                        elog("mortonNodeSpine.js: 获取远程文件出错");
                        reject(err);
                    } else {
    
    
                        //log(data);
                        resolve(data);
                    }
                });
            });

            promise.then(JSZip.loadAsync)
                .then(function (zip) {
    
    
                    let jsonData  = null;
                    let atlasData = null;
                    let pngData   = null;
                    let pngName   = null;

                    /* 加载资源的回调 */
                    let funcCall = ()=>{
    
    
                        if(jsonData && atlasData && pngData){
    
    
                            log("Spine 加载完成");
                            /* init asset */
                            let asset = new sp.SkeletonData();
                            asset.skeletonJson = JSON.parse(jsonData);
                            asset.atlasText = atlasData;

                            /* 图片 */
                            let image = new Image();
                            image.src = "data:image/png;base64," + pngData
                            image.onload = function () {
    
    
                                /* init texture */
                                var texture = new cc.Texture2D();
                                texture.initWithElement(image);
                                texture.handleLoadedTexture();
                                
                                asset.textures = [texture];                                
                                asset.textureNames = [pngName];

                                self.spineNode = self.addComponent('sp.Skeleton');
                                self.spineNode.skeletonData = asset;

                                /* 设置缺省动作 */
                                self._playDefaultAnimation(defaultPlayAnimationName);

                                if(finishCB){
    
    
                                    finishCB();
                                }
                            }
                        }
                    }

                    /* 解压缩压缩包内的文件 */
                    for (var key in zip.files) {
    
    
                        /* MACOS平台下打包的Zip包会有一些类似于Windows下的thumbs.db,所以需要增加对 "_" 的过滤 */
                        if(key.indexOf(".png") > -1 && key.indexOf("/") <= -1 && key.indexOf("_") <= -1){
    
    
                            pngName = key; /* Spine需要设置textureName,这里记录下 */
                            if (!zip.files[key].dir) {
    
    
                                var base = zip.file(zip.files[key].name).async("base64");
                                base.then(function (res) {
    
    
                                    pngData = res;
                                    funcCall();
                                })
                            }
                        } else if(key.indexOf(".atlas") > -1 && key.indexOf("/") <= -1 && key.indexOf("_") <= -1){
    
    
                            if (!zip.files[key].dir) {
    
    
                                var base = zip.file(zip.files[key].name).async("string");
                                base.then(function (res) {
    
    
                                    atlasData = res;
                                    funcCall();
                                })
                            }
                        } else if(key.indexOf(".json") > -1 && key.indexOf("/") <= -1 && key.indexOf("_") <= -1){
    
    
                            if (!zip.files[key].dir) {
    
    
                                var base = zip.file(zip.files[key].name).async("string");
                                base.then(function (res) {
    
    
                                    jsonData = res;
                                    funcCall();
                                })
                            }
                        }else{
    
    
                            /* 不关心别的类型的文件 */
                        }
                    }
                })
                .then(
                    function success(data) {
    
      
                        // log("success");
                    }, function error(e) {
    
    
                        elog("load Spine: " + e);
                    }
                );
    
        }else{
    
    
            /* 加载本地资源 */
            // let path = "course/mortonSpineTest/hemu-4.5(run)"; /* 测试代码 */
            cc.loader.loadRes(path, sp.SkeletonData,                
                (completeCount, totalCount, item)=>{
    
     
                    /* debug */
                    log("completeCount: %d   totalCount: %d" ,completeCount, totalCount);
                },

                /* 完成回调 */
                (err, res) => {
    
    
                    if (err){
    
    
                        elog("Spine 加载资源出错");
                        return;
                    }

                    self.spineNode = self.addComponent('sp.Skeleton');
                    self.spineNode.skeletonData = res;                    

                    if(res && res.skeletonJson && res.skeletonJson.animations){
    
    
                        this._suppliedAnimations = res.skeletonJson.animations;
                    }

                    // self.spineNode.node.height;
                    // self.spineNode.node.width;

                    // self.setProperty({"scale":-0.1}); // test code OK
                    // self.setProperty({"scaleX":-0.1}); // test code OK
                    
                    //this.setProperty({"scaleY":0.1}); // test code OK
                    //this.setProperty({"rotation":90}); // test code OK

                    // this.setProperty({"width":100}); // test code NG
                    // this.setProperty({"height":200}); // test code NG                    
                    
                    self._playDefaultAnimation(defaultPlayAnimationName); /* 设置缺省动作 */

                    /*  */
                    if(finishCB){
    
    
                        finishCB();
                    }
                }
            );
        }
    },

猜你喜欢

转载自blog.csdn.net/qq_45504161/article/details/113175120