[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)

通常情况下,对于一个精灵动画,每次创建时都需要加载精灵帧,按顺序添加到数组,再创建对应动作类,这是一个非常烦琐的计算过程。对于使用频率高的动画,比如走路动画,将其加入缓存可以有效降低每次创建的巨大消耗。由于这个类的目的和缓存内容都非常简单直接,所以其接口也是最简单了的,如下所示:

- 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)。按照引用层级由高到低,以保证释放引用有效。

[Cocos2d-x v3.x]序列帧动画,布布扣,bubuko.com

时间: 2024-12-30 14:39:15

[Cocos2d-x v3.x]序列帧动画的相关文章

Quick cocos2dx-Lua(V3.3R1)学习笔记(六)----让精灵动起来吧,使用序列帧动画

光有精灵太死板了,游戏里面肯定有不同的动画,难道人物走动,一张静态图就能打发对游戏质量要求越来越高的玩家么?所以我们要让精灵动起来 quick里面提供了使用序列帧动画的函数,我们直接使用就行了 现将大图载入缓存中,然后提取出来用即可 主要就是display,newFrames参数,这个有点string.format的味道 @function [parent=#display] newFrames -- @param string pattern 模式字符串 -- @param integer b

cocos2d-x学习笔记(二)序列帧动画实现的几种方法

一.cocos2d-x帮助文档中关于动画帧动画的实现有两种方法: 手动添加序列帧到Animation类 使用文件初始化Animation类 这里我就不列出来,大家可以看下官方文档 http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/frame-animation/zh.md 二.有些时候我们需要从plist取出指定的几个图片(而不是全

unity shader序列帧动画代码,顺便吐槽一下unity shader系统

http://www.cnblogs.com/hellohuan/archive/2014/01/10/3512784.html 一.看到UNITY论坛里有些人求unity shader序列帧动画,写shader我擅长啊,就顺势写了个CG的shader.代码很简单,就是变换UV采样序列帧贴图,美术配置行数列数以及变换速度. Shader "HELLOHUAN/Hello_Sequence" { Properties { _Color ("Main Color", C

iOS开发基础-序列帧动画之Tom猫

新建一个Single View Application,向该工程中导入Tom猫的图片资源,本示例演示Tom猫喝牛奶的动作.图片的名字为 drink_00.jpg.drink_01.jpg.....drink_80.jpg . 向 Main.storyboard 中添加 UIImageView ,将图片 drink_00.jpg 作为默认显示的画面.将该控件与 ViewController 类建立一个 IBOutlet 连接,属性名为: @property (weak, nonatomic) IB

1-10(退出键盘,设置按钮的背景图,transform属性,imageView序列帧动画,九宫格算法...)

(1-10目录) 1.取得2个文本输入框的值 2.退出键盘 3.设置按钮的背景图 4.执行动画 5.手动创建按钮以及设置按钮的一些基本属性 6 transform属性 7.imageView序列帧动画 8.九宫格算法 9.通过xib创建局部控件,利用模型封装加载数据 10设置状态栏的样式为白色 { 扯淡环节: 工作这么久了, 发现一些细节有时候总是忽略, 现在就把我刚接触时的知识点给整理出来!, 没事自己看看, 也分享给大家! 分享,创造快乐!哈哈 xq每天都生活在快乐当中, 愿你们也是! }

iOS开发-UI基础-汤姆猫Tom(序列帧动画)

使用UIImageView和UIButton实现Tom小案例. 功能分析:点击对应按钮后,tom实现相应的动作和声音 步骤分析: 搭建UI界面:(头部,肚子,尾巴,左脚和右脚使用的是button) 监听按钮点击 根据点击的按钮实现相应的序列帧动画 tom的动作就是一张一张的图片连续显示在屏幕上,实现动画有几种方式: 1.首尾式: //动画的开始 [UIView beginAnimations:nil context:nil]; //动画的内容 //提交动画(动画结束) [UIView commi

Unity3D中播放序列帧动画

[狗刨学习网] class FrameAnimation { private float fps = 10.0f; private Rect drawPos; private float time = 0; private int currentIndex = 0; public void DrawFrameAnimation(Texture[] frameTex) { int length = frameTex.Length; GUI.DrawTexture(drawPos, frameTex

Cocos2dx学习笔记10:cocos2dx序列帧动画(1)

在cocos2dx里是不支持gif动画的,所以我们无法给精灵设置gif格式的图片.但是如果我们想实现动画效果呢?那么我们就要自己通过大量的静态图来组成播放成动画. 在cocos2dx里提供了序列帧动画的概念来实现这个功能,动画由帧组成,每一帧都是一个纹理,我们可以使用一个纹理序列来创建动画. 首先找一张动图的gif图,这里QQ群里最近动图的逗逼图太多,我就随便找了一张,把图片另存到桌面,打开ps软件,把图片拖进去,这样gif图会被拆分许多的图层.我们把图层一个一个图层的保存成png的静态图,命名

quick cocos2dx 播放序列帧动画的实现

本帖基于quick cocos2dx2.2.6版本. 序列帧动画:顾名思义就是在一定的时间内播放多张图片. 基本原理非常简单,在一个固定的位置1秒时间内轮询播放有限数量的不同图片.比如1秒中播放24张图(FPS=24) 在quick引擎中可以通过framwork中的transition.lua文件中得transition.playAnimationForever(target, animation, delay)接口来实现动画的播放,其源码如下: function transition.play