bool CCArmature::init(const char *name) { bool bRet = false; do { removeAllChildren(); CC_SAFE_DELETE(m_pAnimation); m_pAnimation = new CCArmatureAnimation(); m_pAnimation->init(this); CC_SAFE_DELETE(m_pBoneDic); m_pBoneDic = new CCDictionary(); CC_SAFE_DELETE(m_pTopBoneList); m_pTopBoneList = new CCArray(); m_pTopBoneList->init(); CC_SAFE_DELETE(m_pTextureAtlasDic); m_pTextureAtlasDic = new CCDictionary(); m_sBlendFunc.src = CC_BLEND_SRC; m_sBlendFunc.dst = CC_BLEND_DST; m_strName = name == NULL ? "" : name; CCArmatureDataManager *armatureDataManager = CCArmatureDataManager::sharedArmatureDataManager(); if(m_strName.length() != 0) { m_strName = name; CCAnimationData *animationData = armatureDataManager->getAnimationData(name); CCAssert(animationData, "CCAnimationData not exist! "); m_pAnimation->setAnimationData(animationData); CCArmatureData *armatureData = armatureDataManager->getArmatureData(name); CCAssert(armatureData, ""); m_pArmatureData = armatureData; CCDictElement *_element = NULL; CCDictionary *boneDataDic = &armatureData->boneDataDic; CCDICT_FOREACH(boneDataDic, _element) { CCBone *bone = createBone(_element->getStrKey()); //! init bone's CCTween to 1st movement's 1st frame do { CCMovementData *movData = animationData->getMovement(animationData->movementNames.at(0).c_str()); CC_BREAK_IF(!movData); CCMovementBoneData *movBoneData = movData->getMovementBoneData(bone->getName().c_str()); CC_BREAK_IF(!movBoneData || movBoneData->frameList.count() <= 0); CCFrameData *frameData = movBoneData->getFrameData(0); CC_BREAK_IF(!frameData); bone->getTweenData()->copy(frameData); bone->changeDisplayWithIndex(frameData->displayIndex, false); } while (0); } update(0); updateOffsetPoint(); }
CCMovementData *CCDataReaderHelper::decodeMovement(tinyxml2::XMLElement *movementXML, CCArmatureData *armatureData) { const char *movName = movementXML->Attribute(A_NAME); CCMovementData *movementData = CCMovementData::create(); movementData->name = movName; int duration, durationTo, durationTween, loop, tweenEasing = 0; if( movementXML->QueryIntAttribute(A_DURATION, &(duration)) == tinyxml2::XML_SUCCESS) { movementData->duration = duration; } if( movementXML->QueryIntAttribute(A_DURATION_TO, &(durationTo)) == tinyxml2::XML_SUCCESS) { movementData->durationTo = durationTo; } if( movementXML->QueryIntAttribute(A_DURATION_TWEEN, &(durationTween)) == tinyxml2::XML_SUCCESS) { movementData->durationTween = durationTween; } if( movementXML->QueryIntAttribute(A_LOOP, &(loop)) == tinyxml2::XML_SUCCESS) { movementData->loop = (bool)loop; } const char *_easing = movementXML->Attribute(A_TWEEN_EASING); if(_easing != NULL) { std::string str = _easing; if(str.compare(FL_NAN) != 0) { if( movementXML->QueryIntAttribute(A_TWEEN_EASING, &(tweenEasing)) == tinyxml2::XML_SUCCESS) { movementData->tweenEasing = (CCTweenType)tweenEasing; } } else { movementData->tweenEasing = TWEEN_EASING_MAX; } } tinyxml2::XMLElement *movBoneXml = movementXML->FirstChildElement(BONE); while(movBoneXml) { const char *boneName = movBoneXml->Attribute(A_NAME); if (movementData->getMovementBoneData(boneName)) { movBoneXml = movBoneXml->NextSiblingElement(); continue; } CCBoneData *boneData = (CCBoneData *)armatureData->getBoneData(boneName); std::string parentName = boneData->parentName; tinyxml2::XMLElement *parentXml = NULL; if (parentName.length() != 0) { parentXml = movementXML->FirstChildElement(BONE); while (parentXml) { if (parentName.compare(parentXml->Attribute(A_NAME)) == 0) { break; } parentXml = parentXml->NextSiblingElement(BONE); } } CCMovementBoneData *_moveBoneData = decodeMovementBone(movBoneXml, parentXml, boneData); movementData->addMovementBoneData(_moveBoneData); movBoneXml = movBoneXml->NextSiblingElement(BONE); } return movementData; }