前一段时间在cocos2d-x(3.7)项目中遇到一个需求要求实现Label中某些文字的高亮,也就是在一个Label中可以让文字有不同的颜色。看到这个需求我先是在网上找了很久都没有看到有用的信息,后来我就自己改造源码。
Label的原理基本是解析输入的字符串,然后根据字库信息解析字符串为每个字符生成一个对应的LetterInfo,最后根据LetterInfo信息将每个字符初始化一个Sprite(_reusedLetter)中,同时讲这个sprite绑定到_batchNodes(详细请参考Label::updateQuads)。
我改造Label源码的原理是在LetterInfo中添加了一个Color4B color记录每个字符的颜色,在Label中增加了一个颜色表和当前颜色。
struct LetterInfo
{
char16_t utf16Char;
bool valid;
float positionX;
float positionY;
int atlasIndex;
int lineIndex;
Color4B color;//字符颜色
bool bLockColor;//颜色锁,防止被setColor改变
};`
Label中添加`
public:
Color4B _curColor;//当前颜色
bool _bLockColor;//是否锁定
static std::vector colorList;//颜色表,size不要超过10
public:
static void setColorList(std::vector list);
static void addColor(Color3B color);
static std::vector getColorList();
static void clearColorList();
Label源码主要改动函数alignText,multilineTextWrapByWord,multilineTextWrapByChar和updateColor,详见我上传的Label源码资源(http://download.csdn.net/detail/xiaoshu_520/9621329)
测试代码先设置Label颜色表
Label::addColor(Color3B(255,0,0));//红
Label::addColor(Color3B(255,255,128));//黄色
Label* lable1 = Label::create();
lable1->setString(“Test [c0]Label [/]Color”);
[c0]表示从这才开始后面的字符都是红色,直到[/]或者文本结束。
(颜色表中红色索引是0,黄色索引是1)