cocos2d-x 多行字串換行顯示以及CCLabelTTF中的bug修改

mysoulli發表於2013-09-25

 

重點程式碼

//多行字串顯示(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. }



 

相關文章