博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cocos2d-x动画播放(序列帧)
阅读量:4692 次
发布时间:2019-06-09

本文共 2665 字,大约阅读时间需要 8 分钟。

简介

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

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

创建方法

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

手动添加:

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

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

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

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

文件添加:

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

1 auto cache = AnimationCache::getInstance();2 3 cache->addAnimationsWithFile("animations.plist");4 5 auto animation2 = cache->getAnimation("animation");    // 其中animation可以换成上面讲的str,str的获得和上面的方法所用相同6 7 auto action2 = Animate::create(animation2);8 9 sprite->runAction(Sequence::create(action2, action2->reverse(), NULL));

还可以有另一种写法:

1 CCSpriteFrameCache *frameCache = CCSpriteFrameCache::sharedSpriteFrameCache(); 2 frameCache->addSpriteFramesWithFile("animations.plist"); 3 CCArray* animFrames = CCArray::createWithCapacity(15); 4 char str[100] = {
0}; 5 for(int i = 1; i < 15; i++) 6 { 7 sprintf(str, "grossini_dance_%02d.png",i); 8 CCSpriteFrame *frame = frameCache->spriteFrameByName(str); 9 animFrames->addObject(frame);10 }11 12 CCAnimation *animation = CCAnimation::createWithSpriteFrames(animFrames, 0.2f);13 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),获得事先存入的动画

 

 

个人觉得上关于动画的实现也很详细。

 

 

 

 

转载于:https://www.cnblogs.com/cocos2014/p/3939081.html

你可能感兴趣的文章
Python 进程与线程
查看>>
【3-31】操作属性、元素、内容及定时器
查看>>
统计局的五级(省市区乡村)数据库支持 MS SQL SERVER 2005 和 MS SQL SERVER 2008
查看>>
软件测试
查看>>
[整理]在命令行执行 UIAutomation
查看>>
Overlapping Rectangles
查看>>
新浪IP库地址
查看>>
centos7 eclispe 编译C++遇到的问题总结
查看>>
1-ML的基本概念
查看>>
自动附加Sqlserver数据库
查看>>
02.设计模式
查看>>
LeetCode 371. Sum of Two Integers
查看>>
ZBrush功能特性之法线贴图
查看>>
virtualbox虚拟机ubuntu操作系统,设置网络互通、访问,能访问虚拟机swoole的http服务...
查看>>
磁盘inode节点被占满的解决方法
查看>>
js 中对象属性的特性
查看>>
周四的工作 张孝祖
查看>>
怎么教软件工程课的看法
查看>>
mac下mysql安装及配置启动
查看>>
PAT 甲级 1020 Tree Traversals (二叉树遍历)
查看>>