zoukankan      html  css  js  c++  java
  • [Cocos2d-x v3.x]序列帧动画

     

    简单介绍

    Cocos2d-x中。动画的详细内容是依靠精灵显示出来的,为了显示动态图片,我们须要不停切换精灵显示的内容。通过把静态的精灵变为动画播放器从而实现动画效果。

    动画由帧组成,每一帧都是一个纹理,我们能够使用一个纹理序列来创建动画。

    我们使用Animation类描写叙述一个动画,而精灵显示动画的动作则是一个Animate对象。

    动画动作Animate是精灵显示动画的动作。它由一个动画对象创建,并由精灵运行。



    创建方法

    - 手动加入序列帧到Animation类
    - 使用文件初始化Animation类

    手动加入

    手动加入的方法须要将每一帧要显示的精灵有序加入到Animation类中。并设置每帧的播放时间,让动画可以匀速播放。另外。还要通过`setRestoreOriginalFrame`来设置是否在动画播放结束后恢复到第一帧。创建好Animation实例后。须要创建一个Animate实例来播放序列帧动画。



    复制代码
    1. auto animation = Animation::create();
    2.     for( int i=1;i<15;i++)
    3.     {
    4.         char szName[100] = {0};
    5.         sprintf(szName, "Images/grossini_dance_%02d.png", i);
    6.         animation->addSpriteFrameWithFile(szName);
    7.     }
    8.     // should last 2.8 seconds. And there are 14 frames.
    9.     animation->setDelayPerUnit(2.8f / 14.0f);
    10.     animation->setRestoreOriginalFrame(true);
    11.     auto action = Animate::create(animation);
    12.     _grossini->runAction(Sequence::create(action, action->reverse(), NULL));


    在创建Animation实例时会用到下面几个接口:

    - `addSpriteFrame`,加入精灵帧到Animation实例
    - `setDelayUnits`。设置每一帧持续时间,以秒为单位
    - `setRestoreOriginalFrame`,设置是否在动画播放结束后恢复到第一帧
    - `clone`。克隆一个该Animation实例

    文件加入

    首先我们来了解下须要用到的AnimationCache类。

    AnimationCache能够载入xml/plist文件,plist文件中保存了组成动画的相关信息,通过该类获取到plist文件中的动画。



    在使用AnimationCache类时会用到下面几个接口:

    - `addAnimationsWithFile`。加入动画文件到缓存,plist文件
    - `getAnimation`,从缓存中获取动画对象
    - `getInstance`。获取动画缓存实例对象

    使用文件加入的方法仅仅需将创建好的plist文件加入到动画缓存里面。plist文件中包括了序列帧的相关信息。

    再用动画缓存初始化Animation实例,用Animate实例来播放序列帧动画。

    复制代码
    1. auto cache = AnimationCache::getInstance();
    2.     cache->addAnimationsWithFile("animations/animations-2.plist");
    3.     auto animation2 = cache->getAnimation("dance_1");
    4.     auto action2 = Animate::create(animation2);
    5.     _tamara->runAction(Sequence::create(action2, action2->reverse(), NULL));


    `注意:`3.0開始。Cocos2d-x使用getInstance来获取单例实例。

    动画缓存(AnimationCache)

    通常情况下,对于一个精灵动画。每次创建时都须要载入精灵帧,按顺序加入到数组,再创建相应动作类,这是一个很烦琐的计算过程。对于使用频率高的动画。比方走路动画。将其加入缓存能够有效减少每次创建的巨大消耗。

    因为这个类的目的和缓存内容都很easy直接。所以其接口也是最简单了的。例如以下所看到的:

    - static AnimationCache* getInstance(),全局共享的单例
    - void addAnimation(Animation *animation, const std::string& name),加入一个动画到缓存
    - void addAnimationsWithFile(const std::string& plist)。加入动画文件到缓存
    - void removeAnimation(const std::string& name),移除一个指定的动画
    - Animation* getAnimation(const std::string& name),获得事先存入的动画

    `建议:`在内存警告时我们应该增加例如以下的清理缓存操作:

    复制代码
    1. void releaseCaches()
    2. {
    3. AnimationCache::destroyInstance();
    4. SpriteFrameCache::getInstance()->removeUnusedSpriteFrames();
    5. TextureCache::getInstance()->removeUnuserdTextures();
    6. }


    值得注意的是清理的顺序,我们推荐先清理动画缓存。然后清理精[灵帧缓存](https://github.com/chukong/cocos-docs/blob/master/manual/framework/native/v3/spriteframe-cache/zh.md),最后是[纹理缓存](https://github.com/chukong/cocos-docs/blob/master/manual/framework/native/v3/texture-cache/zh.md)。

    依照引用层级由高到低。以保证释放引用有效。

  • 相关阅读:
    n年的一次聚会
    maven用途、核心概念、用法、常用参数和命令、扩展
    iOS系统架构和Object-C基本数据类型(1)
    Object-C类、方法、构造函数(2)
    iOS 【资源篇】
    iOS播放视频
    蘑菇街 IM 项目 TeamTalk
    Extjs5.0 学习之路【结构篇】
    Hibernate基础(一)
    C# Winform中无焦点状态下获取键盘输入或者USB扫描枪数据
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5255052.html
Copyright © 2011-2022 走看看