• 实习小白::(转) Cocos2d-x 更改文字换行风格 ( cocos2dx change line )


    Cocos2dx change line

    在 cocos2dx change line 的实现中,我们可以简单的使用 dimensions属性控制换行。使用它只需将对应的参数值传入构造函数,或者调用 setDimensions 函数即可。

    它的换行策略是:当一个单词超出限制长度时,将它移动到下一行。有时这种策略并不合适。例如,在某些语言中,单词都比较长。如果采用这种策略,会出现每一行中只有一个单词。因此需要更改换行策略。当超出限制长度时,使用 - 作为一个分隔单词的标志。

    换行策略调用

    通 过查看Cocos2d-x中换行的实现方式,我发现换行策略是区分平台编程出来的代码。也就是说,为了更改换行策略,我需要分别编写 IOS 和 Java 两部分代码。因为我的目标平台是 Android 平台,因此我只对Java文件进行了更改。IOS 平台的换行策略调用的是系统函数,有兴趣研究的读者可以跟踪源码更改。入口函数为:

    1. bool CCTexture2D::initWithString(const char *text, ccFontDefinition *textDefinition)  
    2. {  
    3.     ......  
    4.    
    5.     CCImage* pImage = new CCImage();  
    6.     do  
    7.     {  
    8.         CC_BREAK_IF(NULL == pImage);  
    9.           
    10.         bRet = pImage->initWithStringShadowStroke(text,  
    11.                                                   (int)textDefinition->m_dimensions.width,  
    12.                                                   (int)textDefinition->m_dimensions.height,  
    13.                                                   eAlign,  
    14.                                                   textDefinition->m_fontName.c_str(),  
    15.                                                   textDefinition->m_fontSize,  
    16.                                                   textDefinition->m_fontFillColor.r / 255,  
    17.                                                   textDefinition->m_fontFillColor.g / 255,  
    18.                                                   textDefinition->m_fontFillColor.b / 255,  
    19.                                                   shadowEnabled,  
    20.                                                   shadowDX,  
    21.                                                   shadowDY,  
    22.                                                   shadowOpacity,  
    23.                                                   shadowBlur,  
    24.                                                   strokeEnabled,  
    25.                                                   strokeColorR,  
    26.                                                   strokeColorG,  
    27.                                                   strokeColorB,  
    28.                                                   strokeSize);  
    29.           
    30.           
    31.         CC_BREAK_IF(!bRet);  
    32.         bRet = initWithImage(pImage);  
    33.           
    34.     } while (0);  
    35.       
    36.     ......  
    37. }  


    更改Java实现

    Android 平台对应的 Java 文件位于 $(2DX-Root)/cocos2dx/platform/android/java/src/org/cocos2dx/lib 文件夹中,文件名是 Cocos2dxBitmap.java

    首先,我增加了 divideStringWithMaxWidthByFlag 函数,将它作为另一个换行策略的实现函数。

    1. // add by fansy for "—" style words  
    2.     private static LinkedList<String> divideStringWithMaxWidthByFlag(  
    3.            final String pString, final int pMaxWidth, final Paint pPaint) {  
    4.         final int charLength = pString.length();  
    5.         int start = 0;  
    6.         int tempWidth = 0;  
    7.         LinkedList<String> strList = new LinkedList<String>();  
    8.           
    9.         if( !isChinese(pString) )  
    10.         {  
    11.             /* Break a String into String[] by the width & should wrap the word. */  
    12.             for (int i = 1; i < charLength-1; ++i) {  
    13.                 tempWidth = (int) FloatMath.ceil(pPaint.measureText(pString, start,i+1));  
    14.                 if (tempWidth >= pMaxWidth) {  
    15.                     if(pString.charAt(i) == ' ') //end with " "  
    16.                     {  
    17.                         //change line at i  
    18.                         strList.add(pString.substring(start, i));  
    19.                         i = i + 1; // skip space  
    20.                     }  
    21.                     else if(i>1 && pString.charAt(i-2) == ' ') //only one "-" left after change line  
    22.                     {  
    23.                         //change line at i-2  
    24.                         strList.add(pString.substring(start, i-2));  
    25.                         i = i -2; // skip space  
    26.                     }  
    27.                     else if(i>0 && pString.charAt(i-1) == ' ') //only one "-" left after change line  
    28.                     {  
    29.                         //change line at i-1  
    30.                         strList.add(pString.substring(start, i-1));  
    31.                         i = i -1; // skip space  
    32.                     }  
    33.                     else if(i>0) //replace "-" at i-2  
    34.                     {  
    35.                         //split at i-1 add "-" at tail change line at i-1  
    36.                         strList.add(pString.substring(start, i-1)+"-");  
    37.                         i--;  
    38.                     }  
    39.                       
    40.                     /* Remove spaces at the beginning of a new line. */  
    41.                     while (pString.charAt(i) == ' ') {  
    42.                         ++i;  
    43.                     }  
    44.                       
    45.                     start = i;  
    46.                 }  
    47.             }  
    48.               
    49.             /* Add the last chars. */  
    50.             if (start < charLength) {  
    51.                 strList.add(pString.substring(start));  
    52.             }  
    53.         }  
    54.         else  
    55.         {  
    56.             strList = divideStringWithMaxWidth(pString, pMaxWidth, pPaint);  
    57.         }  
    58.         return strList;  
    59.     }  
    60.       
    61.     // 根据Unicode编码完美的判断中文汉字和符号  
    62.     private static boolean isChinese(char c) {  
    63.         Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);  
    64.         if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS  
    65.             || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS  
    66.             || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A  
    67.             || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B  
    68.             || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION  
    69.             || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS  
    70.             || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {  
    71.             return true;  
    72.         }  
    73.         return false;  
    74.     }  
    75.       
    76.     // 完整的判断中文汉字和符号  
    77.     public static boolean isChinese(String strName) {  
    78.         char[] ch = strName.toCharArray();  
    79.         for (int i = 0; i < ch.length; i++) {  
    80.             char c = ch[i];  
    81.             if (isChinese(c)) {  
    82.                 return true;  
    83.             }  
    84.         }  
    85.         return false;  
    86.     }  
    87.       
    88.  //end add by fansy  

    增加函数之后,修改在 splitString 中的调用:

    1. private static String[] splitString(final String pString,  
    2.             final int pMaxWidth, final int pMaxHeight, final Paint pPaint) {  
    3.         final String[] lines = pString.split("\n");  
    4.         String[] ret = null;  
    5.         final FontMetricsInt fm = pPaint.getFontMetricsInt();  
    6.         final int heightPerLine = (int) Math.ceil(fm.bottom - fm.top);  
    7.         final int maxLines = pMaxHeight / heightPerLine;  
    8.    
    9.         if (pMaxWidth != 0) {  
    10.             final LinkedList<String> strList = new LinkedList<String>();  
    11.             for (final String line : lines) {  
    12.                 /* 
    13.                  * The width of line is exceed maxWidth, should divide it into 
    14.                  * two or more lines. 
    15.                  */  
    16.                 final int lineWidth = (int) FloatMath.ceil(pPaint  
    17.                         .measureText(line));  
    18.                 if (lineWidth > pMaxWidth) {  
    19.                     strList.addAll(Cocos2dxBitmap.divideStringWithMaxWidthByFlag(  
    20.                             line, pMaxWidth, pPaint));  
    21.                 } else {  
    22.                     strList.add(line);  
    23.         ......  
    24. }  


    更换调用函数后,编译打包,运行程序即可看到不同的换行效果。

     

     

    本篇博客出自阿修罗道,转载请注明出处,禁止用于商业用途:http://blog.csdn.net/fansongy/article/details/39992241 

  • 相关阅读:
    jquery获取select选中的文本值
    Nginx实战入门教程
    【分享】Jenkins自动化部署全套视频教程
    Jenkins自动化部署入门详细教程
    【分享】nginx负载均衡全套视频教程
    IT从业者疫情之下出路何在
    jmeter控制器(四)
    jmeter控制器(三)
    复述记忆法的初步学习总结
    raspberry-gpio-python(树莓派GPIO与Python编程)
  • 原文地址:https://www.cnblogs.com/dudu580231/p/4983840.html
Copyright © 2020-2023  润新知