Cocos2d-x 中获取动画当前帧数
2014-04-17 17:51
405 查看
Cocos2d-x 中获取动画当前帧数
DionysosLai 2014-4-17
在游戏中有很多动画,这些动画设计的好坏,对游戏的体验性影响很大。比方说敲打类动作,如果敲打动作比较多,我们在动作结束后,在处理敲击结果,游戏就给用户感觉很迟钝,有延迟现象。因此,这类动作,我们不能在动作结束后,再处理,而是应该在动作过程中进行处理。这里就考虑到了获取动画当前帧数问题。
如果获取动画当前帧数?上网百度了一些,方法不多,就两类。不过在我测验过都不能用。这里有2个原因,一个就是版本问题了,另一个原因待会儿再说。
获取动画的原理就是:我们在创建动画时,是根据纹理(CCTexture2D)来生成动画帧(SpriteFram)的,因此,我们可以比较当前的纹理ID来判断动画帧数(也正是,这个原理导致获取动画当前帧数方法适用性比较小。)
代码如下:
有一点要注意的是,这里我们的CCAnimate的创建方式是根据多张pngs图来创建的,因此我们的纹理ID都不一样。如果根据plist文件或者一张png大图获取,则其中的纹理ID都一样。
而根据plist文件或者png大图创建的CCAnimate,如果获取当前动画帧数,目前还不会,会的人,告诉我下。
Ps:附上根据多张png图创建动画函数:
根据plsit文件或者一张png大图创建动画方法,就等下次将模板公布,在给出来。
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大图创建动画方法,就等下次将模板公布,在给出来。
相关文章推荐
- cocos2d-x获取当前动画是第几帧
- cocos2d-x 2.x 获取当前动画是第几帧 (修复之前无法获取第几帧问题)
- cocos2d-x 2.x 获取当前动画是第几帧 (修复之前无法获取第几帧问题)
- cocos2d-x获取当前动画是第几帧
- cocos2d-x 2.x 获取当前动画是第几帧 (修复之前无法获取第几帧问题)
- cocos2d-x获取当前动画是第几帧
- cocos2d-x里得到当前动画播放帧数的方法
- cocos2d-x JS 获取当前系统时间(解决屏幕双击点击事件)
- 36 Android Activity跳转动画 获取当前版本
- cocos2d-x获取当前系统时间-------------沈大海
- cocos2d-x获取当前系统时间,实现跨平台
- 源码推荐(1.12):ZYDrawString实现对字符串的画线动画,iOS8获取当前经纬度、地理位置
- Cocos2d-x 获取系统当前时间
- cocos2d-x在ios平台获取当前设备的语言种类
- 12.cocos2d-x 获取当前设备语言
- 关于Cocos2d-x中获取正在播放动画第几帧的问题
- Cocos2d-x_获取当前设备语言
- cocos2d-x下获取系统的当前时间
- 动态获取旧版动画中当前所执行的动画
- cocos2d-x获取当前系统时间cocos2d-x