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:
複製程式碼
|
在android手機上當這個label自動換行的時候每一行的第一個字元會被切掉,經追查程式碼,發現在Cocos2dxBitmap.java的檔案裡有一個這樣的函式divideStringWithMaxWidth,估計功能是根據該label的size來拆分成每一行的字串到一個字元陣列裡面:
複製程式碼
|
該函式的298 - 300行的功能估計是將每一次換行後如果是以空格開始的話就把它去掉,但是那個i++是始終都會執行一次的,那就是說每次都會把一行的第一個字元去掉,所以就造成那個BUG了。經本人親自測試過,如果把298 - 300行換成以下的程式碼,就沒問題了。
複製程式碼
|
相關文章
- SQL——多行併成一行顯示, 以字串分隔(相當於C#中的join)SQL字串C#
- orcale 中查詢多行 後合併到一行顯示
- Android:EditText 多行顯示Android
- oracle行列轉換-多行轉換成字串Oracle字串
- 在oracle中將一行字串拆分成多行Oracle字串
- CSS3多行顯示省略號...CSSS3
- Oracle多行轉換成字串方法總結Oracle字串
- Android EditText多行顯示並支援修改軟鍵盤右下角按鈕Android
- CSS實現單行、多行文字溢位顯示省略號CSS
- CSS實現單行、多行文字溢位顯示省略號(…)CSS
- 在VC中呼叫WORD(顯示,修改,存檔,執行宏) (轉)
- 【BUG系列】Fragment中巢狀Fragment,不顯示Fragment巢狀
- js中讓字串中特定字元紅色顯示JS字串字元
- JavaScript 多行字串JavaScript字串
- Eclipse大括號換行顯示Eclipse
- css 多行文字溢位省略號顯示CSS
- IDEA 如何設定TAB頁顯示多行Idea
- 修改sqlplus中顯示時間日期的格式SQL
- CSS實現單行、多行文字溢位顯示省略號的實現方法CSS
- javascript超過容器後顯示省略號效果(相容一行或者多行)JavaScript
- un-app - 單行文字和多行文字溢位隱藏顯示...(超出容器最大寬度不換行)APP
- 如何用 CSS 實現多行文字的省略號顯示CSS
- IDA字串顯示中文字串
- iPhone中XML處理以及網路上的圖片顯示iPhoneXML
- 轉:vscode 檔案標籤欄多行顯示VSCode
- JavaScript 字串換行JavaScript字串
- qt中debug顯示64位不能除錯32位QT除錯
- 修改資料庫的日期顯示格式資料庫
- 由顯示/隱藏引出的CSSbug(轉)CSS
- 由顯示/隱藏引出的CSS Bug(轉)CSS
- Vi中的替換字串字串
- TOAD和PLSQL 預設日期顯示、rowid顯示、TNSNAME的修改SQL
- 關於在textarea中輸入回車換行和空格字元的正常顯示 (轉)字元
- HANA Studio中修改預設查詢結果只顯示1000行
- css3多行文字多行文字縮略點選更多展開顯示全部CSSS3
- 商品顯示模式切換模式
- uniapp uni.showModal的content實現換行顯示APP
- *.cpl檔案的妙用(隨意修改cpu顯示資料,記憶體顯示隨意修改等等)記憶體