请问 微信平台下 如何动态下载播放spine动画

  • Creator 版本:
    1.9.2

  • 目标平台:
    微信

  • 详细报错信息,包含调用堆栈:

  • 重现方式:

  • 之前哪个版本是正常的 :

  • 手机型号 :

  • 手机浏览器 :

  • 编辑器操作系统 :

  • 编辑器之前是否有其它报错 :

  • 出现概率:

  • 额外线索:

我们是微信小游戏平台
把spine动画打包到那个4m的包体内游戏里播放是没有问题的 但是我们游戏需求 有几十个几M的spine动画 这样打进包里不现实 我们准备进游戏时候下载spine文件 保存到本地然后游戏中播放 但是不知道怎么操作
在creator的demo中找到了new sp._SGSkeletonAnimation(json,atlas,scale)的方式 但是具体实现的时候报错了 看堆栈也没看明白 所以在这里请哪位大牛能给出一个demo 或者请指导下我是哪里操作有问题 具体怎么改

1赞

看看代码,是不是你要的。 loadSpine.js.zip (1.0 KB)

谢谢 我看下

兄弟 有qq或者其他什么联系方式么 我这还是没搞定 :sweat_smile:
不管怎么做都是load spine failed

您好 我现在通过cc.loader.load()方法 获取到了atlas 等几个文件的内容 现在卡在了skeletonData上

我是在fire上先创建了一个简单的sp.Skeleton控件 然后打算游戏进行过程中 动态替换他的skeletonData 但是skeletonData一直没有创建成功 还有我看源码里有个SGSkeleton 不知道这个东西是干啥的 第一次接触creator和js 很多东西不了解 真不好意思:pensive:

搞定了…

简单说下我咋做的吧 虽然可能很简单 相信也有像我这么菜的人会遇到同样的问题
1先把三个文件down下来 保存到微信本地

nameatlas namejson namepng 三个变量是 spine的atlas json 和 png的文件在保存在微信本地的路径 我的是
http://usr/demo.atlas http://usr/demo.atlashttp://usr/demo.png 注意文件名一样
涉及到的微信api是
wx.downloadFile
fileSystemManager.saveFile
fileSystemManager.rename

2 把三个资源都load一下
cc.loader.load(nameatlas,function (err, res) {
res 保存一下 赋值给 this.res_atlas
判断三个是否都load完 执行loadspine()
});
cc.loader.load(namejson,function (err, res) {
res 保存一下 赋值给 this.res_json
判断三个是否都load完 执行loadspine()
});
cc.loader.load(namepng,function (err, res) {
判断三个是否都load完 执行loadspine()
});

3 我抄了下源码的内容 在loadspine() 里执行
this.spine_node 是我在游戏里预设的一个spine 游戏中直接替换skeletonData内容

sp._atlasLoader.setAtlasFile("http://usr/demo.atlas");
let atlas = new sp.spine.TextureAtlas(this.res_atlas, sp._atlasLoader.load.bind(sp._atlasLoader));
var attachmentLoader = new sp.spine.AtlasAttachmentLoader(atlas);
var skeletonJsonReader = new sp.spine.SkeletonJson(attachmentLoader);
let skeletonData = skeletonJsonReader.readSkeletonData(this.res_json);
atlas.dispose(skeletonJsonReader);
this.spine_node.setSkeletonData(skeletonData, true);

然后 执行就好了    
let spComp = this.spine_node.getComponent('sp.Skeleton')
spComp.setAnimation(0, "animation", true);

:sob: 更新版本到了2.0.1 又不能用了

您好 我又来了 creator 2.x版本 怎么做… 我看那的源码全改了
有个 spine-meta文件里面
const Path = require(‘fire-path’) 这个fire-path又是什么鬼
:confused:

大哥,我也来了,需求跟你的一模一样,之前在用 2.0.1 做,找了很久,发现 skeletonData 不能通过 动态加载? :weary:

7504

Can not render dynamic created SkeletonData ,
你最后解决了吗 ?

自己解决了,方案是,本地放一份 a.png , a.atlas , a.json , a 是一套动画,多套动画的 atlas 和 json 是一样的,只是 png 不同,通过更换服务器上的 png 实现换皮效果。

实现如下:

1.本地一定不要把需要动态替换的 skeletonData 拖到场景树上的任何节点上, 否则该 skeletonData 替换 textures 无效 !

  1. 通过 cc.loader.loadRes 加载一个 skeletonData 对象 ,深拷贝一份副本,拷贝除了 textures 以外的所有属性, 保存起来作为模版, textures 属性用一个空对象填充。

  2. 通过 cc.loader.load 下载远程的 png 文件, 深拷贝一份上面创建的模版作为 skeletonData ,将它的 textures[0] 改成 刚才下载的 Texure2D 对象。

  3. 此时的 spine.skeletonData 就是需要的了。

2赞

这个深拷贝是如何实现的,我卡在这里了

大哥,求教,网上深拷贝都用不了

大哥。同求skeletonData的深拷贝

js 对象直接用 a=b 得到的a是b的引用,修改a会影响b。
深拷贝就是创建a为一个空对象,然后遍历b的所有基础属性,赋值给a