Cocos2d-x 中獲取動畫當前幀數

魚兒-1226發表於2020-10-21

在遊戲中有很多動畫,這些動畫設計的好壞,對遊戲的體驗性影響很大。比方說敲打類動作,如果敲打動作比較多,我們在動作結束後,在處理敲擊結果,遊戲就給使用者感覺很遲鈍,有延遲現象。因此,這類動作,我們不能在動作結束後,再處理,而是應該在動作過程中進行處理。這裡就考慮到了獲取動畫當前幀數問題。

         如果獲取動畫當前幀數?上網百度了一些,方法不多,就兩類。不過在我測驗過都不能用。這裡有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大圖建立動畫方法,就等下次將模板公佈,在給出來。

相關文章