Cocos2d-x动画播放(序列帧)
简介
Cocos2d-x中,动画的具体内容是依靠精灵显示出来的,为了显示动态图片,我们需要不停切换精灵显示的内容,通过把静态的精灵变为动画播放器从而实现动画效果。动画由帧组成,每一帧都是一个纹理,我们可以使用一个纹理序列来创建动画。
我们使用Animation类描述一个动画,而精灵显示动画的动作则是一个Animate对象。动画动作Animate是精灵显示动画的动作,动画与动画动作的关系如同CD光盘与CD播放机的关系,前者记录了动画的内容,后者是播放动画的工具,它由一个动画对象创建,并由精灵执行。
创建方法
手动添加序列帧到Animation类
使用文件初始化Animation类
手动添加:
手动添加的方法需要将每一帧要显示的精灵有序添加到Animation类中,并设置每帧的播放时间,让动画能够匀速播放。另外,还要通过setRestoreOriginalFrame来设置是否在动画播放结束后恢复到第一帧。创建好Animation实例后,需要创建一个Animate实例来播放序列帧动画。代码如下:
auto animation = CCAnimation::create();
for(int i = ;i < ;i++)
{
char str[] = {};
sprintf(str,"0%d.png",i);
animation->addSpriteFrameWithFile(str);
}
animation->setDelayPerUnit(2.5f/14.0f); //2.5秒内实现14帧的播放
animation->setRestoreOriginalFrame(true);
animation->setLoops(-);
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();
char str[] = {};
for(int i = ; i < ; 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上关于动画的实现也很详细。
Cocos2d-x动画播放(序列帧)的更多相关文章
- iOS-动画效果(首尾式动画,代码快动画,核心动画,序列帧动画)
一.各个动画的优缺点 1.首尾动画:如果只是修改空间的属性,使用首尾动画比较方便,如果在动画结束后做后续处理,就不是那么方面了. 2.核心动画:有点在于对后续的处理方便. 3.块动画: (1)在实际的 ...
- [cocos2d] 调用动画方法
利用texture atlases生成动画 中讲到如何添加动画,如果想要调用已添加的动画怎么办? 在1.0.1版本以前的cocos2d添加动画的方法为: CCAnimation *anim = [CC ...
- UIImageView~动画播放的内存优化
我目前学到的知识,播放动画的步骤就是下面的几个步骤,把照片资源放到数组里面,通过动画animationImage加载数组,设置动画播放的 时间和次数完成播放. 后来通过看一些视频了解到:当需要播放多个 ...
- unity3d的Animation 动画播放器的基本API
直接上代码: //动画名称 private const string ANIM_NAME = "Take 001"; //模型对象 private GameObject obj = ...
- 关于Unity中如何判断一个动画播放结束
方法一(强力推荐): 在动画结束帧或其他帧处加个动画事件,在播放到这一帧的时候会自动调用这个动画函数 如图,找到对应动画的inspector面板,在里面有个Events下拉条,下拉后在想要的帧的位置添 ...
- 想控制GIF图片动画播放吗?试试gifffer.js
在线演示:http://www.gbtags.com/gb/demoviewer/3578/c6bec39a-61ae-4017-8e23-e0bc1eeb740f/example|index.htm ...
- Delphi 2005 以上版本GIF动画播放设置
源: Delphi 2005 以上版本GIF动画播放设置
- 【转】unity Animator 怎么判断一个动画播放结束
关于unity Animator 怎么判断一个动画播放结束这里有几种方法.希望对大家有帮助.还有其他办法的可以分享一下 第一种方法:在动画结束帧后面加个动画事件,调用下含这个变量的函数接口不是可以了? ...
- UE4]不使用角色蓝图、动画蓝图、状态机,用“24K纯C++”实现动画播放
http://aigo.iteye.com/blog/2283454 原文作者:@玄冬Wong 不好意思,我稍稍标题党了,目前还不清楚如何用C++代码来实现BlendSpace和Montage的逻辑, ...
随机推荐
- AC日记——最短路 洛谷 P2384
题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你100000000000000000000000000000000000%10金币w ...
- 构建伪Update服务器工具isr-evilgrade
构建伪Update服务器工具isr-evilgrade 现在大部分软件都提供更新功能.软件一旦运行,就自动检查对应的Update服务器.如果发现新版本,就会提示用户,并进行下载和安装.而用户往往相 ...
- Ural 1774 Barber of the Army of Mages 最大流
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1774 1774. Barber of the Army of Mages Time li ...
- Java面向对象--static关键字
- Ubuntu 16.04下使用Wine安装文件内容搜索工具Search and Replace
说明: 1.使用的Wine版本是深度出品(Deepin),已经精简了很多没用的配置,使启动能非常快,占用资源小. 2.关于没有.wine文件夹的解决方法:在命令行上运行winecfg: 下载: (链接 ...
- UPLINK口
为什么我买的交换机没有UPLINK口? UPLINK端口的作用是为了解决网络设备互连时的网线(交叉线和直通线)的使用问题.现在新出的交换机有的是没有UPLINK口的,没有UPLINK口的交换机的每个端 ...
- utuntu16.04安装caffe+Matlab2017a+opencv3.1+CUDA8.0+cudnn6.0
上午把tensorflow安装好了,下午和晚上装caffe的确很费劲. 默认CUDA,cuDNN可以用了 caffe官方安装教程 有些安装顺序自己也不清楚,简直就是碰运气 1. 安装之前依赖项 Gen ...
- C# 解析迅雷链接成正常的Http链接
目前热门剧司马懿第一集的迅雷下载地址是: thunder://QUFodHRwOi8vZGwxMjIuODBzLmltOjkyMC8xNzA2L1vlpKflhptTU+mprOaHv+S5i+WGm ...
- 【Hibernate步步为营】--核心对象+持久对象全析(三)
上篇文章讨论了Hibernate持久对象的生命周期,在整个生命周期中一个对象会经历三个状态,三种状态的转换过程在开发过程中是可控的.并且是通过用法来控制它们的转化过程.详细的转化过程今天就来着重讨论下 ...
- 3.nginx反向代理服务器+负载均衡
nginx反向代理服务器+负载均衡 用nginx做反向代理和负载均衡非常简单, 支持两个用法: 1个proxy, 1个upstream,分别用来做反向代理,和负载均衡 以反向代理为例, nginx不自 ...