#引擎版本 2.4.2 ###
##新项目可能用到spine下载远端纹理然后换装,了下论坛并没有能用于生产环境的帖子,那就自己造轮子咯。
###感谢 帖子 里面提供换装的思路
##需要的知识点:2.0JSB自动绑定
#修改步骤
1.先了解帖子里面关于换装的代码逻辑。(ps:web上已经可以使用了,原生上需要hack一下。)
2.修改c++ 源码
2.1在SkeletonRenderer类增加函数loadTextureForSpine(函数实现: 帖子已经有了)
2.2在SkeletonCacheAnimation类中同上操作。()
SkeletonRenderer 对应spine realTime模式; SkeletonCacheAnimation对应另外2个模式。
3.通过工具 /Resources/cocos2d-x/tools/tojs/genbindings.py 生成中间的侨联文件 (ps:需要一些工具 具体参考 /Resources/cocos2d-x/tools/bindings-generator/README.md )
4. 生成文件后,编辑模拟器便于调试:打开工程/Resources/cocos2d-x/tools/simulator/frameworks/runtime-src/proj.ios_mac/simulator.xcodeproj 编译模拟器即可(ps:这是mac工程 window找对应的工程)
#js 使用方式
var path = 远端图片url地址;
cc.assetManager.loadRemote(path,cc.Texture2D,function (err,texture) {
if (cc.sys.isNative) {
var medTex = new middleware.Texture2D();
medTex.setRealTextureIndex(0);//参数随便设置的没怎么研究
medTex.setPixelsHigh(texture.height);
medTex.setPixelsWide(texture.width);
medTex.setNativeTexture(texture.getImpl());
spineComp._nativeSkeleton.loadTextureForSpine(slotName,medTex);
}else {
//web不赘述了
}
})
##到这一步,如果不出错在模拟器上已实现换装了
##是不是觉得已经完事?太native了。
#解决下一个问题:缓存问题。
##认真测试一下,其实可以发现如果共用一个sp.SkeletonData,其中一个实例换装了,其他实例也换装了。
###这里提供一个解决思路:
####通过运行时复制指定sp.SkeletonData数据来避免缓存问题
var spdata = spineComp.skeletonData;//spineComp某个sp.Skeleton组件
var copy = new sp.SkeletonData()//拷贝一份纹理,避免重复纹理缓存
cc.js.mixin(copy,spdata)
copy._uuid = spdata._uuid+"_"+Date.newDate().getTime()+"_copy";//增加一个时间戳 读取到毫秒应该不会重复吧?
var old = copy.name;
var newName = copy.name+'_copy'
copy.name = newName;
copy.atlasText = copy.atlasText.replace(old,newName)
copy.textureNames[0] = newName+'.png'
copy.init && copy.init()
spineComp.skeletonData = copy;//重新设置一下数据
##现在换装应该ok了。
#Ps:存在的问题:毕竟只是demo测试代码,没有测试过,释放复制出来的资源释是否需要对资源计数+1。