DragonBones 部分接口缺失,h5 版和 native 版接口不统一

我们的需求:
在播放 dragonBones 动画时,获取单个 Slot 的位置、旋转、缩放,以及图片大小,从而计算其碰撞体积。用于在横板过关游戏中判断一个角色的拳头是否打中了另一个角色。

遇到的问题:
在 h5 版本中,我们用 armatureDisplay.armature().getSlot(‘xxx’).global 即可获取到单个 Slot 的位置、旋转、缩放。但是在 native 版本却不能。

根据 cocos creator 稳定版(1.8.2)创建 typescript 工程时附带的 creator.d.ts,dragonBones.TransformObject 类会有一个叫做 global 的属性(egret 的文档 http://developer.egret.com/cn/apidoc/index/name/dragonBones.TransformObject 也是这样描述)。

从代码看,js_register_cocos2dx_dragonbones_TransformObject 确实没有名为 “global” 的属性。h5 版和 native 版接口不统一。

另外,dragonBones.AnimationState 的 isCompleted 属性,在 h5 版本可以正确运作,但是在 native 版本却始终返回 true(哪怕动画没有播放完毕),我们也只得改为 animState.playTimes > 0 && animState.getCurrentPlayTimes() >= 1 这样奇怪的写法来绕行。暂时是运行起来没什么问题,但心里也有点方。

希望能修正这些问题,谢谢。

已经自己解决。

过程记录如下:

  1. C++源码 register_all_dragonbones_manual 这里面有定义 global, origin, offset 三个属性到 TransformObject。道理上 Slot 是 TransformObject 的派生类,也应该可以使用这几个属性才对,但是实际测试发现不能使用。

  2. 发现在 js_register_cocos2dx_dragonbones_Slot 函数中,
    auto cls = se::Class::create(“Slot”, obj, nullptr, nullptr);
    这看起来 Slot 并没有从 TransformObject 继承,于是修改为
    auto cls = se::Class::create(“Slot”, obj, __jsb_dragonBones_TransformObject_proto, nullptr);
    但还是不行,单步调试发现运行到此处时,__jsb_dragonBones_TransformObject_proto 的值还是 null

  3. 把 js_register_cocos2dx_dragonbones_Slot 改为在 js_register_cocos2dx_dragonbones_TransformObject 之后调用,于是问题解决了。

使用你的解决方案,能否获取单个slot的图片大小么

https://github.com/cocos-creator/engine-native/pull/3721
你好. 修复在这里, 这么长时间给您造成不便深感抱歉