void CCTween::play(CCMovementBoneData *movementBoneData, int durationTo, int durationTween, int loop, int tweenEasing) { CCProcessBase::play(durationTo, durationTween, loop, tweenEasing); if (loop) { m_eLoopType = ANIMATION_TO_LOOP_FRONT; } else { m_eLoopType = ANIMATION_NO_LOOP; } m_iTotalDuration = 0; m_iBetweenDuration = 0; m_iFromIndex = m_iToIndex = 0; bool difMovement = movementBoneData != m_pMovementBoneData; setMovementBoneData(movementBoneData); m_iRawDuration = m_pMovementBoneData->duration; CCFrameData *nextKeyFrame = m_pMovementBoneData->getFrameData(0); m_pTweenData->displayIndex = nextKeyFrame->displayIndex; if (m_pBone->getArmature()->getArmatureData()->dataVersion >= VERSION_COMBINED) { CCTransformHelp::nodeSub(*m_pTweenData, *m_pBone->getBoneData()); m_pTweenData->scaleX += 1; m_pTweenData->scaleY += 1; } if (m_iRawDuration == 0 || m_pMovementBoneData->frameList.count() == 1) { m_eLoopType = SINGLE_FRAME; if(durationTo == 0) { setBetween(nextKeyFrame, nextKeyFrame); } else { setBetween(m_pTweenData, nextKeyFrame); } m_eFrameTweenEasing = Linear; } else if (m_pMovementBoneData->frameList.count() > 1) { m_iDurationTween = durationTween * m_pMovementBoneData->scale; if (loop && m_pMovementBoneData->delay != 0) { setBetween(m_pTweenData, tweenNodeTo(updateFrameData(1 - m_pMovementBoneData->delay), m_pBetween)); } else { if (!difMovement || durationTo == 0) { setBetween(nextKeyFrame, nextKeyFrame); } else { setBetween(m_pTweenData, nextKeyFrame); } } } tweenNodeTo(0); }
void Tween::play(MovementBoneData *movementBoneData, int durationTo, int durationTween, int loop, int tweenEasing) { ProcessBase::play(durationTo, durationTween, loop, tweenEasing); if (loop) { _loopType = ANIMATION_TO_LOOP_FRONT; } else { _loopType = ANIMATION_NO_LOOP; } _totalDuration = 0; _betweenDuration = 0; _fromIndex = _toIndex = 0; bool difMovement = movementBoneData != _movementBoneData; setMovementBoneData(movementBoneData); _rawDuration = _movementBoneData->duration; FrameData *nextKeyFrame = _movementBoneData->getFrameData(0); _tweenData->displayIndex = nextKeyFrame->displayIndex; if (_bone->getArmature()->getArmatureData()->dataVersion >= VERSION_COMBINED) { TransformHelp::nodeSub(*_tweenData, *_bone->getBoneData()); _tweenData->scaleX += 1; _tweenData->scaleY += 1; } if (_rawDuration == 0 ) { _loopType = SINGLE_FRAME; if(durationTo == 0) { setBetween(nextKeyFrame, nextKeyFrame); } else { setBetween(_tweenData, nextKeyFrame); } _frameTweenEasing = Linear; } else if (_movementBoneData->frameList.size() > 1) { _durationTween = durationTween * _movementBoneData->scale; if (loop && _movementBoneData->delay != 0) { setBetween(_tweenData, tweenNodeTo(updateFrameData(1 - _movementBoneData->delay), _between)); } else { if (!difMovement || durationTo == 0) { setBetween(nextKeyFrame, nextKeyFrame); } else { setBetween(_tweenData, nextKeyFrame); } } } tweenNodeTo(0); }
void CCTween::updateHandler() { if (m_fCurrentPercent >= 1) { switch(m_eLoopType) { case SINGLE_FRAME: { m_fCurrentPercent = 1; m_bIsComplete = true; m_bIsPlaying = false; } break; case ANIMATION_NO_LOOP: { m_eLoopType = ANIMATION_MAX; if (m_iDurationTween <= 0) { m_fCurrentPercent = 1; } else { m_fCurrentPercent = (m_fCurrentPercent - 1) * m_iNextFrameIndex / m_iDurationTween; } if (m_fCurrentPercent >= 1) { m_fCurrentPercent = 1; m_bIsComplete = true; m_bIsPlaying = false; break; } else { m_iNextFrameIndex = m_iDurationTween; m_fCurrentFrame = m_fCurrentPercent * m_iNextFrameIndex; m_iTotalDuration = 0; m_iBetweenDuration = 0; m_iFromIndex = m_iToIndex = 0; break; } } break; case ANIMATION_TO_LOOP_FRONT: { m_eLoopType = ANIMATION_LOOP_FRONT; m_iNextFrameIndex = m_iDurationTween > 0 ? m_iDurationTween : 1; if (m_pMovementBoneData->delay != 0) { // m_fCurrentFrame = (1 - m_pMovementBoneData->delay) * (float)m_iNextFrameIndex; m_fCurrentPercent = m_fCurrentFrame / m_iNextFrameIndex; } else { m_fCurrentPercent = 0; m_fCurrentFrame = 0; } m_iTotalDuration = 0; m_iBetweenDuration = 0; m_iFromIndex = m_iToIndex = 0; } break; case ANIMATION_MAX: { m_fCurrentPercent = 1; m_bIsComplete = true; m_bIsPlaying = false; } break; default: { m_fCurrentFrame = fmodf(m_fCurrentFrame, m_iNextFrameIndex); m_iTotalDuration = 0; m_iBetweenDuration = 0; m_iFromIndex = m_iToIndex = 0; } break; } } if (m_fCurrentPercent < 1 && m_eLoopType <= ANIMATION_TO_LOOP_BACK) { m_fCurrentPercent = sin(m_fCurrentPercent * CC_HALF_PI); } float percent = m_fCurrentPercent; if (m_eLoopType > ANIMATION_TO_LOOP_BACK) { percent = updateFrameData(percent); } if(m_eFrameTweenEasing != TWEEN_EASING_MAX) { tweenNodeTo(percent); } }
void Tween::updateHandler() { if (_currentPercent >= 1) { switch(_loopType) { case SINGLE_FRAME: { _currentPercent = 1; _isComplete = true; _isPlaying = false; } break; case ANIMATION_NO_LOOP: { _loopType = ANIMATION_MAX; if (_durationTween <= 0) { _currentPercent = 1; } else { _currentPercent = (_currentPercent - 1) * _nextFrameIndex / _durationTween; } if (_currentPercent >= 1) { _currentPercent = 1; _isComplete = true; _isPlaying = false; break; } else { _nextFrameIndex = _durationTween; _currentFrame = _currentPercent * _nextFrameIndex; _totalDuration = 0; _betweenDuration = 0; _fromIndex = _toIndex = 0; break; } } break; case ANIMATION_TO_LOOP_FRONT: { _loopType = ANIMATION_LOOP_FRONT; _nextFrameIndex = _durationTween > 0 ? _durationTween : 1; if (_movementBoneData->delay != 0) { // _currentFrame = (1 - _movementBoneData->delay) * (float)_nextFrameIndex; _currentPercent = _currentFrame / _nextFrameIndex; } else { _currentPercent = 0; _currentFrame = 0; } _totalDuration = 0; _betweenDuration = 0; _fromIndex = _toIndex = 0; } break; case ANIMATION_MAX: { _currentPercent = 1; _isComplete = true; _isPlaying = false; } break; default: { _currentFrame = fmodf(_currentFrame, _nextFrameIndex); } break; } } if (_currentPercent < 1 && _loopType <= ANIMATION_TO_LOOP_BACK) { _currentPercent = sin(_currentPercent * CC_HALF_PI); } float percent = _currentPercent; if (_loopType > ANIMATION_TO_LOOP_BACK) { percent = updateFrameData(percent); } if(_frameTweenEasing != TWEEN_EASING_MAX) { tweenNodeTo(percent); } }