码迷,mamicode.com
首页 > 其他好文 > 详细

LabelReader分析

时间:2015-05-13 21:57:25      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

LabelReader分析:
1、
在cocoStudio下有很多以...Reader为后缀的类,如LabelReader,ButtonReader等等,
这些类用来解析json文件中对应的子对象,如Lable,Button,并把这些属性设置给
相应控件
2、
void LabelReader::setPropsFromJsonDictionary(ui::Widget *widget, const rapidjson::Value &options)
{
    WidgetReader::setPropsFromJsonDictionary(widget, options);
    
    //获取json文件全路径,这里的路径不包括json文件名,只有目录部分。
    //如Export/heroGrowup/mm.json,则jsonPath为Export/heroGrowup/。
    std::string jsonPath = GUIReader::shareReader()->getFilePath();
    
    ui::Label* label = (ui::Label*)widget;
    bool touchScaleChangeAble = DICTOOL->getBooleanValue_json(options, "touchScaleEnable");
    label->setTouchScaleChangeEnabled(touchScaleChangeAble);
    //设置显示内容
    const char* text = DICTOOL->getStringValue_json(options, "text","Text Label");
    label->setText(text);
   
    label->setFontSize(DICTOOL->getIntValue_json(options, "fontSize",20));
    
    //重点,这里是设置字库,至于如何在cocoStudio中设置字库,可以参考
    http://blog.csdn.net/tianxiawuzhei/article/details/45693601 文章,
    生成json文件,字库字段一般如:"fontName": "fonts/STHUPO.ttf"。
    std::string fontName = DICTOOL->getStringValue_json(options, "fontName","微软雅黑");
    std::string file_extension = "";
    size_t pos = fontName.find_last_of('.');
    if (pos != std::string::npos)
    {
        //获取字库文件的后缀名,并转化为大写
        file_extension = fontName.substr(pos, fontName.length());
        std::transform(file_extension.begin(),file_extension.end(), file_extension.begin(), (int(*)(int))toupper);
    }
    
    //如果字库文件以.TTF结尾,则字库路径为jsonPath路径(如Export/heroGrowup/)+fontName(如"fonts/STHUPO.ttf"),
    //这样就会导致一个问题,我们必须把字库文件放到相对与json文件所在的目录下,因为我们通常都会根据
    //功能来分目录存放json文件,那么我们需要在不同的功能模块目录下都放一份字库文件,这个是不可行的,那会
    //使我们的游戏包很大。
    if (file_extension.compare(".TTF") == 0)
    {
	 std::string fontFilePath = jsonPath.append(fontName);
	 label->setFontName(fontFilePath);
    }
    else
    {
	 label->setFontName(fontName);
    }
	    
    bool aw = DICTOOL->checkObjectExist_json(options, "areaWidth");
    bool ah = DICTOOL->checkObjectExist_json(options, "areaHeight");
    if (aw && ah)
    {
        CCSize size = CCSize(DICTOOL->getFloatValue_json(options, "areaWidth"),DICTOOL->getFloatValue_json(options,"areaHeight"));
        label->setTextAreaSize(size);
    }
    bool ha = DICTOOL->checkObjectExist_json(options, "hAlignment");
    if (ha)
    {
        label->setTextHorizontalAlignment((CCTextAlignment)DICTOOL->getIntValue_json(options, "hAlignment"));
    }
    bool va = DICTOOL->checkObjectExist_json(options, "vAlignment");
    if (va)
    {
        label->setTextVerticalAlignment((CCVerticalTextAlignment)DICTOOL->getIntValue_json(options, "vAlignment"));
    }
    
    
    WidgetReader::setColorPropsFromJsonDictionary(widget, options);
}

3、
根据上面的分析我们知道,在cocoStudio中使用Label控件时,使用第三方字库,会有
上面分析的问题,那么我们怎么解决这个问题呢?
  3.1、
  把所有的功能json文件都放到同一个目录下,然后在这个目录下放字库文件,这样做
  会导致所有的功能模块都放在一起,导致查找困难。
  3.2、
  修改底层代码,就是把相对于json文件目录去获取字库路径,改为直接根据
  "fontName": "fonts/STHUPO.ttf"获取文件路径,那么我们的字库文件存放路径就是
  Resources/fonts/STHUPO.ttf,所以可以通过fonts/STHUPO.ttf路径得到字库文件。
  修改后的代码:
      std::string fontName = DICTOOL->getStringValue_json(options, "fontName","微软雅黑");
    std::string file_extension = "";
    size_t pos = fontName.find_last_of('.');
    /*
    if (pos != std::string::npos)
    {
        file_extension = fontName.substr(pos, fontName.length());
        std::transform(file_extension.begin(),file_extension.end(), file_extension.begin(), (int(*)(int))toupper);
    }
    
    if (file_extension.compare(".TTF") == 0)
    {
        std::string fontFilePath = jsonPath.append(fontName);
        label->setFontName(fontFilePath);
    }
    else
    { */
        label->setFontName(fontName);
  //  }
    

LabelReader分析

标签:

原文地址:http://blog.csdn.net/tianxiawuzhei/article/details/45697743

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!