标签:
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); // }
标签:
原文地址:http://blog.csdn.net/tianxiawuzhei/article/details/45697743