转 [cocos2d-x使用ttf字体时,字体库中不存在的文字用框框代替]

cocos2d-x版本:3.2

使用ttf字体时,由于字体库不全,没有包含所有的字符,导致有些字符无法显示,修改代码让无法显示的字符用囗代替,能够明确看到有字符显示不了,代码修改如下:

unsigned char* FontFreeType::getGlyphBitmap(unsigned short theChar, long &outWidth, long &outHeight, Rect &outRect,int &xAdvance)  
{  
    bool invalidChar = true;  
    unsigned char * ret = nullptr;  
  
    do   
    {  
        if (!_fontRef)  
            break;  
  
        auto glyphIndex = FT_Get_Char_Index(_fontRef, theChar);  
        if(!glyphIndex)  
        {  
            // 字符找不到时默认用囗代替(not cocos)  
            static int defIndex = FT_Get_Char_Index(_fontRef, 22231);  
            glyphIndex = defIndex;  
            if (!glyphIndex)  
                break;  
        }  
  
        // ...  
    } while (0);  
}  
unsigned char * FontFreeType::getGlyphBitmapWithOutline(unsigned short theChar, FT_BBox &bbox)  
{     
    unsigned char* ret = nullptr;  
  
    FT_UInt gindex = FT_Get_Char_Index(_fontRef, theChar);  
    if (!gindex)  
    {  
        // 字符找不到时默认用囗代替(not cocos)  
        static int defIndex = FT_Get_Char_Index(_fontRef, 22231);  
        gindex = defIndex;  
    }  
    // ...  
  
    return ret;  
}  

这样修改之后又有另外一个问题,EditBox只支持系统字体,使用EditBox做输入框时,比如聊天输入时正常,发出来就变成了囗。解决方法:修改EditBox各平台代码的setFont和setPlaceholderFont接口,使其支持ttf字体,代码如下:

// CCEditBoxImplWin.h  
#define SET_EDIT_FONT(label, fontName, fontSize) \  
if (FileUtils::getInstance()->isFileExist(fontName)) \  
{ \  
    TTFConfig config = label->getTTFConfig(); \  
    config.fontFilePath = fontName; \  
    config.fontSize = fontSize; \  
    label->setTTFConfig(config); \  
} \  
    else \  
{ \  
    label->setSystemFontName(fontName); \  
    label->setSystemFontSize(fontSize); \  
}  
// CCEditBoxImplWin.cpp  
void EditBoxImplWin::setFont(const char* pFontName, int fontSize)  
{  
    if(_label != nullptr) {  
        SET_EDIT_FONT(_label, pFontName, fontSize)  
    }  
  
    if(_labelPlaceHolder != nullptr) {  
        SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)  
    }  
}  
  
void EditBoxImplWin::setPlaceholderFont(const char* pFontName, int fontSize)  
{  
    if(_labelPlaceHolder != nullptr) {  
        SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)  
    }  
}
// EditBoxImplAndroid.cpp  
void EditBoxImplAndroid::setFont(const char* pFontName, int fontSize)  
{  
    if(_label != NULL) {  
        SET_EDIT_FONT(_label, pFontName, fontSize)  
    }  
      
    if(_labelPlaceHolder != NULL) {  
        SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)  
    }  
}  
  
void EditBoxImplAndroid::setPlaceholderFont(const char* pFontName, int fontSize)  
{  
    if(_labelPlaceHolder != NULL) {  
        SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)  
    }  
}  
// EditBoxImplIOS.mm  
void EditBoxImplIOS::setFont(const char* pFontName, int fontSize)  
{  
    bool isValidFontName = true;  
    if(pFontName == NULL || strlen(pFontName) == 0) {  
        isValidFontName = false;  
    }  
  
    float retinaFactor = _inRetinaMode ? 2.0f : 1.0f;  
    NSString * fntName = [NSString stringWithUTF8String:pFontName];  
  
    auto glview = cocos2d::Director::getInstance()->getOpenGLView();  
  
    float scaleFactor = glview->getScaleX();  
    UIFont *textFont = nil;  
    if (isValidFontName) {  
        textFont = [UIFont fontWithName:fntName size:fontSize * scaleFactor / retinaFactor];  
    }  
      
    if (!isValidFontName || textFont == nil){  
        textFont = [UIFont systemFontOfSize:fontSize * scaleFactor / retinaFactor];  
    }  
  
    if(textFont != nil) {  
        [_systemControl.textField setFont:textFont];  
    }  
  
    SET_EDIT_FONT(_label, pFontName, fontSize)  
    SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)  
}  
  
void EditBoxImplIOS::setPlaceholderFont(const char* pFontName, int fontSize)  
{  
    if(_labelPlaceHolder != NULL) {  
        SET_EDIT_FONT(_labelPlaceHolder, pFontName, fontSize)  
    }  
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • 前言 我选择开发一个游戏有很多原因。我觉得自己是“核心”玩家,过去的大部分时间我都花在玩游戏,自己制作、阅读和游戏...
    月影檀香阅读 11,813评论 1 27
  • 一、概念 参考网页字体Serif和Sans-serif的区别及浏览器字体的设置CSS Font知识整理总结 1.F...
    合肥黑阅读 6,068评论 0 12
  • 今天的课程让我愈发自信,基本上老师讲的都全部掌握了,而且课上的一些随口提起的零碎的小知识也牢记在心里了,课后的作业...
    黄传家阅读 134评论 2 0
  • 今天主要讨论如何解决高维的动态规划问题,即很难直接想出来递推关系。 美妙的栅栏 Richard just fini...
    欣悦的灵魂阅读 274评论 0 0