qinning199原创,欢迎转载,转载请注明:http://www.cocos2dx.net/?p=22缓存
1、帧动画动画
你能够经过一系列图片文件,像以下这样,建立一个动画:spa
CCAnimation *animation = CCAnimation::create(); //从本地文件系统中加载图片文件到CCSpriteFrame中区,而后添加到CCAnimation中 for (int i = 1; i < 15; i++) { char szImageFileName[128] = {0}; sprintf(szImageFileName, "Images/grossini_dance_%02d.png", i); animation->addSpriteFrameWithFileName(szImageFileName); } animation->setDelayPerUnit(2.8f / 14.0f); // 这个动画包含14帧,将会持续2.8秒. animation->setRestoreOriginalFrame(true); // 14帧播放完以后返回到第一帧 CCAnimate *action = CCAnimate::create(animation); sprite->runAction(action); // 运行精灵对象
注意CCAnimation是由许多精灵帧组成,能够设置间隔时间,持续时间等,它其实是包含着一组数据。CCAnimate是一个动做,它是经过CCAnimation对象建立。
2、精灵表动画
尽管手工动画很容易理解,但它不多用在游戏开发中。相反的,精灵表动画的方式在2D动画中常用。
这是一个精灵表。它实际上就是一系列动画帧图片,或者是一个能用于一个场景的图片集。
在OpenGLES1.1阶段,精灵表由于如下几点被普遍应用:
一、减小文件读写时间。读取一张图片比读取一堆小文件确定要快。
二、减小内存消耗。OpenGL ES 1.1仅仅可以使用2的几回方大小的图片(也就是宽度或者高度是2,4,864,128,256,512,1024,...)。也就是说,OpenGL ES1.1将会分配给每一个图片2的几回方大小的内存空间,即便你这张图片达不到这样的宽度和高度也会分配大于此图片的2的n次方大小的空间。那么运用这种图片集的方式将会减小内存碎片。
三、减小OpenGL ES绘制调用而且加速渲染。
Cocos2d-x v2.0升级到了OpenGL ES2.0.OpenGL ES2.0不会再分配2的几回方的内存块了,可是减小读取时间和绘制调用的优点依然存在。
那么生成的动画效果如何呢?正如咱们所见,精灵表不是动画的一个必须条件。可是考虑到以上的一些优点,精灵表仍是颇有效率的。在Cocos2dx中,有许多不一样的方式来建立精灵表。
3、经过.png 和 .plist文件建立精灵表
在cocos2dx 0.x和1.x版本中,CCSpriteSheet就是为以上的目的设计。在V2.0中CCSpriteBatchNode替代了CCSpriteSheet。
CCSpriteBatchNode对象包含了全部精灵帧的图片纹理。即便它不会绘制,你也必需要把它添加到场景中,例如:.net
下一步,你须要运用CCSpriteFrameCache实例来确保帧名字对应帧边界。也就是说,图片在哪一块矩形区域中。例如:设计
一旦你的精灵表和帧加载完成,而且精灵表已经被添加到了场景中,你能够经过createWithSpriteFrameName方法来建立精灵。而且经过addChild要添加到精灵表中:xml
createWithSpriteFrameName 方法将会从grossini.plist中找到对应的坐标以及矩形区域,以后再裁剪grossini.png的纹理成一个精灵帧。
如今咱们建立一个CCArray对象而且天剑全部的帧动画进去。在这个动画的例子中,咱们发现全部的14帧都有相同的大小,因此咱们能够用一个嵌套的循环遍历它们,而且当完成添加14帧以后结束掉循环。对象
最后,咱们须要建立一个CCAnimate动做实例来运行CCSprite。下面咱们能够在CCRepeatForever动做中包裹CCAnimate动做来让它一直执行下去,像这样:blog
4、文件动画
CCAnimateCache可以加载一个描述一批节点的xml/plist文件,包括帧名和他们的矩形区域。这个借口很是容易使用。游戏
CCAnimationCache *cache = CCAnimationCache::sharedAnimationCache(); // 缓存在cocos2dx中一直是单例模式 cache->addAnimationsWithFile("animations/animations-2.plist"); CCAnimation animation = cache->animationByName("dance_1"); CCAnimate animate = CCAnimate::create(animation); sprite->runAction(animate);