转自:http://codingnow.cn/cocos2d-x/810.html

这一篇来学习怎么使用cocos2d-x引擎播放帧动画,就是把一帧一帧的图片像电影那样显示出来。
1. 首先来了解一下相关的类
CCAnimation:是精灵用来播放动画的参数,内部封装了一个帧序列(CCMutableArray<CCSpriteFrame*>)和每帧播放间隔时间(float m_fDelay),初始化该对象时记得指定delay时间,否则默认是0。
CCAnimationCache:从名字很容易看出,它是用来缓存CCAnimation的,内部封装了一个字典(CCMutableDictionary<std::string, CCAnimation*>),是一个单例。使用实例:

CCMutableArray<CCSpriteFrame *>* pAnimFrames = new CCMutableArray<CCSpriteFrame *>();
/** .... */
CCAnimation* pAnimation = CCAnimation::animationWithFrames( pAnimFrames, 0.12f);
//添加到缓存
CCAnimationCache::sharedAnimationCache()->addAnimation(pAnimation,"conch_animation");
//从缓存取出
CCAnimation* pAnimation2 =CCAnimationCache::sharedAnimationCache()->animationByName("conch_animation")

CCAnimate:它的父类是CCActionInterval,作用是根据CCAnimation封装的帧序列和间隔时间,使精灵产生动画效果。

cocos2d-x播放帧动画的主要的流程是:
(1)创建CCSpriteFrame数组,可以使用CCSpriteFrameCache或者CCTextureCache。
(2)通过帧序列创建CCAnimation对象
(3)通过CCAnimation对象和间隔时间创建CCAnimate,生成一个持续性动作。
(4)使用精灵执行动作

2.下面分别使用CCSpriteFrameCache和CCTextureCache来实现一个播放动画的demo
(1)使用CCSpriteFrameCache获得动画帧,可以使用TexturePacker工具把多个分散的小图集中到一张大图上,然后生成plist文件。程序中使用的图片:

下面是播放动画的核心代码:

CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSpriteFrameCache* pFrameCache = CCSpriteFrameCache::sharedSpriteFrameCache();
pFrameCache->addSpriteFramesWithFile(s_plistPathPropConch, s_imgPathPropConch); m_pHero = CCSprite::spriteWithSpriteFrameName("ani_conch_1.png");
m_pHero->retain();
this->addChild(m_pHero);
m_pHero->setPosition( ccp(winSize.width/,winSize.height/) ); const int frameCount = ;
CCMutableArray<CCSpriteFrame *>* pAnimFrames = new CCMutableArray<CCSpriteFrame *>(frameCount);
char str[] = {};
for(int i = ; i != frameCount; ++i)
{
sprintf(str, "ani_conch_%d.png", i+);
CCLog("str=%s",str);
CCSpriteFrame* pFrame = pFrameCache->spriteFrameByName( str );
pAnimFrames->addObject( pFrame );
} //delay默认是0
CCAnimation* pAnimation = CCAnimation::animationWithFrames( pAnimFrames, 0.12f);
pAnimFrames->release();
m_pHero->runAction( CCRepeatForever::actionWithAction( CCAnimate::actionWithAnimation(pAnimation,false) ) );

sprintf的作用是字符串格式化,主要功能是把格式化的数据写入某个字符串中。sprintf(str, “ani_conch_%d.png”, 1)后str的值就变成了:ani_conch_1.png,其他使用方法可以去google或者百度查。

(2)使用CCTextureCache获得动画帧,程序中用到的图片:

核心代码如下:

CCSize winSize = CCDirector::sharedDirector()->getWinSize();

CCTexture2D* pTexture = CCTextureCache::sharedTextureCache()->addImage( s_imgPathKnight );
int textureWidth = pTexture->getContentSize().width;
int textureHeight = pTexture->getContentSize().height;
CCLog("width=%d,height=%d",textureWidth, textureHeight);
const int row = ,col = ;
int spriteWidth = textureWidth / row, spriteHeight = textureHeight / ; CCSpriteFrame* pHeroFrame = CCSpriteFrame::frameWithTexture(pTexture,CCRectMake(,,spriteWidth,spriteHeight));
m_pHero = CCSprite::spriteWithSpriteFrame(pHeroFrame);
m_pHero->retain();
this->addChild(m_pHero);
m_pHero->setPosition( ccp(winSize.width/,winSize.height/) ); CCMutableArray<CCSpriteFrame *>* pAnimFrames = new CCMutableArray<CCSpriteFrame *>();
for(int i = ; i != col; ++i)
{
CCSpriteFrame* pSpriteFrame = CCSpriteFrame::frameWithTexture(pTexture,CCRectMake(spriteWidth * i, , spriteWidth, spriteHeight));
pAnimFrames->addObject(pSpriteFrame);
} //delay默认是0
CCAnimation* pAnimation = CCAnimation::animationWithFrames( pAnimFrames, 0.2f);
pAnimFrames->release();
m_pHero->runAction( CCRepeatForever::actionWithAction( CCAnimate::actionWithAnimation(pAnimation,false) ) );

