예제 #1
0
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);
            }
        }
    }
}
예제 #2
0
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;
}