Cocos2d-x 中獲取動畫當前幀數
在遊戲中有很多動畫,這些動畫設計的好壞,對遊戲的體驗性影響很大。比方說敲打類動作,如果敲打動作比較多,我們在動作結束後,在處理敲擊結果,遊戲就給使用者感覺很遲鈍,有延遲現象。因此,這類動作,我們不能在動作結束後,再處理,而是應該在動作過程中進行處理。這裡就考慮到了獲取動畫當前幀數問題。
如果獲取動畫當前幀數?上網百度了一些,方法不多,就兩類。不過在我測驗過都不能用。這裡有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大圖建立動畫方法,就等下次將模板公佈,在給出來。
相關文章
- react獲取當前頁面的url引數React
- 用js獲取當前月份的天數JS
- JavaScript 獲取當前月份JavaScript
- 獲取當前時間
- php 獲取當前域名和當前協議PHP協議
- android粘性廣播主動獲取當前值Android
- mybatis獲取當前時間MyBatis
- 獲取當前頁面的topViewControllerViewController
- Java獲取當前星期幾Java
- 獲取網路視訊任意幀畫面
- 利用爬蟲獲取當前博文數量與字數爬蟲
- python 如何獲取當前時間Python
- PHP中獲取當前頁面的各種URL格式PHP
- Flutter 小知識,Key的使用(獲取當前點選Widget位置/獲取當前Widget大小)Flutter
- 幀動畫動畫
- View動畫、幀動畫View動畫
- Flutter獲取當前網路型別Flutter型別
- Linux C獲取當前工作目錄Linux
- Spark獲取當前分割槽的partitionIdSpark
- 獲取當前Tomcat例項的埠Tomcat
- 微信小程式獲取當前位置微信小程式
- Java如何獲取當前執行緒Java執行緒
- 獲取當前時間往前的日期
- 獲取當前時間戳和隨機數的獲取、Java Random、ThreadLocalRandom、UUID類中的方法應用(隨機數)時間戳隨機JavarandomthreadUI
- 獲取當前元素在兄弟元素節點中的索引索引
- 小程式獲取當前元素在螢幕中的位置
- 如何用js獲取當前時間和ip地址以及當前城市JS
- Unity幀動畫Unity動畫
- 教你在Nodejs中如何獲取當前函式被呼叫的行數及檔名NodeJS函式
- 直播app原始碼,uniapp獲取當前位置APP原始碼
- C# 獲取當前伺服器域名C#伺服器
- 如何用Java獲取當前時間戳?Java時間戳
- python怎麼獲取當前是幾點?Python
- js獲取當前的具體時間JS
- c++ 獲取當前時間周初凌晨時間戳(獲取當前時間週一凌晨時間戳)C++時間戳
- WPF 前臺觸發器實時獲取當前時間觸發器
- JVM 如何獲取當前容器的資源限制?JVM
- 獲取類屬性值,當前類,父類