修复cocos2dx的Label,WP8下不能换行的问题

搞了几个小时,这个头疼的问题,我给出代码吧。

找到

libcocos2d/platform/winrt/CCFreeTypeFont.cpp

(其中libcocos2d是项目名)然后将其中的函数 addWord 替换为我提供的即可。实在找不到文件的同学直接搜索吧。

需要注意的是我只简单处理了一下,所以中文下只支持UTF8字符串,非UTF8字符串会出问题。当然英文环境下任然是用默认逻辑。

我的cocos2dx版本是 3.2,如果你的版本不是这个,存在个别差异,那就自己改改吧。

希望大家拿走代码的时候在下面评论一下,好提高我分享的积极性,你懂得。

FT_Error CCFreeTypeFont::addWord(const std::string& word)
{
    std::vector<TGlyph> glyphs; // glyphs for the word
    FT_BBox             bbox;   // bounding box containing all of the glyphs in the word
    int maxWidth = m_inWidth ? m_inWidth : m_windowWidth;
    std::string newWord;

    if(m_currentLine->width > 0)
    {
        newWord = ‘ ‘ + word;
    }
    else
    {
        newWord = word;
    }

    FT_Error error = initWordGlyphs(glyphs, newWord, m_currentLine->pen);
    if(!error)
    {
        compute_bbox(glyphs, &bbox);
        /*判断添加进去后整个line是否显示宽度大于设定宽度,是的话进行截取*/
        if (Application::getInstance()->getCurrentLanguage() == LanguageType::CHINESE && bbox.xMax > maxWidth)
        {
            std:size_t start = 0, end = word.length();
            while (true)
            {
                while (true)//这个字符比最宽还要宽,则进行截取
                {
                    end--;
                    FT_BBox validBBox = bbox;
                    std::vector<TGlyph> validGlyphs;
                    FTLineInfo validLine = FTLineInfo();
                    validLine.width = 0;
                    validLine.pen.x = 0;
                    validLine.pen.y = 0;
                    //对UTF8字符进行切割
                    if (end != word.length())
                    {
                        while (true)
                        {
                            unsigned char utf8charpart = word.at(end - 1);
                            if ((utf8charpart & 0x80) != 0 &&
                                (utf8charpart & 0xe0) != 0xc0 &&
                                (utf8charpart & 0xf0) != 0xe0 &&
                                (utf8charpart & 0xf8) != 0xf0)
                            {
                                end--;
                            }
                            else
                            {
                                end--;
                                break;
                            }
                        }
                    }
                    std::string validStr = word.substr(start, end - start);
                    FT_Error validError = initWordGlyphs(validGlyphs, validStr, validLine.pen);
                    if (validError) break;
                    compute_bbox(validGlyphs, &validBBox);
                    if (validBBox.xMax <= maxWidth)
                    {
                        m_currentLine->glyphs.insert(validLine.glyphs.end(), validGlyphs.begin(), validGlyphs.end());
                        if (m_currentLine->width == 0)
                        {
                            m_currentLine->bbox = validBBox;
                        }
                        else
                        {
                            m_currentLine->bbox.xMax = validBBox.xMax;
                        }
                        break;
                    }
                }
                start = end;
                end = word.length() + 1;
                if (start == end - 1) break;
                bbox = FT_BBox();
                endLine();
                newLine();
            }
        }
        else
        {
            if (m_currentLine->width == 0 || bbox.xMax <= maxWidth)
            {
                m_currentLine->glyphs.insert(m_currentLine->glyphs.end(), glyphs.begin(), glyphs.end());
                if (m_currentLine->width == 0)
                {
                    m_currentLine->bbox = bbox;
                }
                else
                {
                    m_currentLine->bbox.xMax = bbox.xMax;
                }
                m_currentLine->width = m_currentLine->bbox.xMax - m_currentLine->bbox.xMin;
            }
            else
            {
                endLine();
                newLine();
                addWord(word);
            }
        }
    }
    return error;
}

修复cocos2dx的Label,WP8下不能换行的问题

时间: 2024-11-05 12:35:38

修复cocos2dx的Label,WP8下不能换行的问题的相关文章

linux下与windows下的换行符

回车符号和换行符号产生背景 关于"回车"(carriage return)和"换行"(line feed)这两个概念的来历和区别.在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符.要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失.     于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符.一

