cocos2d-x CCAnimate 动画播放时间帧问题

本文探讨了cocos2d-x中动画帧播放时间帧的问题,包括帧缓冲池、动画缓冲池的概念,以及如何处理时间间隔不相同的动画帧。详细解释了CCSpriteFrameCache、CCAnimationCache的工作原理,以及CCActionInterval如何根据时间差进行动画播放。通过理解delayUnits和delayPerUnit参数,可以实现不同帧的不同播放时间需求。
摘要由CSDN通过智能技术生成

本文要解决的疑问:

  帧缓冲池是什么?

  动画缓冲池是什么?

  动画帧如何按照时间帧片播放?

  如果相邻动画帧的时间间隔不相同cocos2d-x如何来处理?

  至于其他的如何用plist文件初始化动画缓冲池很简单,但是你得自己研究源代码

  先来解决第一个问题。CCSpriteFrameCache。里面用一个CCDictionary (m_pSpriteFrames)存放了很多的CCSpriteFrame对象。他的key就是plist里面读取出来的。注意默认名字对应的是textures中包含的每张图片的名字,有可能带后缀。所以,我很不喜欢这个key,建议cocostudio以后增加修改key的功能。CCSpriteFrame是什么呢?他就是用来指定该帧对应对应纹理图中的位置信息。其实把他说成一个Cache不合适,充其量只是一种包装了的容器。不过既然人家这样命名,我觉得可能后期会扩展一些利用LRU或者别的算法清除不用的SpriteFrame。至于CCSpriteFrameCache里面的其他函数,就是用来解析plist文件的。

  再来解决第二个问题。CCAnimationCache。里面同样也是一个CCDictionary(m_pAnimations)存放了很多的CCAnimation(里面是CCAnimationFrame)对象。既然有了CCSpriteFrame对象,为什么还得再要一个CCAnimationFrame对象呢?如果只用CCSpriteFrame,那你的每个帧的时间片信息存放到哪里啊?为什么不把时间片信息放到CCSpriteFrame里面呢?这里cocos2d-x设计的非常好。万一你针对同一个帧需要多个不同的播放时间片,这种情况就完美解决了。注意CCAnimationFrame的初始化函数 bool initWithSpriteFrame(CCSpriteFrame* spriteFrame, float delayUnits, CCDictionary* userInfo);第二个参数delayUnits。他并不是一个时间。原文的解释how many units of time the frame takes。因为COCOS2D-X的CCActionInterval播放的原理就是把一个序列的动画分成了时间片相同的动画帧。如果相邻的动画帧时间不相同,就分配不同的delayUnits。我们把一个序列(例如游戏中某个角色的某个方向8帧或者10帧的动画称作是序列)CCAnimationFrame放到一个CCArray中,然后再去创建成一个CCAnimation,这样这个方向的序列动画帧就初始化了一个对象。这里需要再说明的就是CCAnimation的CCAnimation* create(CCArray *arrayOfAnimationFrameNames, float delayPerUnit, unsigned int loops); 这个函数的delayPerUnit,这个值就是时间片的概念。他就一个以秒为单位的一个时间。同样称为CCAnimationCache也为时过早了点。不过相信官方后期还会在里面加入伸缩信息。

   再来解决第三个问题。直接从CCActionInterval::step(float dt)这里说起。dt参数就是上一次调用这个函数和本次调用该函数的时间差。单位是秒。CCActionInterval播放序列动画就是以时间片为单位来进行播放的。这里的时间片就是创建CCAnimation的时候放进去的那个值。读者明白了这些恐怕也就明白了为什么在该函数里面有this->update(MAX(0,MIN(1,m_elapsed/MAX(m_fDuration,FLT_EPSILON))) 去让CCAnimate执行update操作了。

   至于最后一个问题 只要给每个CCAnimationFrame分配不同的时间片的数量,那也就完成了不同帧不同时间的播放要求了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值