void ArmatureAnimation::setAnimationScale(float animationScale ) { if(animationScale == _animationScale) { return; } _animationScale = animationScale; DictElement *element = NULL; Dictionary *dict = _armature->getBoneDic(); CCDICT_FOREACH(dict, element) { Bone *bone = (Bone *)element->getObject(); bone->getTween()->setAnimationScale(_animationScale); if (bone->getChildArmature()) { bone->getChildArmature()->getAnimation()->setAnimationScale(_animationScale); } }
void ArmatureAnimation::setSpeedScale(float speedScale) { if(speedScale == _speedScale) { return; } _speedScale = speedScale; _processScale = !_movementData ? _speedScale : _speedScale * _movementData->scale; const Map<std::string, Bone*>& map = _armature->getBoneDic(); for(auto& element : map) { Bone *bone = element.second; bone->getTween()->setProcessScale(_processScale); if (bone->getChildArmature()) { bone->getChildArmature()->getAnimation()->setSpeedScale(_processScale); } } }
void ArmatureAnimation::setSpeedScale(float speedScale) { if(speedScale == _speedScale) { return; } _speedScale = speedScale; _processScale = !_movementData ? _speedScale : _speedScale * _movementData->scale; DictElement *element = NULL; Dictionary *dict = _armature->getBoneDic(); CCDICT_FOREACH(dict, element) { Bone *bone = static_cast<Bone*>(element->getObject()); bone->getTween()->setProcessScale(_processScale); if (bone->getChildArmature()) { bone->getChildArmature()->getAnimation()->setProcessScale(_processScale); } }
void ArmatureAnimation::play(const std::string& animationName, int durationTo, int loop) { if (animationName.empty()) { CCLOG("_animationData can not be null"); return; } // CCASSERT(_animationData, "_animationData can not be null"); _movementData = _animationData->getMovement(animationName); if (nullptr == _movementData) { CCLOG("_movementData can not be null"); return; } // CCASSERT(_movementData, "_movementData can not be null"); //! Get key frame count _rawDuration = _movementData->duration; _movementID = animationName; _processScale = _speedScale * _movementData->scale; //! Further processing parameters durationTo = (durationTo == -1) ? _movementData->durationTo : durationTo; int durationTween = _movementData->durationTween == 0 ? _rawDuration : _movementData->durationTween; cocos2d::tweenfunc::TweenType tweenEasing = _movementData->tweenEasing; loop = (loop < 0) ? _movementData->loop : loop; _onMovementList = false; ProcessBase::play(durationTo, durationTween, loop, tweenEasing); if (_rawDuration == 0) { _loopType = SINGLE_FRAME; } else { if (loop) { _loopType = ANIMATION_TO_LOOP_FRONT; } else { _loopType = ANIMATION_NO_LOOP; } _durationTween = durationTween; } MovementBoneData *movementBoneData = nullptr; _tweenList.clear(); const Map<std::string, Bone*>& map = _armature->getBoneDic(); for(auto& element : map) { Bone *bone = element.second; movementBoneData = static_cast<MovementBoneData *>(_movementData->movBoneDataDic.at(bone->getName())); Tween *tween = bone->getTween(); if(movementBoneData && movementBoneData->frameList.size() > 0) { _tweenList.push_back(tween); movementBoneData->duration = _movementData->duration; tween->play(movementBoneData, durationTo, durationTween, loop, tweenEasing); tween->setProcessScale(_processScale); if (bone->getChildArmature()) { bone->getChildArmature()->getAnimation()->setSpeedScale(_processScale); } } else { if(!bone->isIgnoreMovementBoneData()) { //! this bone is not include in this movement, so hide it bone->getDisplayManager()->changeDisplayWithIndex(-1, false); tween->stop(); } } } _armature->update(0); }