背景
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();
}
}
);
}
},