void resizeChildren(Node* parentNode, Node* resizeNode, float usedScale, int depth) { Vector<Node*> nodeChildren = resizeNode->getChildren(); for(auto node : nodeChildren) { node->setPosition(node->getPosition() * usedScale); if(isKindOfClass(node, Label)) { Label* label = (Label*)node; label->setSystemFontSize(label->getSystemFontSize() * usedScale); /*TTFConfig newConfig = label->getTTFConfig(); newConfig.fontSize *= usedScale; label->setTTFConfig(newConfig);*/ label->setDimensions(label->getDimensions().width * usedScale, label->getDimensions().height * usedScale); #if VERBOSE_LOAD_CCB CCLOG("label font : %s, size : %f, scale : %f, parent node scale : %f, dimensions : %f, %f, depth : %d", label->getSystemFontName().c_str(), label->getSystemFontSize(), label->getScale(), parentNode->getScale(), label->getDimensions().width, label->getDimensions().height, depth); #endif } else if(isKindOfClass(node, CustomInput)) { CustomInput* input = (CustomInput*)node; input->setFontSize((float)input->getFontSize() * usedScale); input->setPreferredSize(Size(input->getPreferredSize().width * usedScale, input->getPreferredSize().height * usedScale)); #if VERBOSE_LOAD_CCB CCLOG("input font size : %d, parent node scale : %f, dimensions : %f, %f, depth : %d", input->getFontSize(), parentNode->getScale(), input->getPreferredSize().width, input->getPreferredSize().height, depth); #endif } else if(isKindOfClass(node, Sprite)) { } else if(isKindOfClass(node, ui::Scale9Sprite)) { ui::Scale9Sprite* sprite = (ui::Scale9Sprite*)node; sprite->setContentSize(SizeMult(node->getContentSize(), usedScale)); sprite->setInsetBottom(sprite->getInsetBottom() * usedScale); sprite->setInsetLeft(sprite->getInsetRight() * usedScale); sprite->setInsetRight(sprite->getInsetRight() * usedScale); sprite->setInsetTop(sprite->getInsetTop() * usedScale); } else //Panel { node->setContentSize(SizeMult(node->getContentSize(), usedScale)); if(!node->getChildren().empty()) { resizeChildren(parentNode, node, usedScale, depth+1); } } } }
Panel* loadCCBFromFileToFenneX(const char* file, const char* inPanel, int zIndex) { if(inPanel == NULL) { animManagers.clear(); } NodeLoaderLibrary * nodeLoaderLibrary = NodeLoaderLibrary::newDefaultNodeLoaderLibrary(); nodeLoaderLibrary->registerNodeLoader("CustomSprite", CustomSpriteLoader::loader()); nodeLoaderLibrary->registerNodeLoader("CustomScaleSprite", CustomScaleSpriteLoader::loader()); nodeLoaderLibrary->registerNodeLoader("CustomNode", CustomNodeLoader::loader()); nodeLoaderLibrary->registerNodeLoader("CustomInput", CustomInputLoader::loader()); nodeLoaderLibrary->registerNodeLoader("CustomLabel", CustomLabelLoader::loader()); nodeLoaderLibrary->registerNodeLoader("CustomDropDownList", CustomDropDownListLoader::loader()); CCBReader *ccbReader = new CCBReader(nodeLoaderLibrary); //IF this one fail, it needs to be silent bool shouldNotify = FileUtils::getInstance()->isPopupNotify(); FileUtils::getInstance()->setPopupNotify(false); #if VERBOSE_PERFORMANCE_TIME timeval startTime; gettimeofday(&startTime, NULL); #endif std::string filePath = ScreateF("%s%s.ccbi", file, isPhone ? "-phone" : "")->getCString(); CCLOG("Filepath : %s", filePath.c_str()); FileUtils::getInstance()->setPopupNotify(shouldNotify); Node* myNode = NULL; if(FileUtils::getInstance()->isFileExist(filePath)) { CCLOG("File exist"); myNode = ccbReader->readNodeGraphFromFile(filePath.c_str()); } else if(isPhone) { myNode = ccbReader->readNodeGraphFromFile(ScreateF("%s.ccbi", file)->getCString()); } #if VERBOSE_PERFORMANCE_TIME timeval middleTime; gettimeofday(&middleTime, NULL); CCLOG("CCBReader loaded file %s in %f ms", file, getTimeDifferenceMS(startTime, middleTime)); #endif //Despite cocosbuilder saying so, Label and Node (for Panel) aren't resized properly, so there it is /*Size frameSize = Director::getInstance()->getWinSize(); float scaleX = (float)frameSize.width / designResolutionSize.width; float scaleY = (float)frameSize.height / designResolutionSize.height; float scale = MAX(scaleX, scaleY); float minScale = MIN(scaleX, scaleY); CCLOG("min : %f, max : %f, loading : %f", minScale, scale, _loadingScale);*/ float usedScale = _loadingScale; //this code is dubious at best .... refactor it later #if VERBOSE_LOAD_CCB CCLOG("ccb file %s loaded, doing rescaling ...", file); #endif for(auto node : myNode->getChildren()) { //Note : Panels are never tested against isKindOfClass because : //against Node, all nodes return true //against CustomNode, a tagging is required on cocosBuilder //Depth 0 of nesting if(isKindOfClass(node, Label)) { Label* label = (Label*)node; #if VERBOSE_LOAD_CCB CCLOG("label font : %s", label->getSystemFontName().c_str()); #endif label->setSystemFontSize(label->getSystemFontSize() * usedScale); /*TTFConfig newConfig = label->getTTFConfig(); newConfig.fontSize *= usedScale; label->setTTFConfig(newConfig);*/ } else if(isKindOfClass(node, CustomInput)) { } else if(isKindOfClass(node, Sprite) || isKindOfClass(node, ui::Scale9Sprite)) { } else if(!node->getChildren().empty())//Panel { node->setScaleX(node->getScaleX()*usedScale); node->setScaleY(node->getScaleY()*usedScale); Node* parentNode = node; for(auto nodeChild : node->getChildren()) { //Depth 1 is a special case too, because nodes don't have to be moved and the scale is not calculated the same way if(isKindOfClass(nodeChild, Label)) { Label* label = (Label*)nodeChild; label->setScale(label->getScale() / parentNode->getScale()); label->setSystemFontSize(label->getSystemFontSize() * parentNode->getScale()); /*TTFConfig newConfig = label->getTTFConfig(); newConfig.fontSize *= parentNode->getScale(); label->setTTFConfig(newConfig);*/ #if VERBOSE_LOAD_CCB CCLOG("label font : %s, size : %f, scale : %f, parent node scale : %f, dimensions : %f, %f, depth 1", label->getSystemFontName().c_str(), label->getSystemFontSize(), label->getScale(), parentNode->getScale(), label->getDimensions().width, label->getDimensions().height); #endif } else if(isKindOfClass(nodeChild, CustomInput)) { //input->setFontSize((float)input->getFontSize() / usedScale); //input->setPreferredSize(Size(input->getPreferredSize().width / usedScale, input->getPreferredSize().height / usedScale)); //input->setFontSize((float)input->getFontSize() * parentNode->getScale()); #if VERBOSE_LOAD_CCB CustomInput* input = (CustomInput*)nodeChild; CCLOG("input font size : %d, parent node scale : %f, dimensions : %f, %f, depth 1", input->getFontSize() , parentNode->getScale(), input->getPreferredSize().width, input->getPreferredSize().height); #endif } else if(isKindOfClass(nodeChild, Sprite)) { nodeChild->setScaleX(nodeChild->getScaleX() / usedScale); nodeChild->setScaleY(nodeChild->getScaleY() / usedScale); } else if(isKindOfClass(nodeChild, ui::Scale9Sprite)) { nodeChild->setScaleX(nodeChild->getScaleX() / usedScale); nodeChild->setScaleY(nodeChild->getScaleY() / usedScale); nodeChild->setContentSize(SizeMult(nodeChild->getContentSize(), usedScale)); } else if(!nodeChild->getChildren().empty())//Panel { nodeChild->setScaleX(nodeChild->getScaleX() / usedScale); nodeChild->setScaleY(nodeChild->getScaleY() / usedScale); nodeChild->setContentSize(SizeMult(nodeChild->getContentSize(), usedScale)); //For depth 2 and more, the algorithm is the same resizeChildren(parentNode, nodeChild, usedScale, 2); } } } } Panel* parent = NULL; if(inPanel != NULL) { myNode->setContentSize(Size(0, 0)); parent = GraphicLayer::sharedLayer()->createPanelWithNode(inPanel, myNode, zIndex); } loadNodeToFenneX(myNode, parent); reorderZindex(); linkInputLabels(); animManagers.push_back(ccbReader->getAnimationManager()); ccbReader->release(); #if VERBOSE_PERFORMANCE_TIME timeval endTime; gettimeofday(&endTime, NULL); CCLOG("Node %s loaded to FenneX in %f ms, total with load file : %f ms", file, getTimeDifferenceMS(middleTime, endTime), getTimeDifferenceMS(startTime, endTime)); #endif return parent; }