重點代碼
//多行字符串顯示(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行換成以下的代碼,就沒問題了。
複製代碼
|