怎么获取精灵正在cocos2d js播放帧动画第几帧动画

一.用TexturePacker-2.4.5工具做动画(要包含#include "AnimatePacker.h"文件)
1:用TexturePacker-2.4.5工具将序列图加载到大图中生成plist文件加载到项目中
CCSpriteFrameCache::sharedSpriteFrameCache()-&addSpriteFramesWithFile("quest.plist"),CCTextureCache::sharedTextureCache()-&textureForKey("quest.png");
2:AnimatePacker工具的使用
(1)Plists:将Plist文件,拖动plist文件到AnimatePacker窗口上,就可以加载。
(2)Animations:所有的动作列表,点击&摄像机&按钮可以新建动作,双击可以编辑Name为(&portraitAnimiton&也就是xml中保存的这段帧动画的key值)和Delay。
(3)SpriteFrames:当前Animation对应的SpriteFrames列表,拖动可以排序。
(4)Sprites:所有的备选Spirte,你可以拖动Spirte到SpriteFrames框下面。
(5)保存生成一个xml文件加载到项目中:代码如下:&
AnimatePacker::getInstance()-&loadAnimations("portraitAnimitionSave.xml");
//创建一个执行此段动画的精灵
CCSprite *lockSprite = CCSprite::create();
lockSprite-&setPosition(ccp(this-&getContentSize().width * 0.5f, this-&getContentSize().height * 0.5f)); this-&addChild(lockSprite, 1);
lockSprite -&runAction(AnimatePacker::getInstance()-&getAnimate("portraitAnimiton"));
另外你也可以让这段动画加入动作序列中和其他动画一块执行代码如下:
CCSequence *PotraitSequence = CCSequence::create(deleteLockSprite, AnimatePacker::getInstance()-&getAnimate("portraitAnimiton"), afterAnimitionAction, NULL); lockSprite-&runAction(PotraitSequence);
二.普通的序列图动画的创建 这个也是要提前将序列图加载成大图plist加载到资源中
//1:创建帧缓存
CCSpriteFrameCache* pCacheObject = CCSpriteFrameCache::sharedSpriteFrameCache();
CCSize size = CCDirector::sharedDirector()-&getWinSize();
//2:创建帧动作的存储数组
CCArray *pSpriteFrameArray=new CCArray();
//3:循环将序列图加载到帧缓存和数组中
for(unsigned int Index = 1; Index &= 32; Index++)
{CCString *stringN&if (Index & 10) {& stringName = CCString::createWithFormat("Animation_portrait_locked_000%d.png", Index);&}&else {& stringName = CCString::createWithFormat("Animation_portrait_locked_00%d.png", Index);&}&CCSpriteFrame* pSpriteFrame = pCacheObject-&spriteFrameByName(stringName-&getCString());&pSpriteFrameArray-&addObject(pSpriteFrame);}
//4:创建一个动画对象
CCAnimation *animationObject = CCAnimation::createWithSpriteFrames(pSpriteFrameArray, 0.05f);
//5:创建执行动画的精灵CCSprite *pSprite = CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()-&spriteFrameByName("Animation_portrait_locked_0001.png"));pSprite-&setScale(1.8f);pSprite-&setPosition(ccp(pSprite-&getContentSize().width * 0.73f, pSprite-&getContentSize().height * 0.72f));this-&addChild(pSprite, 1);
//6:动作序列
CCActionInterval* actionAnimition = CCAnimate::create(animationObject);CCCallFuncN * deleteLockSprite = CCCallFuncN::create(this, callfuncN_selector(PlayerPortraitSprite::deleteLockSpriteCallBack));CCCallFuncN * afterAnimitionAction = CCCallFuncN::create(this, callfuncN_selector(PlayerPortraitSprite::afterPlayAnimitionCallBack));
CCSequence *PotraitSequence = CCSequence::create(deleteLockSprite, actionAnimition, afterAnimitionAction, NULL);pSprite-&runAction(PotraitSequence);
//7:释放数组对象pSpriteFrameArray-&release();}
阅读(...) 评论()主题 : 有一个序列帧动画, 怎么知道现在播放到了第几帧?
级别: 新手上路
可可豆: 181 CB
威望: 181 点
在线时间: 76(时)
发自: Web Page
来源于&&分类
有一个序列帧动画, 怎么知道现在播放到了第几帧?&&&
有一个序列帧动画, 怎么知道现在播放到了第几帧?
级别: 新手上路
可可豆: 181 CB
威望: 181 点
在线时间: 76(时)
发自: Web Page
额。 是不是我的问题太简单都没人愿意回答了??
级别: 精灵王
UID: 319920
发帖: 1350
可可豆: 1540 CB
威望: 1459 点
在线时间: 789(时)
发自: Web Page
如果你需要对各帧进行控制,可以自己用定时器来播放帧动画
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!Cocos2d-x动画播放(序列帧) - cocos2014 - 博客园
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++)
4 char str[10] = {0};
5 sprintf(str,"0%d.png",i);
6 animation-&addSpriteFrameWithFile(str);
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();
3 cache-&addAnimationsWithFile("animations.plist");
5 auto animation2 = cache-&getAnimation("animation");
// 其中animation可以换成上面讲的str,str的获得和上面的方法所用相同
7 auto action2 = Animate::create(animation2);
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++)
sprintf(str, "grossini_dance_%02d.png",i);
CCSpriteFrame *frame = frameCache-&spriteFrameByName(str);
animFrames-&addObject(frame);
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),获得事先存入的动画
个人觉得上关于动画的实现也很详细。

我要回帖

更多关于 ios播放序列帧动画 的文章

 

随机推荐