cocos2d js 骨骼动画游戏中帧动画太多怎么优化

nb原创, 欢迎转载,转载请在明显处注明!&Thx~
原文地址:http://blog.csdn.net/nilreb_nb/article/details/
之前都是用2.0开发,用2.0使用帧播放需要用到CCMutableArray这个容器数组,但是3.0里面已经没有这个数组了,所以我去查看了testCpp里面的Animation源码,这边说一下3.0要怎么实现帧播放。
直接上代码了
(1)手动实现帧播
auto animation = Animation::create();
char str[64] = {0};
for(int i=0;i&18;i++){//我一共有18张图片,放在test1文件夹
sprintf(str,&test1/%d.png&,i+1);
animation-&addSpriteFrameWithFileName(str);
animation-&setDelayPerUnit(3.0f / 18.0f);//这里表示一共播放3秒,然后18张图片
animation-&setRestoreOriginalFrame(true);
auto action = Animate::create(animation);
auto run1 = CCSprite::create();//创建一个sprite让它跑起来
run1-&setPosition(ccp(contsize.width/2,contsize.height/10*6));
this-&addChild(run1,12);
run1-&runAction(Sequence::create(action, NULL));auto animation = Animation::create();
Animation* animation = Animation::create();
&这两种定义是一个意思,我习惯用auto,方便省事。
另外如果想实现循环播放,也简单,用CCRepeat(有限)和CCRepeatForever(无限循环)
auto Call = CCCallFuncND::create(this,callfuncND_selector(CombatSystemLayer::repeatFunc),pdata);
auto run = CCSprite::create();
this-&addChild(run,1);
auto seq3 = Sequence::create(Call,DelayTime::create(8.0f),NULL);//一组动作序列的集合
//CCRepeatForever* repeat=CCRepeatForever::create(seq1);//无限循环
auto rep2 = CCRepeat::create(seq3,5);//把序列seq3循环播放5次
auto seq4 = Sequence::create(DelayTime::create(3.5f), rep2, NULL);
(2)文件实现帧播放(这是testCpp的源码)
AnimationCache *cache = AnimationCache::getInstance();
cache-&addAnimationsWithFile(&animations/animations-2.plist&);//加载plist文件
Animation *animation2 = cache-&animationByName(&dance_1&);
Animate* action2 = Animate::create(animation2);
_tamara-&runAction(Sequence::create(action2, action2-&reverse(), NULL));
本文已收录于以下专栏:
相关文章推荐
auto sp= Sprite::create();
        sp-&setPosition(500, 500);
        this-&addChild...
一、帧动画
你可以通过一系列图片文件,像如下这样,创建一个动画: CCAnimation *animation = CCAnimation::create();
//从本地文件系统中加载图片文件到C...
plist帧动画相关内容总结。
前两篇博文用恶搞的形式写了action的相关使用,这算是自己的一种尝试,也可以说是心情的发泄。
本篇是action三板斧的最后一板,经过深思熟虑后,我决定就用正常人的方式写吧...
游戏中我们经常要让一个Sprite
这一步当中,我们主要完成以下功能:
1.地图的无限滚动---让主角看起来真的是在跑动
2.给主角添加Jump跳跃和crouch下蹲动作
那么首先来让背景滚动起来,在PlayScene.h中添加:
好,这篇我们来讲解无限循环滚动背景,这个知识已经被讲到烂了,我以前的文章也介绍过,所以就不那么详细地说明了。
笨木头花心贡献,啥?花心?不呢,是用心~
为什么是循环滚动背景?
用循环滚动背景,...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Cocos2d-x 中获取动画当前帧数
DionysosLai
&&&&&&&& 在游戏中有很多动画,这些动画设计的好坏,对游戏的体验性影响很大。比方说敲打类动作,如果敲打动作比较多,我们在动作结束后,在处理敲击结果,游戏就给用户感觉很迟钝,有延迟现象。因此,这类动作,我们不能在动作结束后,再处理,而是应该在动作过程中进行处理。这里就考虑到了获取动画当前帧数问题。
&&&&&&&& 如果获取动画当前帧数?上网百度了一些,方法不多,就两类。不过在我测验过都不能用。这里有2个原因,一个就是版本问题了,另一个原因待会儿再说。
&&&&&&&& 获取动画的原理就是:我们在创建动画时,是根据纹理(CCTexture2D)来生成动画帧(SpriteFram)的,因此,我们可以比较当前的纹理ID来判断动画帧数(也正是,这个原理导致获取动画当前帧数方法适用性比较小。)
代码如下:
///@brief 返回当前的动画帧
///@param[in] animate---当前动画
这个函数的方法是通过获取当前纹理ID来实现,因此,使用范围是当前纹理ID都不一样,因此如果从一张大图中根据位置抽取动画数据,不可用。
///@return currentAnimIndex---当前动画帧 -1---获取失败
///@retval
///@author DionysosLai,
///@version 1.0()
int RoleSprite::getCurrentFrameWithPngs( const CCAnimate* animate)
int currentAnimIndex = 0;
unsigned int frameSum = animate-&getAnimation()-&getFrames()-&capacity(); /// 获取动作的总帧数
for(unsigned int i = 0; i & frameS i++)
GLint iID = this-&getTexture()-&getName();
///& 获取精灵当前纹理ID
/// 依次获取动画帧,根据动画帧获取其纹理ID
CCAnimationFrame* animFrame =(CCAnimationFrame*)animate-&getAnimation()-&getFrames()-&objectAtIndex(i);
///& 注意这里是 CCAnimationFrame而不是CCSpriteFrame
GLint iID1 = animFrame-&getSpriteFrame()-&getTexture()-&getName();
if (iID1 == iID)
currentAnimIndex =
return currentAnimI
return -1;
&&&&&& 有一点要注意的是,这里我们的CCAnimate的创建方式是根据多张pngs图来创建的,因此我们的纹理ID都不一样。如果根据plist文件或者一张png大图获取,则其中的纹理ID都一样。
&&&&&& 而根据plist文件或者png大图创建的CCAnimate,如果获取当前动画帧数,目前还不会,会的人,告诉我下。
&&&&&& Ps:附上根据多张png图创建动画函数:
///@brief 从多张图片png图片中,创建动画
///@param[in] unitFrameTime--每一帧时间长度,pngName---png图片名, frames---帧多少
///@pre 注意这里的pngName,比较特殊,例如原名为“hatch_open_0.png”,这里必须传进来为hatch_open_0
///@return
///@retval 这中方法比较适合动画有位移
///@author DionysosLai,
///@version 1.0()
CCAnimate* RoleSprite::createActoinWithPngs( float unitFrameTime, const char* pngName, int frames )
/* CCTexture2D *playerRunTexture = CCTextureCache::sharedTextureCache()-&addImage(pngName);*/
CCAnimation* animation = CCAnimation::create();
char ch[64] = {0};
for( int i = 0;i & i++)
sprintf(ch, &%d.png&, i);
char str[64] = {0};
strcat(str, pngName);
strcat(str, ch);
CCTexture2D *playerRunTexture = CCTextureCache::sharedTextureCache()-&addImage(str);
animation-&addSpriteFrame(CCSpriteFrame::createWithTexture(playerRunTexture,
CCRectMake(0, 0, playerRunTexture-&getContentSize().width, playerRunTexture-&getContentSize().height)));
animation-&setDelayPerUnit(unitFrameTime);
CCAnimate* action = CCAnimate::create(animation);
/* return CCRepeatForever::create(action);
&&&&&&&& 根据plsit文件或者一张png大图创建动画方法,就等下次将模板公布,在给出来。
本文已收录于以下专栏:
相关文章推荐
var load = ccs.load(res.Ani_json);
var mainNode = load.
this.addChild(mainNode);
// 对应帧...
猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网--,谢谢!原文地址: /?p=391有些人跟我QQ留言说 《co...
一。问题描述
今天在写游戏的时候,为了统一动画和攻击的时间,我取消了原先依靠时间来同步的想法(太烂了,总是不协调)。所以就上网搜了下,看看cocos2d-x中有没有提供这样的方法(汗。。。初学当中i...
Cocos2d-x 3.2 Lua示例CurrentLanguageTest(当前语言环境)转载请注明:IT_xiao小巫    本篇博客介绍Cocos2d-x 3.2给我们提供的一个例子,获取当前程...
这次将实现子弹的配置文件,敌人的配置文件,子弹的精灵和敌人的精灵。以及子弹的发射和敌人的产生。
子弹的分析:
游戏中不可能只有一种子弹,这样子弹就需要一个配置文件,配置文件中有子弹的类型,子弹的贴...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)1322人阅读
HelloWorld::init()
& & //////////////////////////////
& & // 1. super init first
if ( !CCLayer::init() )
& & & & return
//使用资源文件创建精灵帧缓存
& & CCTexture2D::PVRImagesHavePremultipliedAlpha(true);
& & // CCSpriteFrameCache
精灵帧缓存。
//用文件添加精灵帧。
& & CCSpriteFrameCache::sharedSpriteFrameCache()-&addSpriteFramesWithFile(&crop.plist&);
//从精灵帧缓存中创建第一个精灵。
& & CCSprite *spr=CCSprite::createWithSpriteFrameName(&crop1.png&);
& & spr-&setPosition(ccp(170,
addChild(spr);
//将精灵帧缓存中的每个精灵放入数组中
& & CCArray *animFrames=CCArray::createWithCapacity(4);
// 4是个预估值。// Array
数组,和oc的数组一样。
char str[100]={0};
for (int i=1; i&5; i++)
sprintf(str, &crop%d.png&,i);
& & & & CCSpriteFrame *fram=CCSpriteFrameCache::sharedSpriteFrameCache()-&spriteFrameByName(str);
& & & & animFrames-&addObject(fram);
//将该数组放入动画类对象中
CCAnimation *animation=CCAnimation::createWithSpriteFrames(animFrames,1.0f);
& & animation-&setLoops(-1);
& & //形成动画效果
& & spr-&runAction(CCAnimate::create(animation));
& & //使用addSpriteFramsWithFile函数将帧添加到帧缓存后,不使用时在使用下面函数释放。
& & //CCSpriteFrameCache ::sharedSpriteFrameCache()-&removeSpriteFrameByName(&crop.plist&);
return true;
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:174492次
积分:4089
积分:4089
排名:第8015名
原创:228篇
转载:69篇
评论:17条
(2)(2)(6)(1)(1)(20)(6)(6)(2)(1)(2)(3)(1)(4)(6)(2)(4)(3)(9)(3)(4)(3)(6)(2)(5)(4)(6)(3)(4)(21)(18)(2)(8)(12)(8)(64)(44)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'2013年4月 VC/MFC大版内专家分月排行榜第一2007年7月 VC/MFC大版内专家分月排行榜第一2007年5月 VC/MFC大版内专家分月排行榜第一2007年4月 VC/MFC大版内专家分月排行榜第一2007年3月 VC/MFC大版内专家分月排行榜第一
2013年3月 VC/MFC大版内专家分月排行榜第二2013年2月 VC/MFC大版内专家分月排行榜第二2008年8月 VC/MFC大版内专家分月排行榜第二2008年7月 VC/MFC大版内专家分月排行榜第二2007年9月 VC/MFC大版内专家分月排行榜第二2007年8月 VC/MFC大版内专家分月排行榜第二2005年12月 VC/MFC大版内专家分月排行榜第二2005年10月 VC/MFC大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。cocos2d-x CCAnimate 动画播放时间帧问题
本文要解决的疑问:
& 帧缓冲池是什么?
& 动画缓冲池是什么?
& 动画帧如何按照时间帧片播放?
& 如果相邻动画帧的时间间隔不相同cocos2d-x如何来处理?
& 至于其他的如何用plist文件初始化动画缓冲池很简单,但是你得自己研究源代码
& 先来解决第一个问题。CCSpriteFrameCache。里面用一个CCDictionary (m_pSpriteFrames)存放了很多的CCSpriteFrame对象。他的key就是plist里面读取出来的。注意默认名字对应的是textures中包含的每张图片的名字,有可能带后缀。所以,我很不喜欢这个key,建议cocostudio以后增加修改key的功能。CCSpriteFrame是什么呢?他就是用来指定该帧对应对应纹理图中的位置信息。其实把他说成一个Cache不合适,充其量只是一种包装了的容器。不过既然人家这样命名,我觉得可能后期会扩展一些利用LRU或者别的算法清除不用的SpriteFrame。至于CCSpriteFrameCache里面的其他函数,就是用来解析plist文件的。
& 再来解决第二个问题。CCAnimationCache。里面同样也是一个CCDictionary(m_pAnimations)存放了很多的CCAnimation(里面是CCAnimationFrame)对象。既然有了CCSpriteFrame对象,为什么还得再要一个CCAnimationFrame对象呢?如果只用CCSpriteFrame,那你的每个帧的时间片信息存放到哪里啊?为什么不把时间片信息放到CCSpriteFrame里面呢?这里cocos2d-x设计的非常好。万一你针对同一个帧需要多个不同的播放时间片,这种情况就完美解决了。注意CCAnimationFrame的初始化函数 bool initWithSpriteFrame(CCSpriteFrame* spriteFrame, float delayUnits, CCDictionary* userInfo);第二个参数delayUnits。他并不是一个时间。原文的解释how many units of time the frame takes。因为COCOS2D-X的CCActionInterval播放的原理就是把一个序列的动画分成了时间片相同的动画帧。如果相邻的动画帧时间不相同,就分配不同的delayUnits。我们把一个序列(例如游戏中某个角色的某个方向8帧或者10帧的动画称作是序列)CCAnimationFrame放到一个CCArray中,然后再去创建成一个CCAnimation,这样这个方向的序列动画帧就初始化了一个对象。这里需要再说明的就是CCAnimation的CCAnimation* create(CCArray *arrayOfAnimationFrameNames, float delayPerUnit, unsigned int loops); 这个函数的delayPerUnit,这个值就是时间片的概念。他就一个以秒为单位的一个时间。同样称为CCAnimationCache也为时过早了点。不过相信官方后期还会在里面加入伸缩信息。
& &再来解决第三个问题。直接从CCActionInterval::step(float dt)这里说起。dt参数就是上一次调用这个函数和本次调用该函数的时间差。单位是秒。CCActionInterval播放序列动画就是以时间片为单位来进行播放的。这里的时间片就是创建CCAnimation的时候放进去的那个值。读者明白了这些恐怕也就明白了为什么在该函数里面有this-&update(MAX(0,MIN(1,m_elapsed/MAX(m_fDuration,FLT_EPSILON))) 去让CCAnimate执行update操作了。
& &至于最后一个问题 只要给每个CCAnimationFrame分配不同的时间片的数量,那也就完成了不同帧不同时间的播放要求了。}

我要回帖

更多关于 cocos js图片渐入动画 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信