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

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大图创建动画方法,就等下次将模板公布,在给出来。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值