Label可以通过getLetter(i)获取位于字符串i位置的字符(不支持system类型创建的label,我这边是用TTF),然后通过setColor设置字符的颜色。但是有时候i不确定,所以我在这边自己做了一些处理。比如“获得了紫色品质的装备”,想让“紫色品质”四个字变成紫色,可以这样做:“获得了#2C%s#2C的装备。然后再用String::createWithFormat()一下,就得到字符串——“获得了#2C紫色品质#2C的装备”,这里#2C代表紫色。这个可以自己设定。然后在对字符串进行处理。主要是找出并保存#2C的位置,并删除#2C。然后根据找出来的#2C的位置,进行getLetter(i),再setColor()。部分代码如下:

vector<int> posvec;
vector<int> colorVec;
posvec.clear();
int position=0;
int lastPos = 0;
int lastTraversalPos = 0;
while((position = strContent.find("#",position))!=string::npos)
{
int cPosition = strContent.find("C",position);
if (cPosition != string::npos && (cPosition - position) > 1 && strContent[cPosition] == 'C')
{// 如果%后面找不到C或者%C中间没有数字则不进来
int color = 0;
for (int m = 1; m < (cPosition - position); m ++)
{
auto charColor = strContent.substr(position + m,1);
color += atoi(charColor.c_str()) + (cPosition - position - m - 1) * 10;
}
if (position != lastPos)
{
int strNum = 0;
int m = lastTraversalPos;
for (; m < position; )
{
char c = strContent[m];
if (c >= 0 && c <= 127)
{
strNum ++;
m += 1;
}
else if (c >= 192 && c <= 223)
{
strNum ++;
m += 2;
}
else if (c >= 224 && c <= 239)
{
strNum ++;
m += 3;
}
else if (c >= 240 && c <= 247)
{
strNum ++;
m += 4;
}
else
{
strNum ++;
m += 3;
}
}
position = strNum + lastPos;
lastPos = position;
lastTraversalPos = m;
}
posvec.push_back(position);
colorVec.push_back(color);
//position=s.find_first_of(flag,position);
strContent.erase(lastTraversalPos,3);
}
else
{
position ++;
}
}

这里会有一个问题,就是如果你设置了文本的宽度,即setDimensions(),并且字符串的长度超过宽度的时候,会自动换行,那么Label原来的字符串就会被插入相对应个数的’n',这样你在getLetter的时候有可能获取到的不是你想要的字符。这时候就要跟到引擎代码里面去看。发现在getLetter的时候会内部会调用Label::updateContent()函数。这个函数里面会调用alignText(),这将会对字符串进行重新排版,有需要换行的话,会自动在相应位置插入'\n'。所以我们可以记录下插入'\n'的位置。跟着源代码进去发现在cclabeltextformatter.cpp里面的multilineText()函数进行插入'\n'处理的。所以可以在这里面添加一个函数,获取记录下的位置。然后对我们之前保存的#2C的位置进行调整。插入的位置如果小于#2C的位置,那么#2C就要+1了。部分代码如下:

m_pLabel->setString(strContent.c_str());
m_pLabel->updateContent();

vector<int> insertCharacterPosvec = m_pLabel->getInsertCharacterPos();
for (int originalItr = 0; originalItr < posvec.size(); originalItr ++)
{// 如果字符串的长度超过了文本框的宽度,会自动换行,这时候会在原来的string上插入'\n',整个string长度发生改变。导致接下来的getLetter找不到想要的。所以在这里做处理。
for (int vecItr = 0; vecItr < insertCharacterPosvec.size(); vecItr ++)
{
if (posvec[originalItr] > insertCharacterPosvec[vecItr])
{
posvec[originalItr] ++;
}
}
}


还会有一个问题就是如果同一个Label进行多次的setString的时候可能会出现”Assertion Failed: (index>=0 && index<_totalQuads),function removeQuadAtIndex”这个错误。我在setString之前调用一下label->removeAllChildrenWithCleanup(true)就好了。

写得比较乱,主要说明一下大概思路,也算是笔记吧~~

cocos2dx 3.3 Label对指定字符设置颜色的更多相关文章

  1. 用canvas做一个DVD待机动画的实现代码

    这篇文章主要介绍了用canvas做一个DVD待机动画的实现代码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. HTML5自定义视频播放器源码

    这篇文章主要介绍了HTML5自定义视频播放器源码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  3. Html5 滚动穿透的方法

    这篇文章主要介绍了Html5 滚动穿透的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  4. HTML5自定义mp3播放器源码

    这篇文章主要介绍了HTML5自定义mp3播放器源码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  5. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  6. html5默认气泡修改的代码详解

    这篇文章主要介绍了html5默认气泡修改的代码详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  7. Html5移动端适配IphoneX等机型的方法

    这篇文章主要介绍了Html5移动端适配IphoneX等机型的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. 小程序瀑布流解决左右两边高度差距过大的问题

    这篇文章主要介绍了小程序瀑布流解决左右两边高度差距过大的问题的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. HTML5自定义元素播放焦点图动画的实现

    这篇文章主要介绍了HTML5自定义元素播放焦点图动画的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部