您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x 中获取动画当前帧数

2014-04-17 17:51 405 查看
Cocos2d-x 中获取动画当前帧数
DionysosLai 2014-4-17
在游戏中有很多动画,这些动画设计的好坏,对游戏的体验性影响很大。比方说敲打类动作,如果敲打动作比较多,我们在动作结束后,在处理敲击结果,游戏就给用户感觉很迟钝,有延迟现象。因此,这类动作,我们不能在动作结束后,再处理,而是应该在动作过程中进行处理。这里就考虑到了获取动画当前帧数问题。
如果获取动画当前帧数?上网百度了一些,方法不多,就两类。不过在我测验过都不能用。这里有2个原因,一个就是版本问题了,另一个原因待会儿再说。
获取动画的原理就是:我们在创建动画时,是根据纹理(CCTexture2D)来生成动画帧(SpriteFram)的,因此,我们可以比较当前的纹理ID来判断动画帧数(也正是,这个原理导致获取动画当前帧数方法适用性比较小。)
代码如下:
///@brief 返回当前的动画帧
///@param[in] animate---当前动画
///@pre	  这个函数的方法是通过获取当前纹理ID来实现,因此,使用范围是当前纹理ID都不一样,因此如果从一张大图中根据位置抽取动画数据,不可用。
///@return currentAnimIndex---当前动画帧 -1---获取失败
///@retval
///@post
///@author DionysosLai,906391500@qq.com
///@version 1.0(2014-04-16)
///@data 2014-04-16
int RoleSprite::getCurrentFrameWithPngs( const CCAnimate* animate)
{
int currentAnimIndex = 0;
unsigned int frameSum = animate->getAnimation()->getFrames()->capacity();	/// 获取动作的总帧数
for(unsigned int i = 0; i < frameSum; 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 = i;
return currentAnimIndex;
}
}
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 这中方法比较适合动画有位移
///@post
///@author DionysosLai,906391500@qq.com
///@version 1.0(2014-04-16)
///@data 2014-04-16
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 < frames; 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);
//	return animation;
CCAnimate* action = CCAnimate::create(animation);
return action;
/*	return CCRepeatForever::create(action);  */
}


根据plsit文件或者一张png大图创建动画方法,就等下次将模板公布,在给出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: