cocos2dx之Label实现换行

我先创建一个label
[cpp]  view plain copy
  1. std::string star_str = "star is not star in the sky,it is on heart";//先定义一个string  
  2.   
  3. auto m_label = LabelTTF::create(star_str,"Arial",25);//创建一个label  
  4. m_label->setPosition(Point(300,300));  
  5. this->addChild(m_label,2);  
如下图所示,labelTTF是不会自动换行的,那要实现换行该怎么做呢?

说到Label如何换行,首先想到的就是设置label的尺寸,让它到了边界时要懂得自己换行 ,添加一行代码:
[cpp]  view plain copy
  1. m_label->setDimensions(Size(200,200));//设置label的尺寸  
注意这里使用的不是setContentSize(); 运行结果如下图
cocos2dx之Label实现换行_第1张图片

上面这种方法固然方便,但还是有它的局限性: 假如我们做的是一个类似微信的聊天对话框,这种对话框一个特点就是会随着你文字长度的改变而改变。而如果我们在这里讲Label的尺寸给写死了,那对话框也就跟着失去它的灵活性了。
这里有没有更酷的解决办法么?答案是肯定的。
LabelTTF有一个好处就是会在字符串中有"\n"的地方换行 ,利用这个特点可以写一个自动换行的函数,参考代码如下:
//str是传入的字符串,length是每行的长度
[cpp]  view plain copy
  1. std::string HelloWorld::myWrap(std::string str,int length)  
  2. {  
  3.     unsigned int beginPos = 0;  //字符串的初始位置  
  4.     std::string resultStr;      //返回的字符串  
  5.   
  6.   
  7.     std::vector str_vec;  //创建一个字符串类型的顺序容器  
  8.     do     
  9.     {    
  10.         str_vec.push_back(str.substr(beginPos,length)); //substr函数的作用类似剪刀,将str中从beginPos到length之间的字符串剪下来,单独放入容器中   
  11.         if (beginPos+length >str.size())    
  12.         {    
  13.             break;  //当要裁剪的长度超出str的长度,则退出循环  
  14.         }    
  15.         else    
  16.         {    
  17.             beginPos += length;   
  18.         }    
  19.             
  20.     } while (true);    
  21.    
  22.     for (unsigned int i = 0;i
  23.     {    
  24.         resultStr.append(str_vec.at(i)).append("\n"); //从容器逐一取出之前裁剪好的一段段字符串,分别在字符串后面加上换行符。append()类似胶水,将\n粘到字符串后面   
  25.     }    
  26.   
  27.   
  28.  //   resultStr.pop_back();  //这一句是将最后一个多余的\n给删掉  
  29.   
  30.   
  31.     return resultStr;    
  32. }  

现在用这种方法重写一次label的创建过程
[cpp]  view plain copy
  1. std::string star_str = "star is not star in the sky,it is on heart";//先定义一个string  
  2.   
  3. auto m_label = LabelTTF::create(myWrap(star_str,10),"Arial",25);//创建一个label  
  4. m_label->setPosition(Point(300,300));  
  5. this->addChild(m_label,2);  

结果如下图所示:

cocos2dx之Label实现换行_第2张图片

恩,就酱紫啦。

尊重原创,转载请注明来源:

http://blog.csdn.net/star530/article/details/22757281

你可能感兴趣的:(移动开发,Cocos2dx)