重点代码
//多行字符串显示(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:
复制代码
|
在android手机上当这个label自动换行的时候每一行的第一个字符会被切掉,经追查代码,发现在Cocos2dxBitmap.java的文件里有一个这样的函数divideStringWithMaxWidth,估计功能是根据该label的size来拆分成每一行的字符串到一个字符数组里面:
复制代码
|
该函数的298 - 300行的功能估计是将每一次换行后如果是以空格开始的话就把它去掉,但是那个i++是始终都会执行一次的,那就是说每次都会把一行的第一个字符去掉,所以就造成那个BUG了。经本人亲自测试过,如果把298 - 300行换成以下的代码,就没问题了。
复制代码
|