文章撰寫日期︰2013/04/14 16:00 文章修改時間︰2013/06/30 09:52 文章撰寫日期︰文章修改次數︰2 cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1
一、問題
今天在使用cocosBuilder時,執行程式遇到了unsupported property now的錯誤。
二、解決辦法
我使用的cocosBuilder版本為2.1
cocos2d-x版本為2.0.4
原來是因為這一版的CCBReader(cocos2d-x官方內建的cocosBuilder解析器),
官方忘了將物件visible的屬性判斷寫進來。
只要在libs\extentions\CCBReader\CCBAnimationManager.cpp的setAnimatedProperty函式
加上以下的code即可解決
//加入以下的code else if (strcmp(pPropName, "visible") == 0) { bool visible = ((CCBValue*)pValue)->getBoolValue(); ((CCSprite*)pNode)->setVisible(visible); }這是cocos2d-x 2.0.4版CCBAnimationManager.cpp->setAnimatedProperty函式最後的樣子
void CCBAnimationManager::setAnimatedProperty(const char *pPropName, CCNode *pNode, CCObject *pValue, float fTweenDuraion) { if (fTweenDuraion > 0) { // Create a fake keyframe to generate the action from CCBKeyframe *kf1 = new CCBKeyframe(); kf1->autorelease(); kf1->setValue(pValue); kf1->setTime(fTweenDuraion); kf1->setEasingType(kCCBKeyframeEasingLinear); // Animate CCActionInterval *tweenAction = getAction(NULL, kf1, pPropName, pNode); pNode->runAction(tweenAction); } else { // Just set the value if (strcmp(pPropName, "position") == 0) { // Get position type CCArray *array = (CCArray*)getBaseValue(pNode, pPropName); int type = ((CCBValue*)array->objectAtIndex(2))->getIntValue(); // Get relative position CCArray *value = (CCArray*)pValue; float x = ((CCBValue*)value->objectAtIndex(0))->getFloatValue(); float y = ((CCBValue*)value->objectAtIndex(1))->getFloatValue(); pNode->setPosition(getAbsolutePosition(ccp(x,y), type, getContainerSize(pNode->getParent()), pPropName)); } else if (strcmp(pPropName, "scale") == 0) { // Get scale type CCArray *array = (CCArray*)getBaseValue(pNode, pPropName); int type = ((CCBValue*)array->objectAtIndex(2))->getIntValue(); // Get relative scale CCArray *value = (CCArray*)pValue; float x = ((CCBValue*)value->objectAtIndex(0))->getFloatValue(); float y = ((CCBValue*)value->objectAtIndex(1))->getFloatValue(); setRelativeScale(pNode, x, y, type, pPropName); } else { // [node setValue:value forKey:name]; // TODO only handle rotation, opacity, displayFrame, color if (strcmp(pPropName, "rotation") == 0) { float rotate = ((CCBValue*)pValue)->getFloatValue(); pNode->setRotation(rotate); } else if (strcmp(pPropName, "opacity") == 0) { int opacity = ((CCBValue*)pValue)->getByteValue(); (dynamic_cast記得,(pNode))->setOpacity(opacity); } else if (strcmp(pPropName, "displayFrame") == 0) { ((CCSprite*)pNode)->setDisplayFrame((CCSpriteFrame*)pValue); } else if (strcmp(pPropName, "color") == 0) { ccColor3BWapper *color = (ccColor3BWapper*)pValue; ((CCSprite*)pNode)->setColor(color->getColor()); } //加入以下的code else if (strcmp(pPropName, "visible") == 0) { bool visible = ((CCBValue*)pValue)->getBoolValue(); ((CCSprite*)pNode)->setVisible(visible); } else { CCLog("unsupported property name is %s", pPropName); CCAssert(false, "unsupported property now"); } } } }
除了專案裡的extension\CCBReader\CCBAnimationManager.cpp要改以外,
cocos2dx安裝目錄底下extensions/CCBReader\CCBAnimationManager.cpp也要改,
Android那邊才會顯示正常。
沒有留言 :
張貼留言