cocos2d-x中的动画对象Action无法正常播放

cocos2d-x中的动画对象Action无法正常播放

想不到更有用的标题了,这样应该能被需要帮助的人搜索到(但愿吧)。
懒得以更系统的方式阐述了- -,我就以描述解决实际应用问题的过程解释我碰到的情况,各位可以尽量对号入座。
在我为一个没有父节点的cocos2d中的精灵对象Sprite添加序列帧动画Animate时,该动画不仅没有生效,原先的Sprite还跟着一起消失了。

  1. 出现该问题后自顾自折腾了一阵,无果,向前辈寻求帮助。
  2. 大佬果然是大佬,不到半小时后告诉我:“我这看的时候发现那个Sprite对象被释放掉了,我暂时查不出来为啥。但是你可以改用另一个接口XX,这样就能用了。”
  3. 我当然选择先解决问题以应付策划的无情摧残,然后该问题暂且搁置。
  4. 时隔多日,摸鱼的时候想起这个问题,那自然是先根据大佬曾经告诉我的现象开始查。
  5. cocos2d是基于引用计数设计Node节点内存管理方案的,然后看代码发现该Sprite确实做了retain操作,在一帧结束后Sprite的计数为1,按理说肯定不会被释放。
  6. 自己断点了一下,发现大佬得出了错误的结论,他在debug的时候监视的Sprite对象和我想添加序列帧动画的不是同一个。继续查了下发现Sprite对象仍然存在,那接下来要确认动画是不是播成功了。
  7. 动画管理器ActionManager在每一帧根据pause属性判断是否需要对动画对象进行tick操作,该属性与Node节点的resume方法相关。在每次节点调用onEnter时会调用resume,因此与其绑定的所有Action才能够继续tick
    cocos2d-x中的动画对象Action无法正常播放cocos2d-x中的动画对象Action无法正常播放

cocos2d-x中的动画对象Action无法正常播放

  1. 由于项目历史需求原因,这个Sprite对象没有被添加到任何节点上,因此不会执行onEnter,动画自然就不会播成功了。

  2. 也就是说手动调一下onEnter就行,然而没想到项目的C++代码没有导出这个接口给Lua,大佬当时用了一个小trick直接绕过了Node提供的接口:先通过Node获取到动画管理器ActionManager,然后按照下图的方法直接把节点和动画绑定在一起,只需要把最后一个参数设为true就行。我觉得是真牛逼(我咋就想不到):
    cocos2d-x中的动画对象Action无法正常播放

  3. 至于为啥加了动画之后Sprite会消失,是因为我创建Sprite的方式有问题,导致它的位置信息有误,具体原因和项目有关,我就不展开了。