Linux下的换行符\n\r以及txt和word文档的使用

Linux doc WINDOWS下记事本编写的文档和LINUX下VIM或者GEDIT等编写的文档的不同! 例如WINDOWS下编写的SH脚本,放到LINUX下执行可能会出错. 解决方法: 原因是:Windows下换行符号是“\r\n”,而linux下是“\n”没有”\r”,当shell文件是在Windows下编写的时候,所有的换行符都是“\r\n”,shell下是没办法执行这个文件的,会提示以上错误.请在ultraedit下将该文件执行“File->conversions->Dos to U

[Eclipse]已经写好的代码怎样切换为unix下的换行符?

切换换行符的显示格式, 一般的设置是这样的: 但是这样只能对新文件起作用,原来已经写好的还是那熊样.(怎么办呢,得吃后悔药啊,谁让你开始没准备好呢?!T_T) 下面就是后悔药: 这样就OK了. 附:有图有真相 转换前: 转换后: [Eclipse]已经写好的代码怎样切换为unix下的换行符?,布布扣,bubuko.com

WP8下实现刮刮乐(橡皮擦)功能

说到刮刮乐这个功能,我们最先想到的是上下两张(长方形)重叠,之后对上面这张图片进行操作. 我的想法是:通过手势,让手指划过的地方变成透明的,底部就会显示了. 那如何让图片变为透明呢?这就要对图片的像素进行处理了. 首先,图片的像素是一个int型数组:int[], 此数组长度为图片高(像素)*宽(像素) 比如:一张图片的高宽为200pixel.400pixel,那么这个数组为int[80000] 对于每一个元素,官方文档说都是ARGB32[预乘RGB24]  (A指的是Alpha通道  控制透明度

给label绘制下划线

UIlabel本身没有下划线的属性,使用绘制的方法,添加下滑下,并且赋给该label一个action作为响应方法,实现DIY超链接的效果. //调用 #import "UnderLineLabel.h" UnderLineLabel *label = [[UnderLineLabel alloc] initWithFrame:CGRectMake(50, 200, 300, 30)]; [label setBackgroundColor:[UIColor clearColor]]; /

cocos2dx程序android平台下自更新策略

cocos2dx开发的在android平台下运行的程序,是以一个.so用户库文件提供给JAVA层调用.所以我们在JAVA层实现检查更新,下载最新库文件,并跳过加载原来库文件,加载新库文件即可. 1. 首先,在AndroidManifest.xml里新增一个activity,以供执行更新.  <!-- 插入一个执行下载更新的activity --> <activity android:name="com.guo.UpdateActivity"              

浏览器 和 源码 不同环境下的换行

<br/> \n \r   \r\n是输出的HTML代码换行,客户看到的效果没有换行. <br />则相反 效果: 我是内容\r\n我是内容 我是内容<br />我是内容 ================================================== \r 表示:回车符(ACSII:13 或0x0d),就是我们常说的硬回车. \n 表示:换行(ACSII:10 或0x0a),就是我们常说的软回车.在页面里这两个是看不到效果的.右键查看源文件可以看到

终端下不换行刷新当前行

终端下耗时较长的程序运行过程中输出中间状态时,有时信息太多,希望一些次要的信息能被覆盖掉,整体显得干净一些. 以往我用"\r"字符,控制输出的光标回到行首,再次输出覆盖上一行的信息,只要输出不换行,且下次输出的行长度不短于上一次,看起啦就是最后一行不断地在刷新. 但是如果下一次的输出长度不确定,甚至因接口限制而必须换行时,这种方式就不行了. 玩过BBS的都知道,ANSI定义了一套终端控制转义字符,可以更精细地控制屏幕输出,比如颜色,光标位置等.查阅ANSI转义代码表, CSI n K 

总结下Windows, Linux, Mac系统下的换行符差异

0. Introduction: 我们通常所说的回车换行,即文本文件的一行结束,开始新的一行,这个概念英文叫做End-of-Line,简写为EOL,你也可以把它理解为一个逻辑上的换行,但是这个相同的概念在不同的操作系统中却由不同的ASCII码(0x0a, 0x0a0x0d, 0x0d)组成,为了避免混淆,我们后面都称这个统一逻辑上的概念为EOL. 1.History 很久很久以前,在电脑还没有出现的时候,人们电传打字机来通信,(即TeTypewriter,TeleTYpewriter,提取单词的