Cocos2d-x动画播放(序列帧)

简介

Cocos2d-x中,动画的具体内容是依靠精灵显示出来的,为了显示动态图片,我们需要不停切换精灵显示的内容,通过把静态的精灵变为动画播放器从而实现动画效果。动画由帧组成,每一帧都是一个纹理,我们可以使用一个纹理序列来创建动画。

我们使用Animation类描述一个动画,而精灵显示动画的动作则是一个Animate对象。动画动作Animate是精灵显示动画的动作,动画与动画动作的关系如同CD光盘与CD播放机的关系,前者记录了动画的内容,后者是播放动画的工具,它由一个动画对象创建,并由精灵执行。

创建方法

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

手动添加

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

auto animation = CCAnimation::create();
for(int i = 1;i < 5;i++)
{
char str[10] = {0};
sprintf(str,"0%d.png",i);
animation->addSpriteFrameWithFile(str);
}
animation->setDelayPerUnit(2.5f/14.0f);         //2.5秒内实现14帧的播放
animation->setRestoreOriginalFrame(true);
animation->setLoops(-1);
auto animate = CCAnimate::create(animation);
sprite->runAction(CCRepeatForever::create(CCSequence::create(animate,NULL)));

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

  • addSpriteFrame,添加精灵帧到Animation实例
  • setDelayUnits,设置每一帧持续时间,以秒为单位
  • setRestoreOriginalFrame,设置是否在动画播放结束后恢复到第一帧

文件添加

首先我们来了解下需要用到的AnimationCache类。AnimationCache可以加载xml/plist文件,plist文件里保存了组成动画的相关信息,通过该类获取到plist文件里的动画。

auto cache = AnimationCache::getInstance();

cache->addAnimationsWithFile("animations.plist");

auto animation2 = cache->getAnimation("animation");    // 其中animation可以换成上面讲的str,str的获得和上面的方法所用相同

auto action2 = Animate::create(animation2);

sprite->runAction(Sequence::create(action2, action2->reverse(), NULL));

还可以有另一种写法:

CCSpriteFrameCache *frameCache = CCSpriteFrameCache::sharedSpriteFrameCache();

frameCache->addSpriteFramesWithFile("animations.plist");

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 = frameCache->spriteFrameByName(str);

animFrames->addObject(frame);

}

CCAnimation *animation = CCAnimation::createWithSpriteFrames(animFrames, 0.2f);

CCAnimate *anim = CCAnimate::create(animation);

相比较来说,还是第一种方法简单。

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

  • addAnimationsWithFile,添加动画文件到缓存,plist文件
  • getAnimation,从缓存中获取动画对象
  • 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),获得事先存入的动画

个人觉得http://zengrong.net/post/2006.htm上关于动画的实现也很详细。

 

时间: 2024-10-26 19:49:47

Cocos2d-x动画播放(序列帧)的相关文章

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

控制人物转向移动,动画播放的过程中插播其他动画后返回

人物转向移动的代码是我在网上粘贴后改动的-----------------------侵删--------------------------- 难点:如何在A动画中插播B动画再返回 思路:开始我的想法是在两个动画之间create transition用代码控制返回,但是条件是2s播放一次,间隔时间的重制和这个有冲突,如何使B动画播放完毕后再返回,后来经大神指点(万分感谢呀O(∩_∩)O~~),在A动画播放的状态下判断时间,2s后直接播放B动画,transition 勾选Has Exit Tim

iOS Gif动画播放

这里记录下我实现在iOS端上进行Gif动画播放的代码. 调用代码: @interface ViewController () @property (nonatomic , strong) QGifView *gifView; @end @implementation ViewController - (void) viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [_gifView startGif]; } - (voi

关于unity中spine动画切换时有残影或者动画播放不正确的解决方法

问题描述: 最近在用spine动画时发现,有时候角色在切换动画的时候会有残影,或者动画播放不正确,例如会丢失一部分节点,例如切换动画后角色虽然动画播放正常,但丢失了武器. 解决办法: 在unity编辑器下找到spine动画的SkeletonData文件,在Animationgs下面有一个"Setup Pos",这个按钮可以将骨骼(bones).资源槽(slots)或两者重置为装配动作(setup pose).它与调用`setBonesToSetupPose` 或 `setSlotsTo

UIImageView~动画播放的内存优化

我目前学到的知识,播放动画的步骤就是上面的几个步骤,把照片资源放到数组里面,通过动画animationImage加载数组,设置动画播放的 时间和次数完成播放. 后来通过看一些视频了解到:当需要播放多个动画的时候可以把动画播放方法封装起来,因为方法完全一致,不一样的比如图片的数量,图片的名称当做参数传入方法中; 还有就是[UIImage imageNamed:]这个方法来加载图片的时候,系统会自动缓存图片,非常占用内存. 那么要优化图片加载后内存释放,有两个方法 一.更换图片加载语句: 二,图片加

CAnimateCtrl 动画播放控件

 CAnimateCtrl成员函数  播放avi动画 一.CAnimateCtrl成员函数 Autoplay; CAnimateCtrl ::成员函数 Open 打开avi视频 Play 播放没有声音的avi Seek 选择相应的帧 Stop 停止播放 Close 关闭播放 CAnimateCtrl 动画播放控件,布布扣,bubuko.com

想控制GIF图片动画播放吗?试试gifffer.js

在线演示:http://www.gbtags.com/gb/demoviewer/3578/c6bec39a-61ae-4017-8e23-e0bc1eeb740f/example|index.html.htm 大家可能都斯通见惯了互联网上普遍使用的GIF图片,但是有没有想过让用户自己尝试控制GIF动画的播放呢?在今天这篇文章中,我们将介绍一个超棒的Javascript小类库 - gifffer.js,它可以帮助你添加控制GIF动画功能,想不想尝试一下? 如何使用? 首先引用JS,如下: <sc

【酷熊科技】工作积累 ----------- 动画播放 直接写代码控制的

动画 播放 1 using UnityEngine; 2 using System.Collections; 3 4 public class GameLoading : MonoBehaviour { 5 6 public bool isAnimate = true; // hero 是否播放动画 用于暂停游戏等 7 public float animateFrameCountPerSecond = 0.1f; // hero 每秒播放 图片 多少张 8 public float timeAn

Cocos2dx 小技巧(十二) 一种可行的系列动画播放方式

定义: 将一个类(Adaptee)的接口转换成客户(Client)希望的另外一个接口(Target). 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 需要适配的类(Adaptee):需要适配的类或适配者类. 适配器(Adapter):使得一个东西适合另一个东西的东西.百度中定义为:接口转换器.通过包装一个需要适配的对象,把源接口转换成目标接口. 为什么要适配:需要的东西已做好,但是不能用,短时间又不能改造,想办法适配它. 作用: 使得原本由于接口不兼容而