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
    在这里插入图片描述在这里插入图片描述

在这里插入图片描述

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值