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分析
最新推荐文章于 2021-07-09 15:21:18 发布