求教,关于Cocos2d-JS v3.1 CCLabelBMFont的bug

cc.LabelBMFont的处理方式在web和jsb下不同,导致在web下开发调试时产生了几个bug,具体如下:

  1. 涉及到较多中文文本处理的自动换行问题。
    在web下,自动换行的机制是当一行文本超过设定的宽度后,为保证英文单词不被隔断,会查找后续文本中的空格,查找成功后从空格处设置换行标志\n。当文本全是中文时,则无法换行。这个问题通过设置setLineBreakWithoutSpace(true)后解决。
  2. 宽度计算的bug
    设置了BMFont得宽度后,当调用setScale()方法设置不同比例后,web上的整体宽度和jsb下不同。
    这个问题找了半天,最后修改frameworks/cocos2d-html5/cocos2d/labels/CCLabelBMFont.js中的_getLetterPosXLeft函数和_getLetterPosXRight函数解决。去掉代码中的 *this._scaleX,修改后代码如下:
    _getLetterPosXLeft: function (sp) {
        return sp.getPositionX() - (sp._getWidth()  * sp._getAnchorX());
    },

    _getLetterPosXRight: function (sp) {
        return sp.getPositionX()  + (sp._getWidth() * sp._getAnchorX());
    },
```

3. 还是自动换行问题
当原始文本中存在\n标志时,多次使用setString(str)方法修改文本后,原始文本中的\n标志不再生效。导致自动换行处理的算法出现bug,无法自动换行。这个问题暂时没时间解决,只能避免原始文本中出现\n标志。
在这里请教各位大神有没有更好的处理方式,谢谢

实在忍受不了,仔细看了一下源码,自己把第3个问题解决了,解决办法:
修改frameworks/cocos2d-html5/cocos2d/labels/CCLabelBMFont.js文件中updateLabel()函数,大约702行,将j–这一行去掉,原代码为:

              // Newline.
                if (character.charCodeAt(0) == 10) {
                    last_word.push('\n');
                    multiline_string = multiline_string.concat(last_word);
                    last_word.length = 0;
                    start_word = false;
                    start_line = false;
                    startOfWord = -1;
                    startOfLine = -1;
                    //i+= justSkipped;
                    j--;
                    skip -= justSkipped;
                    line++;

                    if (i >= stringLength)
                        break;

                    character = self._string*;
                    if (!startOfWord) {
                        startOfWord = self._getLetterPosXLeft(characterSprite);
                        start_word = true;
                    }
                    if (!startOfLine) {
                        startOfLine = startOfWord;
                        start_line = true;
                    }
                    i++;
                    continue;
                }
```


修改后如下:

                // Newline.
                if (character.charCodeAt(0) == 10) {
                    last_word.push('\n');
                    multiline_string = multiline_string.concat(last_word);
                    last_word.length = 0;
                    start_word = false;
                    start_line = false;
                    startOfWord = -1;
                    startOfLine = -1;
                    //i+= justSkipped;
                    // 解决原始文本中存在换行标志时,无法自动换行问题 by ying 20141123
                    // j--; 
                    skip -= justSkipped;
                    line++;

                    if (i >= stringLength)
                        break;

                    character = self._string*;
                    if (!startOfWord) {
                        startOfWord = self._getLetterPosXLeft(characterSprite);
                        start_word = true;
                    }
                    if (!startOfLine) {
                        startOfLine = startOfWord;
                        start_line = true;
                    }
                    i++;
                    continue;
                }
```

**

学习了,谢谢分享

:14: 学习了 正好遇到这个问题

感谢反馈 :7:

已修复上述问题,相关pr
https://github.com/cocos2d/cocos2d-html5/pull/2572