From a0feb5f2895701a7ae0844182b5ebf5a53ba11cb Mon Sep 17 00:00:00 2001 From: minggo Date: Tue, 18 Sep 2012 17:04:10 +0800 Subject: [PATCH] issue #1470:fix some logical errors --- extensions/CCBReader/CCBAnimationManager.cpp | 16 +++--- extensions/CCBReader/CCBReader.cpp | 11 +++- extensions/CCBReader/CCBReader.h | 4 +- extensions/CCBReader/CCNodeLoader.cpp | 54 ++++---------------- 4 files changed, 30 insertions(+), 55 deletions(-) diff --git a/extensions/CCBReader/CCBAnimationManager.cpp b/extensions/CCBReader/CCBAnimationManager.cpp index 9ba3bad7b1..466617d5c4 100644 --- a/extensions/CCBReader/CCBAnimationManager.cpp +++ b/extensions/CCBReader/CCBAnimationManager.cpp @@ -299,7 +299,7 @@ void CCBAnimationManager::setAnimatedProperty(const char *pPropName, CCNode *pNo } else if (strcmp(pPropName, "scale") == 0) { - // Get position type + // Get scale type CCArray *array = (CCArray*)getBaseValue(pNode, pPropName); int type = ((CCBValue*)array->objectAtIndex(2))->getIntValue(); @@ -314,7 +314,7 @@ void CCBAnimationManager::setAnimatedProperty(const char *pPropName, CCNode *pNo { // [node setValue:value forKey:name]; - // TODO only handle rotation, opacity, + // TODO only handle rotation, opacity, displayFrame, color if (strcmp(pPropName, "rotation") == 0) { float rotate = ((CCBValue*)pValue)->getFloatValue(); @@ -374,7 +374,7 @@ CCActionInterval* CCBAnimationManager::getEaseAction(CCActionInterval *pAction, } else if (nEasingType == kCCBKeyframeEasingCubicOut) { - return CCEaseInOut::create(pAction, fEasingOpt); + return CCEaseOut::create(pAction, fEasingOpt); } else if (nEasingType == kCCBKeyframeEasingCubicInOut) { @@ -485,9 +485,9 @@ void CCBAnimationManager::runAnimations(int nSeqId, float fTweenDuration) CCDictElement* pElement1 = NULL; CCDICT_FOREACH(seqNodeProps, pElement1) { - const char *propNmae = pElement1->getStrKey(); - CCBSequenceProperty *seqProp = (CCBSequenceProperty*)seqNodeProps->objectForKey(propNmae); - seqNodePropNames.insert(propNmae); + const char *propName = pElement1->getStrKey(); + CCBSequenceProperty *seqProp = (CCBSequenceProperty*)seqNodeProps->objectForKey(propName); + seqNodePropNames.insert(propName); setFirstFrame(node, seqProp, fTweenDuration); runAction(node, seqProp, fTweenDuration); @@ -501,13 +501,13 @@ void CCBAnimationManager::runAnimations(int nSeqId, float fTweenDuration) CCDictElement* pElement2 = NULL; CCDICT_FOREACH(nodeBaseValues, pElement2) { - if (seqNodePropNames.find(pElement2->getStrKey()) != seqNodePropNames.end()) + if (seqNodePropNames.find(pElement2->getStrKey()) == seqNodePropNames.end()) { CCObject *value = pElement2->getObject(); if (value) { - setAnimatedProperty(pElement2->getStrKey(), node, value, fTweenDuration); + setAnimatedProperty(pElement2->getStrKey(), node, value, fTweenDuration); } } } diff --git a/extensions/CCBReader/CCBReader.cpp b/extensions/CCBReader/CCBReader.cpp index a2c44f90df..f4718a4731 100644 --- a/extensions/CCBReader/CCBReader.cpp +++ b/extensions/CCBReader/CCBReader.cpp @@ -64,6 +64,7 @@ CCBReader::CCBReader(CCNodeLoaderLibrary * pCCNodeLoaderLibrary, CCBMemberVariab , mCurrentBit(-1) , mOwner(NULL) , mActionManager(NULL) +, mAnimatedProps(NULL) { this->mCCNodeLoaderLibrary = pCCNodeLoaderLibrary; this->mCCNodeLoaderLibrary->retain(); @@ -79,6 +80,7 @@ CCBReader::CCBReader(CCBReader * pCCBReader) , mCurrentBit(-1) , mOwner(NULL) , mActionManager(NULL) +, mAnimatedProps(NULL) { this->mLoadedSpriteSheets = pCCBReader->mLoadedSpriteSheets; this->mCCNodeLoaderLibrary = pCCBReader->mCCNodeLoaderLibrary; @@ -100,6 +102,7 @@ CCBReader::CCBReader() , mCCNodeLoaderListener(NULL) , mCCBMemberVariableAssigner(NULL) , mCCBSelectorResolver(NULL) +, mAnimatedProps(NULL) {} CCBReader::~CCBReader() { @@ -161,7 +164,7 @@ CCBSelectorResolver * CCBReader::getCCBSelectorResolver() { return this->mCCBSelectorResolver; } -set& CCBReader::getAnimatedProperties() +set* CCBReader::getAnimatedProperties() { return mAnimatedProps; } @@ -477,6 +480,7 @@ CCNode * CCBReader::readNodeGraph(CCNode * pParent) { // Read animated properties CCDictionary *seqs = CCDictionary::create(); + mAnimatedProps = new set(); int numSequence = readInt(false); for (int i = 0; i < numSequence; ++i) @@ -493,7 +497,7 @@ CCNode * CCBReader::readNodeGraph(CCNode * pParent) { seqProp->setName(readCachedString()->getCString()); seqProp->setType(readInt(false)); - mAnimatedProps.insert(seqProp->getName()); + mAnimatedProps->insert(seqProp->getName()); int numKeyframes = readInt(false); @@ -569,6 +573,9 @@ CCNode * CCBReader::readNodeGraph(CCNode * pParent) { } } #endif // CCB_ENABLE_JAVASCRIPT + + delete mAnimatedProps; + mAnimatedProps = NULL; /* Read and add children. */ int numChildren = this->readInt(false); diff --git a/extensions/CCBReader/CCBReader.h b/extensions/CCBReader/CCBReader.h index 534e2198dc..a4314e37d2 100644 --- a/extensions/CCBReader/CCBReader.h +++ b/extensions/CCBReader/CCBReader.h @@ -177,7 +177,7 @@ private: CCObject *mOwner; CCBAnimationManager *mActionManager; - std::set mAnimatedProps; + std::set *mAnimatedProps; CCNodeLoaderLibrary *mCCNodeLoaderLibrary; CCNodeLoaderListener *mCCNodeLoaderListener; @@ -214,7 +214,7 @@ public: void setAnimationManager(CCBAnimationManager *pAnimationManager); // Used in CCNodeLoader::parseProperties() - std::set& getAnimatedProperties(); + std::set* getAnimatedProperties(); std::set& getLoadedSpriteSheet(); CCObject* getOwner(); diff --git a/extensions/CCBReader/CCNodeLoader.cpp b/extensions/CCBReader/CCNodeLoader.cpp index ef1c383ba2..de43f437be 100644 --- a/extensions/CCBReader/CCNodeLoader.cpp +++ b/extensions/CCBReader/CCNodeLoader.cpp @@ -3,6 +3,7 @@ #include "CCBMemberVariableAssigner.h" #include "CCBAnimationManager.h" #include "CCData.h" +#include "CCNode+CCBRelativePositioning.h" using namespace std; @@ -322,43 +323,10 @@ CCPoint CCNodeLoader::parsePropTypePosition(CCNode * pNode, CCNode * pParent, CC CCSize containerSize = pCCBReader->getAnimationManager()->getContainerSize(pParent); - switch (type) - { - case kCCBPositionTypeRelativeBottomLeft: - { - /* Nothing. */ - break; - } - case kCCBPositionTypeRelativeTopLeft: - { - y = containerSize.height - y; - break; - } - case kCCBPositionTypeRelativeTopRight: - { - x = containerSize.width - x; - y = containerSize.height - y; - break; - } - case kCCBPositionTypeRelativeBottomRight: - { - x = containerSize.width - x; - break; - } - case kCCBPositionTypePercent: - { - x = (int)(containerSize.width * x / 100.0f); - y = (int)(containerSize.height * y / 100.0f); - break; - } - case kCCBPositionTypeMultiplyResolution: - { - x *= CCBReader::getResolutionScale(); - y *= CCBReader::getResolutionScale(); - } - } + CCPoint pt = getAbsolutePosition(ccp(x,y), type, containerSize, pPropertyName); + pNode->setPosition(getAbsolutePosition(pt, type, containerSize, pPropertyName));; - if (pCCBReader->getAnimatedProperties().find(pPropertyName) != pCCBReader->getAnimatedProperties().end()) + if (pCCBReader->getAnimatedProperties()->find(pPropertyName) != pCCBReader->getAnimatedProperties()->end()) { CCArray *baseValue = CCArray::create(CCBValue::create(x), CCBValue::create(y), @@ -367,7 +335,7 @@ CCPoint CCNodeLoader::parsePropTypePosition(CCNode * pNode, CCNode * pParent, CC pCCBReader->getAnimationManager()->setBaseValue(baseValue, pNode, pPropertyName); } - return CCPoint(x, y); + return pt; } CCPoint CCNodeLoader::parsePropTypePoint(CCNode * pNode, CCNode * pParent, CCBReader * pCCBReader) @@ -452,7 +420,7 @@ float * CCNodeLoader::parsePropTypeScaleLock(CCNode * pNode, CCNode * pParent, C scaleLock[0] = x; scaleLock[1] = y; - if (pCCBReader->getAnimatedProperties().find(pPropertyName) != pCCBReader->getAnimatedProperties().end()) + if (pCCBReader->getAnimatedProperties()->find(pPropertyName) != pCCBReader->getAnimatedProperties()->end()) { CCArray *baseValue = CCArray::create(CCBValue::create(x), CCBValue::create(y), @@ -470,7 +438,7 @@ float CCNodeLoader::parsePropTypeFloat(CCNode * pNode, CCNode * pParent, CCBRead float CCNodeLoader::parsePropTypeDegrees(CCNode * pNode, CCNode * pParent, CCBReader * pCCBReader, const char *pPropertyName) { float ret = pCCBReader->readFloat(); - if (pCCBReader->getAnimatedProperties().find(pPropertyName) != pCCBReader->getAnimatedProperties().end()) + if (pCCBReader->getAnimatedProperties()->find(pPropertyName) != pCCBReader->getAnimatedProperties()->end()) { CCBValue *value = CCBValue::create(ret); pCCBReader->getAnimationManager()->setBaseValue(value, pNode, pPropertyName); @@ -519,7 +487,7 @@ bool CCNodeLoader::parsePropTypeCheck(CCNode * pNode, CCNode * pParent, CCBReade { bool ret = pCCBReader->readBool(); - if (pCCBReader->getAnimatedProperties().find(pPropertyName) != pCCBReader->getAnimatedProperties().end()) + if (pCCBReader->getAnimatedProperties()->find(pPropertyName) != pCCBReader->getAnimatedProperties()->end()) { CCBValue *value = CCBValue::create(ret); pCCBReader->getAnimationManager()->setBaseValue(value, pNode, pPropertyName); @@ -557,7 +525,7 @@ CCSpriteFrame * CCNodeLoader::parsePropTypeSpriteFrame(CCNode * pNode, CCNode * spriteFrame = frameCache->spriteFrameByName(spriteFile->getCString()); } - if (pCCBReader->getAnimatedProperties().find(pPropertyName) != pCCBReader->getAnimatedProperties().end()) + if (pCCBReader->getAnimatedProperties()->find(pPropertyName) != pCCBReader->getAnimatedProperties()->end()) { pCCBReader->getAnimationManager()->setBaseValue(spriteFrame, pNode, pPropertyName); } @@ -607,7 +575,7 @@ unsigned char CCNodeLoader::parsePropTypeByte(CCNode * pNode, CCNode * pParent, { unsigned char ret = pCCBReader->readByte(); - if (pCCBReader->getAnimatedProperties().find(pPropertyName) != pCCBReader->getAnimatedProperties().end()) + if (pCCBReader->getAnimatedProperties()->find(pPropertyName) != pCCBReader->getAnimatedProperties()->end()) { pCCBReader->getAnimationManager()->setBaseValue(CCBValue::create(ret), pNode, pPropertyName); } @@ -621,7 +589,7 @@ ccColor3B CCNodeLoader::parsePropTypeColor3(CCNode * pNode, CCNode * pParent, CC unsigned char blue = pCCBReader->readByte(); ccColor3B color = { red, green, blue }; - if (pCCBReader->getAnimatedProperties().find(pPropertyName) != pCCBReader->getAnimatedProperties().end()) + if (pCCBReader->getAnimatedProperties()->find(pPropertyName) != pCCBReader->getAnimatedProperties()->end()) { ccColor3BWapper *value = ccColor3BWapper::create(color); pCCBReader->getAnimationManager()->setBaseValue(value, pNode, pPropertyName);