bool CartoonFollowAction::initWithAnimation(CCAnimation *pAnimation) { float singleDuration = pAnimation->getDuration(); pAnimation->retain(); if ( CCActionInterval::initWithDuration(singleDuration * pAnimation->getLoops() ) ) { m_nNextFrame = 0; this->m_pAnimation = pAnimation; m_pOrigFrame = NULL; m_uExecutedLoops = 0; m_pSplitTimes.resize(pAnimation->getFrames()->count()); float accumUnitsOfTime = 0; float newUnitOfTimeValue = singleDuration / pAnimation->getTotalDelayUnits(); CCArray* pFrames = pAnimation->getFrames(); CCARRAY_VERIFY_TYPE(pFrames, CCAnimationFrame*); CCObject* pObj = NULL; CCARRAY_FOREACH(pFrames, pObj) { CCAnimationFrame* frame = (CCAnimationFrame*)pObj; float value = (accumUnitsOfTime * newUnitOfTimeValue) / singleDuration; accumUnitsOfTime += frame->getDelayUnits(); m_pSplitTimes.push_back(value); }
//------------------------------------------------------------------------- // 播放动画,若该动作处于停止状态,则继续播放 void FKAnimateEx::Play( const std::string& p_szAniName, float p_fSpeed, int p_nLoops, bool p_bForceUpdate ) { if( m_pTarget == NULL || m_pAniRes == NULL ) return; if( !m_pAniRes->IsValid() ) { m_szCurAniName = p_szAniName; m_fSpeed = p_fSpeed; m_nLoopTime = p_nLoops; return; } FKAnimateExRes::SAnimationInfo* pInfo = m_pAniRes->GetAnimation( p_szAniName.c_str() ); if( pInfo == NULL ) return; CCAnimation* pCurAnimation = m_pCurAnimation; m_pCurAnimation = pInfo->m_pAnimation; if( m_pCurAnimation == NULL ) { m_pCurAnimation = pCurAnimation; return; } m_szCurAniName = p_szAniName; if( m_nLoopTime > 0 ) { m_nLoopTime = p_nLoops + m_pCurAnimation->getLoops(); } else { m_nLoopTime = p_nLoops; } if( m_pCurAnimation == pCurAnimation ) { if( p_bForceUpdate ) { m_fSpeed = p_fSpeed; m_fTime = 0.0f; m_nNextFrame = 0; m_bIsNewLoop = true; m_eState = eAnimState_Normal; } return; } m_vecAniCallbacks.clear(); unsigned int unSize = pInfo->m_vecCallbacks.size(); for( unsigned int i = 0; i < unSize; ++i ) { m_vecAniCallbacks.push_back( pInfo->m_vecCallbacks[i] ); } m_fSpeed = p_fSpeed; m_fTime = 0.0f; m_nNextFrame = 0; m_bIsNewLoop = true; m_eState = eAnimState_Normal; m_vecFrameTimes.clear(); CCSprite* pSprite = dynamic_cast<CCSprite*>( m_pTarget ); if( pSprite != NULL ) { pSprite->setFlipX( pInfo->m_bIsFlipX ); pSprite->setFlipY( pInfo->m_bIsFlipY ); } // 设置时间分割 float fSingleDuration = m_pCurAnimation->getDuration(); CCArray* pFrames = m_pCurAnimation->getFrames(); CCARRAY_VERIFY_TYPE( pFrames, CCAnimationFrame* ); m_vecFrameTimes.reserve( pFrames->count() ); float fAccumUnitsOfTime = 0; float fNewUnitOfTime = fSingleDuration / m_pCurAnimation->getTotalDelayUnits(); CCObject* pObj = NULL; CCARRAY_FOREACH( pFrames, pObj ) { CCAnimationFrame* pFrame = (CCAnimationFrame*)pObj; float fValue = (fAccumUnitsOfTime * fNewUnitOfTime); // / fSingleDuration fAccumUnitsOfTime += pFrame->getDelayUnits(); m_vecFrameTimes.push_back( fValue ); }