在游戏中有很多动画,这些动画设计的好坏,对游戏的体验性影响很大。比方说敲打类动作,如果敲打动作比较多,我们在动作结束后,在处理敲击结果,游戏就给用户感觉很迟钝,有延迟现象。因此,这类动作,我们不能在动作结束后,再处理,而是应该在动作过程中进行处理。这里就考虑到了获取动画当前帧数问题。
如果获取动画当前帧数?上网百度了一些,方法不多,就两类。不过在我测验过都不能用。这里有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大图创建动画方法,就等下次将模板公布,在给出来。