目前这个问题有些博客上有解决方案,不过并不完美。
http://jetion.diandian.com/post/2012-12-04/40047798280
如这位的解决方案
这样可以解决根节点的动画与2dx的action同时运作,但是无法解决子节点的问题。
完整的修改方案还需要增加这个部分的修改
void CCBAnimationManager::runAction(CCNode *pNode, CCBSequenceProperty *pSeqProp, float fTweenDuration) { CCArray *keyframes = pSeqProp->getKeyframes(); int numKeyframes = keyframes->count(); if (numKeyframes > 1) { // Make an animation! CCArray *actions = CCArray::create(); CCBKeyframe *keyframeFirst = (CCBKeyframe*)keyframes->objectAtIndex(0); float timeFirst = keyframeFirst->getTime() + fTweenDuration; if (timeFirst > 0) { actions->addObject(CCDelayTime::create(timeFirst)); } for (int i = 0; i < numKeyframes - 1; ++i) { CCBKeyframe *kf0 = (CCBKeyframe*)keyframes->objectAtIndex(i); CCBKeyframe *kf1 = (CCBKeyframe*)keyframes->objectAtIndex(i+1); CCActionInterval *action = getAction(kf0, kf1, pSeqProp->getName(), pNode); if (action) { // Apply easing action = getEaseAction(action, kf0->getEasingType(), kf0->getEasingOpt()); actions->addObject(action); } } CCFiniteTimeAction *seq = CCSequence::create(actions); // 修改 const int childActionTag = 200; seq->setTag(childActionTag); pNode->runAction(seq); } }
void CCBAnimationManager::runAnimationsForSequenceIdTweenDuration(int nSeqId, float fTweenDuration) { CCAssert(nSeqId != -1, "Sequence id couldn't be found"); // 修改部分 const int currentActionTag = 1000; mRootNode->stopActionByTag(currentActionTag); //mRootNode->stopAllActions(); CCDictElement* pElement = NULL; CCDICT_FOREACH(mNodeSequences, pElement) { CCNode *node = (CCNode*)pElement->getIntKey(); // 修改部分 const int childActionTag = 200; node->stopActionByTag(childActionTag); //node->stopAllActions(); // Refer to CCBReader::readKeyframe() for the real type of value CCDictionary *seqs = (CCDictionary*)pElement->getObject(); CCDictionary *seqNodeProps = (CCDictionary*)seqs->objectForKey(nSeqId); set<string> seqNodePropNames; if (seqNodeProps) { // Reset nodes that have sequence node properties, and run actions on them CCDictElement* pElement1 = NULL; CCDICT_FOREACH(seqNodeProps, pElement1) { const char *propName = pElement1->getStrKey(); CCBSequenceProperty *seqProp = (CCBSequenceProperty*)seqNodeProps->objectForKey(propName); seqNodePropNames.insert(propName); setFirstFrame(node, seqProp, fTweenDuration); runAction(node, seqProp, fTweenDuration); } } // Reset the nodes that may have been changed by other timelines CCDictionary *nodeBaseValues = (CCDictionary*)mBaseValues->objectForKey(pElement->getIntKey()); if (nodeBaseValues) { CCDictElement* pElement2 = NULL; CCDICT_FOREACH(nodeBaseValues, pElement2) { if (seqNodePropNames.find(pElement2->getStrKey()) == seqNodePropNames.end()) { CCObject *value = pElement2->getObject(); if (value) { setAnimatedProperty(pElement2->getStrKey(), node, value, fTweenDuration); } } } } } // Make callback at end of sequence CCBSequence *seq = getSequence(nSeqId); CCAction *completeAction = CCSequence::createWithTwoActions(CCDelayTime::create(seq->getDuration() + fTweenDuration), CCCallFunc::create(this, callfunc_selector(CCBAnimationManager::sequenceCompleted))); // 修改部分 completeAction->setTag(currentActionTag); mRootNode->runAction(completeAction); // Set the running scene if(seq->getCallbackChannel() != NULL) { CCAction* action = (CCAction *)actionForCallbackChannel(seq->getCallbackChannel()); if(action != NULL) { mRootNode->runAction(action); } } if(seq->getSoundChannel() != NULL) { CCAction* action = (CCAction *)actionForSoundChannel(seq->getSoundChannel()); if(action != NULL) { mRootNode->runAction(action); } } mRunningSequence = getSequence(nSeqId); }