先吐个槽,刚准备发这条博客的时候居然发现账号被盗了,真是有人闲得蛋疼,顺便赞一个csdn的客服,处理的很快。
好了,言归正转。看了一下,自动换行的实现在CCFreeType这个类里,这个类的实现只是针对英文的,它采用空格断句的方式来进行操作,一个word一个word的加,如果发现超过规定的范围就会换行,但是对于中文来说,这个实现简直弱爆了,所以就会出现不能自动换行的情况。参考它的实现,做一点小的修改,基本原理如下
1、读一行文本出来,参考它的实现,算出这个文本的宽度
2、如果这个宽度没有超过,则直接显示
3、如果这个宽度走过了,则按等宽字体处理,根据宽度算出来总共应该是几行,然后按长度进行分隔换行。
注意这个实现有几个问题:
1、性能问题,其实是在计算出了所有的字之后才发现超过了,这个本来可以发现的更早,但是为了尽可能利用原有的代码结构,只用先这样了。
2、是以等宽字体的实现的,这个不一定正确,所以可能会出现某一些还是超过了的情况。
最后附上修改的diff,我使用的是2.2.4版本。
diff --git a/cocos2d-x-2.2.4/cocos2dx/platform/winrt/CCFreeTypeFont.cpp b/cocos2d-x-2.2.4/cocos2dx/platform/winrt/CCFreeTypeFont.cpp
index 9886d0a..46489af 100644
--- a/cocos2d-x-2.2.4/cocos2dx/platform/winrt/CCFreeTypeFont.cpp
+++ b/cocos2d-x-2.2.4/cocos2dx/platform/winrt/CCFreeTypeFont.cpp
@@ -368,13 +368,67 @@ FT_Error CCFreeTypeFont::addWord(const std::string& word)
return error;
}
+FT_Error CCFreeTypeFont::addLine(wchar_t* line, int size, bool wrap)
+{
+ 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;
+
+ FT_Vector pen = m_currentLine->pen;
+ FT_Error error = initWordGlyphs(glyphs, line, size, pen);
+ if (!error)
+ {
+ compute_bbox(glyphs, &bbox);
+ if (!wrap || bbox.xMax <= maxWidth)
+ {
+