本文要解决的疑问:
帧缓冲池是什么?
动画缓冲池是什么?
动画帧如何按照时间帧片播放?
如果相邻动画帧的时间间隔不相同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分配不同的时间片的数量,那也就完成了不同帧不同时间的播放要求了。