DragonBone 换装

我想把一张图片替换到DragonBone一个图片上,怎么实现??

参考 example 中的 DragonBones 示例:
https://github.com/cocos-creator/example-cases/blob/master/assets/cases/dragonbones/DragonBonesCtrl.js#L249-L258

您好! 我是想用一个图片或者一个骨骼 去替代很多个DragonBone 上面的部位,该如何实现??就比如一把武器所有的角色都能用。

这个功能应该是从制作这些骨骼动画资源时就需要考虑的问题了,建议到 DragonBones 官网 查找解决方案。

左边在 web 上的 右边是cocos 模拟器 ,同样资源代码下显示不一样 。

左右两个武器都会换装。你应该是换装次数不一样才会有这样的效果。
请注意:右边是 6 个武器循环切换。左边是 5个武器循环切换。

问一下,有没有这个demo对应的Dragon工程文件,能结合起来看下

这个 demo 是 DragonBones 官方的 demo 自带的导出资源。所以我们并没有相应的工程文件。

我感觉这个Demo里的换装方式好像比较死,需要替换的部分都是预先放在对应的纹理集合里面的。但是如果我需要替换的图片量比较大,或者说我需要替换的图时动态获取的,咋个弄喃?

“同样代码” , web 是层次显示问题导致的,web 每次换装都是显示最前面的。

嗯?什么意思。没搞懂喃。比如说例子里面的,weapon,我要用一张自己的图片(image.png)给它替换上去咋个弄喃?

我仔细看了一下dragonBones.js,里面关于Slot的注释有这一段儿
是不是说,换装的原理其实就是我们手动的去改变slot的显示对象(我看了一下龙骨官方的一些例子,应该就是这个原理,这是例子的地址龙骨官方换装例子)。Slot又有一个SetDisplay方法,这个应该就是设置显示对象的方法对不对?那位什么我尝试传了一个node进去,却报错。官方能不能做一个动态替换图片小demo发出来嘛,我相信这个也不会需要多少时间。上面的那个例子,是提前在骨骼文件里面做好了相应的子骨骼,局限性太大。

顶一下,同样想知道

嗯,我们会考虑添加一个换装的 demo 到 example 中的。谢谢反馈!

1赞

DragonBones 提供了多种换装解决方案,应对不用的需求:

1.静态换装 vs 动态换装
如果换装的素材是固定的,可以预先放置在插槽里,通过切换插槽的displayIndex实现换装。displayIndex的切换既可以在dbpro中有设计师完成,也可以由程序员通过代码完成。
如果换装的素材是不固定的,需要动态获取资源,可以基于不同的需求从以下两种方法中选择一个:
-需求1:如果要换的图片和原图大小和位置一致,可以通过.slot.display = xxx;实现换一张图,或者直接设置slot.displayList,可以一次换一组序列图。
-需求2:如果要换的图片和原图大小或位置不一致,则需要通过轴点对位避免位置偏移。实现的方法是在DBPro中新建一个基本动画元件,将要换的图片放到该元件中,通过轴点工具设置好轴点,再导出成db的纹理集。换之前需要将这个纹理集加到db的Factory里,并通过factory.replaceSlotDisplay ()实现换装。

2.要换的部位是否包含动画
如果换装的部位不包含动画,则可以使用图片做为换装素材,具体实现方法之前已经说过。
如果换装的部位包含动画,则可以使用子骨架做为换装的素材,API调用方法和换图片是一样的,只不过换进去的是子骨架的显示对象,在引擎层面,图片和子骨架的显示对象都是显示对象,所以处理起来是一样的,唯一不同的是子骨架不需要考虑轴点,也不能重新设置轴点,因为他自身有动画数据相当于已经包含轴点信息。具体实现方案参见db官方案例。

3.局部换vs全部换
之前说的都是局部换装,替换的是纹理集中的一块子纹理,如果希望一次性替换整个纹理集也是支持的。但是纹理集的配置文件不能换(如果配置文件也要换的话,就直接重新构建骨架就好了)
也就是说游戏中可以有一套纹理集配置文件对应多个纹理集图片,实现配置文件不变的情况下换整个纹理集。利用这个技术可以实现例如格斗游戏中同样的角色穿不同颜色的衣服的效果。
也可以实现游戏中的延迟加载。例如纹理集图片较大,加载较慢,可以先构建骨架,填充空纹理集或者替代纹理集,等真正的纹理集加载完毕后再替换。
具体方法参考官方文档。

4.换mesh与mesh换图。
和图片及子骨架一样,mesh也是slot的display,也是可以和图片一样换的。除此之外,mesh还支持在保持布点信息和动画信息不变的情况下切换里面的纹理图。也就是换mesh.texture。方法是调用factory.replaceSlotDisplay()

4赞

嗯,我仔细看了下,确实 web 和 native 的效果有差别。会尽快修复的。谢谢反馈!

想了解下 这个dragon bone 在播放动画时 是否可以得到当前看到的这一帧 比如想用来做个影子 这个影子就是一个精灵 谢谢

想了解下 这个dragon bone 在播放动画时 是否可以得到当前看到的这一帧 比如想用来做个影子 这个影子就是一个精灵 谢谢

没太理解,你是想要让整个 DragonBones 节点停留在指定的帧?还是说需要对这一帧进行截图?

想要某一帧的截图