zoukankan      html  css  js  c++  java
  • Cocos2Dx(4)——动画

    1. Cocos2d-x中动画相关的类。

    1.1 精灵帧类CCSpriteFrame,表示精灵动画中的一帧,通常由贴图定义。

    1.2 精灵缓存类CCSpriteFrameCache,用于缓存精灵帧以提高效率,是单实例模式,所有精灵共享同一个缓存类实例。通过CCSpriteFrameCache::sharedSpriteFrameCache()获得。

    1.3 动画帧类CCAnimationFrame,表示动画中的一帧,通过精灵帧定义

    1.4 动画类CCAnimation,储存一个动画的所有帧,可以通过帧数组定义。并且定义了帧间隔时间。

    1.5 动画缓存类CCAnimationCache,缓存动画和动画帧,是单实例模式,所有动画共享一个i额缓存类实例,通过CCAnimationCache::sharedAnimationCache()获得。

    1.6 动画动作类CCAnimate,继承自CCActionInterval,通过CCAnimation类定义。

    2. 不经过缓存时,创建一个动画的过程。

    (1) 定义精灵帧。

    (2) 使用精灵帧定义动画帧。

    (3) 通过动画帧数组定义动画(也可以直接通过精灵帧数组定义动画)。

    (4) 通过动画定义动画动作,通过精灵执行动画动作播放相应动画。

    示例代码如下:

        //创建精灵帧
        CCSpriteFrame* spriteFrame1 = CCSpriteFrame::create("card1037.png", CCRectMake(0,0, 200,200));
        CCSpriteFrame* spriteFrame2 = CCSpriteFrame::create("card1040.png", CCRectMake(0,0, 200,200));
    
        //通过精灵帧定义动画帧
        CCAnimationFrame* animFrame1 = new CCAnimationFrame();
        CCAnimationFrame* animFrame2 = new CCAnimationFrame();
        animFrame1->initWithSpriteFrame(spriteFrame1, 1, NULL);
        animFrame2->initWithSpriteFrame(spriteFrame2, 1, NULL);
    
        //构建动画帧数组
        CCArray* array = CCArray::createWithCapacity(15); 
        array->addObject(animFrame2);
        array->addObject(animFrame1);
    
        //通过动画帧数组定义动画
        CCAnimation *animation = CCAnimation::create(array, 0.2f);
      //也通过精灵帧数组直接定义动画
      //CCAnimation::createWithSpriteFrame(array, 0.2f);
    //通过动画定义动画动作 CCAnimate *animate = CCAnimate::create(animation);//精灵执行动画动作 CCSprite *ani_sprite = CCSprite::create(); ani_sprite->setPosition(ccp(size.width/2, size.height/2)); ani_sprite->runAction(CCRepeatForever::create(animate));

    3. 通常将精灵帧和动画提前缓存起来可以提高程序效率,相关操作主要是将精灵帧加入缓存和从缓存中取精灵帧。

    在定义精灵帧的时候将精灵帧加入缓存,addSpriteFrame():

    CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFrame(spriteFrame1, "frame_1");

    需要时从缓存中获取精灵帧,spriteFrameByName():

    array->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("frame_1"));

    定义动画时将动画加入动画缓存,addAnimation():

    CCAnimationCache::sharedAnimationCache()->addAnimation(animation, "duke");

    需要时从缓存读取动画,animationByName():

    CCAnimate *animate = CCAnimate::create(CCAnimationCache::sharedAnimationCache()->animationByName("duke"));

    3. 通常可以将多个帧的图片使用工具压缩到一个图片中,使得代码只需要加载一次,通常使用Texture Packer工具(http://www.codeandweb.com/texturepacker);

    使用CCSpriteFrameCache从文件中读取动画相关图片信息:

    framCache->addSpriteFramesWithFile("beauty/beauty.plist");

    其中.plist是由Texture Packer工具处理图片产生的,存储了动画图片的自定义信息。

    //从plist文件中读取帧信息并放到精灵帧缓存
        framCache->addSpriteFramesWithFile("beauty/beauty.plist");
    
        //精灵帧数组
        CCArray* array = CCArray::createWithCapacity(15); 
        for (int i = 1;i<=10;i++)
        {
            sprintf(frameName, "beauty%02d.png", i);
            CCSpriteFrame* frame = framCache->spriteFrameByName(frameName);
            CCAnimationFrame *aniFrame = new CCAnimationFrame();
            aniFrame->initWithSpriteFrame(frame, 1, NULL);
            array->addObject(frame);
        }
    
        //精灵帧数组直接定义动画
        CCAnimation *animation = CCAnimation::createWithSpriteFrames(array, 0.1f);
    
        //定义动画动作
        CCAnimate *animate = CCAnimate::create(animation);
    
        //精灵执行动作
        CCSprite *ani_sprite = CCSprite::create();
        ani_sprite->setPosition(ccp(size.width/2, size.height/2));
        ani_sprite->runAction(CCRepeatForever::create(animate));
  • 相关阅读:
    进阶之路 | 奇妙的Drawable之旅
    进阶之路 | 奇妙的Animation之旅
    进阶之路 | 奇妙的四大组件之旅
    Laravel
    Laravel 入门
    面试:给我说说你平时是如何优化MySQL的?
    EXPLAIN 查看 SQL 执行计划
    常见的图文布局
    常见的图文布局
    CSS3 的 filter(滤镜) 属性
  • 原文地址:https://www.cnblogs.com/litterrondo/p/3098839.html
Copyright © 2011-2022 走看看