cocos2d-x 多行字符串换行显示以及CCLabelTTF中的bug修改

 

重点代码

//多行字符串显示(EngLish)
CCLabelTTF* Dlcx_Util::dlcx_drawString( const char *  str ,float x,float y,float w,float h, GLubyte r,GLubyte g,GLubyte b,float fontSize,CCTextAlignment align)
{
    ccColor3B c = {r, g, b};
 CCSize size;
 size.width = w;
 size.height = h;
 CCLabelTTF* label = CCLabelTTF::create(str,size, align,"Arial", fontSize);
 label->setColor(c); 
 label->setPosition(ccp( x, y));
 return label;
}

 

cocos2d-x  2.0.1引擎有一个bug

换行时最后一个文字老是不显示

更改的方法为:

在java的Cocos2dxBitmap.java中找到divideStringWithMaxWidth方法:

具体代码为:

    private static LinkedList<String> divideStringWithMaxWidth(Paint paint, String content,
      int width){
     int charLength = content.length();
     int start = 0;
     int tempWidth = 0;
     LinkedList<String> strList = new LinkedList<String>();
     
     /*
      * Break a String into String[] by the width & should wrap the word
      */
     for (int i = 1; i <= charLength; ++i){    
      tempWidth = (int)Math.ceil(paint.measureText(content, start, i));
      if (tempWidth >= width){
       int lastIndexOfSpace = content.substring(0, i).lastIndexOf(" ");
       
       if (lastIndexOfSpace != -1 && lastIndexOfSpace > start){
        /**
         * Should wrap the word
         */
        strList.add(content.substring(start, lastIndexOfSpace));
        i = lastIndexOfSpace;
       }
       else {
        /*
            * Should not exceed the width
            */
           if (tempWidth > width){
            strList.add(content.substring(start, i - 1));
            /*
             * compute from previous char
             */
            --i;
           }
           else {
            strList.add(content.substring(start, i));       
           }
       }
             
       
       /*
        * *********************************************************************
        * 更改代码 去除cocos2d-x中换行最后一个字符被切掉的bug  *
        * while(content.indexOf(i++) == ' ') {}                                                 *
        * *********************************************************************
        */
       // remove spaces at the beginning of a new line
       while(content.indexOf(i) == ' ') {
        ++i;
       }
             
       start = i;
      }
     }

    根据红色区域的代码改过就可以了。

文章借鉴于:

http://www.cocoachina.com/bbs/read.php?tid=158204

 

coco2d-x2.0.1后CCLabelTTF的一个BUG   


在cocos2d-x2.0.1以后的版本存在这样的一个BUG。我以cocos2d-x2.0.3为例,这样创建一个CCLabelTTF:

复制代码
  1. CCLabelTTF* pLabel = CCLabelTTF::create("HelloWorldHelloWorldHelloWorldHelloWorldHelloWorld", "Arial", 24, CCSize(100.f, 0.f), kCCTextAlignmentCenter);

在android手机上当这个label自动换行的时候每一行的第一个字符会被切掉,经追查代码,发现在Cocos2dxBitmap.java的文件里有一个这样的函数divideStringWithMaxWidth,估计功能是根据该label的size来拆分成每一行的字符串到一个字符数组里面:

复制代码
  1. private static LinkedList divideStringWithMaxWidth(final String pString, final int pMaxWidth, final Paint pPaint) {

该函数的298 - 300行的功能估计是将每一次换行后如果是以空格开始的话就把它去掉,但是那个i++是始终都会执行一次的,那就是说每次都会把一行的第一个字符去掉,所以就造成那个BUG了。经本人亲自测试过,如果把298 - 300行换成以下的代码,就没问题了。

复制代码
  1. while (pString.indexOf(i) == ) {
  2. ++i;
  3. }



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章