1. 程式人生 > >cocos2d-x Label不同文字不同顏色

cocos2d-x Label不同文字不同顏色

前一段時間在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)