zoukankan      html  css  js  c++  java
  • cocos2dx动画Animation介绍

    
    一、帧动画
    你能够通过一系列图片文件,像例如以下这样,创建一个动画:
    [cpp]  
    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对象创建。
    二、精灵表动画
    虽然手工动画非常easy理解,但它非常少用在游戏开发中。相反的,精灵表动画的方式在2D动画中常常使用。
    这是一个精灵表。它实际上就是一系列动画帧图片,或者是一个能用于一个场景的图片集。
     
     
    在OpenGLES1.1阶段,精灵表由于下面几点被广泛应用:
    1、降低文件读写时间。读取一张图片比读取一堆小文件肯定要快。
    2、降低内存消耗。OpenGL ES 1.1只可以使用2的几次方大小的图片(也就是宽度或者高度是2,4,864,128,256,512,1024,...)。也就是说,OpenGL ES1.1将会分配给每一个图片2的几次方大小的内存空间,即使你这张图片达不到这种宽度和高度也会分配大于此图片的2的n次方大小的空间。那么运用这种图片集的方式将会降低内存碎片。
    3、降低OpenGL ES绘制调用而且加速渲染。
    Cocos2d-x v2.0升级到了OpenGL ES2.0.OpenGL ES2.0不会再分配2的几次方的内存块了,可是降低读取时间和绘制调用的优势依旧存在。
    那么生成的动画效果怎样呢?正如我们所见,精灵表不是动画的一个必须条件。可是考虑到以上的一些优势,精灵表还是非常有效率的。在Cocos2dx中,有很多不同的方式来创建精灵表。
    三、通过.png 和 .plist文件创建精灵表
    在cocos2dx 0.x和1.x版本号中,CCSpriteSheet就是为以上的目的设计。在V2.0中CCSpriteBatchNode替代了CCSpriteSheet。
    CCSpriteBatchNode对象包括了全部精灵帧的图片纹理。即使它不会绘制,你也必需要把它加入到场景中,比如:
    [cpp]  
    CCSpriteBatchNode* spritebatch = CCSpriteBatchNode::create("animations/grossini.png");  
     
    下一步,你须要运用CCSpriteFrameCache实例来确保帧名字相应帧边界。也就是说,图片在哪一块矩形区域中。比如:
    [cpp]  
    CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();  
    cache->addSpriteFramesWithFile("animations/grossini.plist");  
     
    一旦你的精灵表和帧载入完毕,而且精灵表已经被加入到了场景中,你能够通过createWithSpriteFrameName方法来创建精灵。而且通过addChild要加入到精灵表中:
    [cpp]  
    m_pSprite1 = CCSprite::createWithSpriteFrameName("grossini_dance_01.png");  
    spritebatch->addChild(m_pSprite1);  
    addChild(spritebatch);  
     
     
    createWithSpriteFrameName 方法将会从grossini.plist中找到相应的坐标以及矩形区域,之后再裁剪grossini.png的纹理成一个精灵帧。
     
     
    如今我们创建一个CCArray对象而且天剑全部的帧动画进去。在这个动画的样例中,我们发现全部的14帧都有同样的大小,所以我们能够用一个嵌套的循环遍历它们,而且当完毕加入14帧之后结束掉循环。
    [cpp]  
    CCArray* animFrames = CCArray::createWithCapacity(15);  
    char str[100] = {0};  
      
    for(int i = 1; i < 15; i++)   
    {  
        sprintf(str, "grossini_dance_%02d.png", i);  
        CCSpriteFrame* frame = cache->spriteFrameByName( str );  
        animFrames->addObject(frame);  
    }  
     
    最后,我们须要创建一个CCAnimate动作实例来执行CCSprite。以下我们能够在CCRepeatForever动作中包裹CCAnimate动作来让它一直执行下去,像这样:
    [cpp]  
    CCAnimation* animation = CCAnimation::createWithSpriteFrames(animFrames, 0.3f);  
    m_pSprite1->runAction( CCRepeatForever::create( CCAnimate::create(animation) ) );  
     
    四、文件动画
    CCAnimateCache可以载入一个描写叙述一批节点的xml/plist文件,包含帧名和他们的矩形区域。这个借口很easy使用。
    [cpp]  
    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);  
  • 相关阅读:
    三级菜单的实现方式
    简单登录接口实践
    C++中的set和java的hashset有何区别?
    css 利用文档结构给列表添加样式
    谈谈我对JS中this的理解
    谈谈我对JS原型的理解
    使用node.js,实现简单的JS文件合并小工具
    谈谈我对JS闭包的理解
    谈谈我对JS作用域的理解
    模拟实现 百度翻译 右下方的可折叠的分享按钮列表
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/3806227.html
Copyright © 2011-2022 走看看