cocos2d-x Animation的更多相关文章

  1. 如何优化cocos2d程序的内存使用和程序大小

    在我完成第一个游戏项目的时候,我深切地意识到"使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰".而我刚开始接触cocos2d的时候,社区里面的人 ...

  2. iOS——Core Animation 知识摘抄(一)

    本文是对http://www.cocoachina.com/ios/20150104/10814.html文章的关键段落的摘抄,有需要的看原文 CALayer和UIView的关系: CALayer类在 ...

  3. 如何优化cocos2d程序的内存使用和程序大小:第一部分

    译者: 在我完成第一个游戏项目的时候,我深切地意识到“使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰”.而我刚开始接触cocos2d的时候,社区里面的人们讨论了一个 ...

  4. Cocos2d—X游戏开发之CCScrollView(滑动视图)(十二)

    CCScrollView在Cocos2d-X引擎中主要使用在图片尺寸远大于屏幕尺寸的时候使用. 总体来说,使用起来比较简单. 一个是CCScrollView控件本身,一个是CCScrollViewDe ...

  5. 如何优化cocos2d程序的内存使用和程序大小:第一部分_(转)

    译者: 在我完成第一个游戏项目的时候,我深切地意识到“使用cocos2d来制作游戏的开发者们,他们大多会被cocos2d的内存问题所困扰”.而我刚开始接触cocos2d的时候,社区里面的人们讨论了一个 ...

  6. cocos2d中如何使用图片纹理图集的加载来实现一个动画的功能

    cocos2d中要实现一个动画,一般采用纹理图集的方式,也就是说把几个连续动作的图片挨个显示切换这样就是动画 一: 首先先看下今天要实现的具体的目的,打飞机的时间屏幕上会有一个喷火的小飞机,飞机的尾部 ...

  7. 使用过渡场景在多个场景的切换COCOS2D(4)

    CCNode有三个方法,使用CCDirector的replaceScene方法替换场景时,每个节点都会调用这三个方法: onEnter与onExit方法在改变场景过程中的特定时刻被调用,这取决于是否使 ...

  8. 如何优化cocos2d/x内存使用和程序大小的程序

    从最初的:http://www.himigame.com/iphone-cocos2d/1043.html 译者: 在我完毕第一个游戏项目的时候.我深切地意识到"使用cocos2d来制作游戏 ...

  9. 转载+自练(莫喷)怎样在cocos2d 2.1.4里面使用动画和Texture Packer

    本文实践自 Ray Wenderlich.Tony Dahbura 的文章<How to Use Animations and Sprite Sheets in Cocos2D 2.X>, ...

  10. cocos2d基本类介绍 director/scene/layer/sprite

    [核心类]     导演Director.场景Scene.布景层Layer.精灵Sprite的概念请移步:     导演控制场景,场景控制图层,图层控制精灵,精灵控制动作.     相互之间的关系框架 ...

随机推荐

  1. java ServerSocket服务端编程

    public class Test { public static void main(String[] args) throws Exception{ //1. 构造ServerSocket实例,指 ...

  2. ubuntu装机

    备份: .bashrc profile .vimrc exports defults/ 各种workspace中的源码 goagent/ 重转后安装: apt-get install openjdk- ...

  3. DIV内英文或者数字不换行的问题 解决办法

    word-wrap:break-word; word-break:break-all;

  4. Hibernate个人总结

    编写Hibernate第一个程序 Hibernate是目前最流行的持久层框架,专注于数据库操作.使用Hibernate框架能够使开发人员从繁琐的SQL语句和复杂的JDBC中解脱出来.Hibernate ...

  5. It is indirectly referenced from required .class files

    配置eclipse的导入包,有些包引用的位置不正确

  6. OWIN katana注册中间件的几种写法

    首先特别说明下在startup中注册完中间件的两个注意事项,看到有人写的东西有误导人的作用.关于startup启动发现类的内容,参照这里 http://www.asp.net/aspnet/overv ...

  7. 如何编写Linux设备驱动程序

    一.Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看 ...

  8. 与非CCR代码互操作

    导读:CCR可以轻松的承载STA组件或者与它互操作:组件应该创建一个只有一个线程的CCR Dispatcher实例,并且在Dispatcher的构造函数中指定线程套间策略.DispatcherQueu ...

  9. 算法 后减前最大值,zt

    一个人知道未来n天的每天股票的价格,请你给出一个算法,使得这个人从哪天买入,哪天卖出能获得最大的收益. 问题实际上就是求一个数组后面元素减前面元素的最大值 #include <stdio.h&g ...

  10. codeforces 401D (数位DP)

    思路:很明显的数位dp,设dp[i][j] 表示选取数字的状态为i,模m等于j的数的个数,那么最后的答案就是dp[(1<<n)-1][0].状态转移方程就是,dp[i|(1<< ...