本文仅供个人记录和复习,不用于其他用途
什么是标签
举个很简单的例子,在游戏结束的分数结算界面,你经常会看到你的游戏分数以及一个大大的GAME OVER,当然还有菜单或者再来一局。其实这些文字可以用标签做出来,不一定就得用图片来代替。那么呢,总的来说,标签其实就是显示在游戏中的那些文字。
标签也分2.x版本和3.x版本,这里我也就分开讲一讲用法。区别的方法很简单,带CC前缀的就是2.x,不带的就是3.x。
CCLabelTTF
标签介绍
CCLabelTTF是最简单且使用最方便的字体类,可以使用.ttf格式的字体。其父类为CCSprite,所以也继承了CCSprite所有的操作,故也可以将其当做CCSprite来用。
|
|
这种标签简单易操作,但是呢,它是先将字符转化为图片纹理,然后渲染至屏幕。所以这种标签不要用于频繁变动的文字,最好是用于静态文字。CCLabelTTF的实现如下:
|
|
代码实现
上面的代码列出了CCLabelTTF的主要方法,下面来看看实际的使用:
|
|
s
我们将看到一个黑色的窗口中,有着一段白色的文字“Score”。当然,我们还可以使用一些方法设置文字样式:
|
|

这段文字换成了“Grade”,并且字更大、更圆润。注意一下,setFontFillColor()不一定能在所有平台使用。
CCLabelAtlas
标签介绍
CCLabelAtlas一般常用来显示数字信息,如分数、排名等。因为只是数字所以也犯不上使用CCLabelBMFont加载那么大的文字图像,所以使用这个比较合适。而资源一般来自一张.png图片,或.plist文件。不过它也可以用来显示其他字符,如英文字符。
CCLabelAtlas继承自CCNode,可以使用父类的一些函数。同时,图片中每个字符的大小都是固定的,必须通过缩放来改变大小。
|
|
我们还可以用这几个方法来调整Label:
|
|
我们首先将等宽等高的字符放到一张大图,然后通过要显示的字符的ASCII码去找到相应的字符,并且渲染到屏幕。一次加载之后可以多次使用,比TTF的效率高。但是呢,素材需要依赖美工,显示的内容局限性太大,而且,文字的大小必须用setScale()缩放。
代码实现
首先我们需要一张字体图片:

至于字符的宽和高就需要根据图片的大小来算了,图片的大小可以从属性那一栏看到。这里就设置成24、32。
|
|
没有问题的话就能看到下面的样子:

注意到了没有,其实CCLabelAtlas的锚点默认为(0, 0),这一点一定要记住。另外,假如你的字符串打错了,输入了一些资源图片中没有的字符,比如12abc34。要知道资源图片里面没有abc,那么游戏会发生崩溃吗?游戏并不会崩溃,资源图片中没有的字会被空白所代替。
CCLabelBMFont
标签介绍
CCLabelBMFont文字是最快速最自由的字体类。CCLabelBMFont的父类是CCSpriteBatchNode,特色就是以占用更多内存为代价加快标签的更新,这与其他任何CCSprite类相似。CCLabelBMFont相当于每次改变只改变了图片坐标,而CCLabelTTF要重新渲染。
这个类使用之前,需要添加好字体文件,包括一个图片文件.png和一个字体坐标文件.fnt,这两个文件名称必须一样。可以下载一个fnt编辑工具来自定义字体。
CCLabelBMFont的每个字母或符号都是单独的一个CCSprite精灵,可以使用getChildByTag(i)来获取第i个位置上的字符,来对每个字符单独设置属性、动作等。调整大小只能使用setScale()进行缩放。
|
|
.fnt文件和.plist文件类似,记录的大图中各个元素的位置信息。
|
|
查看CCLabelBMFont类的实现,可以清楚地看到各种可能用到的方法。
代码实现
我们需要一张大图以及记录它位置信息的.fnt文件,然后创建一个CCLabelBMFont标签:
|
|
具体的效果如下:

怎么样,是不是很有感觉呢?CCLabelBMFont中的每一个字符都是一个已经加载到CCSpriteBatchNode中的CCSprite,可以通过接口取出对应的字符。这种实现的方式既灵活也多样化,优化也很好,只不过依赖于美工。
3.x版本的改变
在3.x中,废弃了2.x里的LabelTTF、LabelAtlas、LabelBMFont三个字体类,取而代之的是全新的字体标签Label。不过其实Label只是将三个类进行了融合,进行统一的管理与渲染,这使得创建字体标签Label的方式更加统一,更加方便。
Label支持四种方式的标签创建。并新增了阴影Shadow、轮廓Outline、发光Glow效果的支持。还支持文字内容的行间距、文字间距、自动换行的设置。
Label
createWithSystemFont()
该方法用于创建系统自带的字体标签,创建的方法如下:
|
|
比如,我们可以用系统字体“Arial”来创建
|
|
createWithTTF()
第一种创建方法,是与SystemFont类似,不过必须提供具体的.ttf文件路径,不能够使用系统字体的名称:
|
|
第二种创建方法,就是使用TTFConfig创建TTF:
|
|
我们可以这么用:
|
|
createWithCharMap()
CharMap的用法与2.x中的LabelAtlas是一样的,一般用来显示数字。不过它也可以用来显示其他字符,如英文字符。字体文件资源一般来自一张.png图片,或.plist文件。字体大小的缩放同样只能使用setScale()。
第一种方法,用.png图片创建,第二种用纹理,第三种用.plist:
|
|
首先用.png:
|
|
然后试试纹理:
|
|
最后再用.plist:
|
|
createWithBMFont
BMFont的用法与2.x中的LabelBMFont是一样的。在3.x中,则是使用getLetter(i)来获取单个字符,而不再是getChildByTag(i):
|
|
用法很简单,要注意的是,字符大小只能用setScale()缩放:
|
|
Label属性与方法
SpriteBatchNode类用于加快渲染,LabelProtocol类用于控制字符串。
|
|
文字渲染效果
3.x中支持三种渲染效果:
Shadow阴影Outline轮廓Glow发光
这里我们简单的演示一下:
|
|
实际效果大概就是下面这样:



发光的效果可能不太明显,不过字体确实发出了绿光。
对齐方式
水平对齐:
TextHAlignment:LEFT,左对齐TextHAlignment:CENTER,中间对齐,默认TextHAlignment:RIGHT,右对齐
垂直对齐:
TextVAlignment::TOP,顶部对齐,默认TextVAlignment::CENTER,中间对齐TextVAlignment::BOTTOM,底部对齐
注意,这两种对齐只有在使用setDimensions(width, height)设置了Label的尺寸大小后,才能够使用。
自动换行
我们可以使用‘\n’来控制换行,但是呢,我们同样可以使用Cocos自带的自动换行。这里我们调用Label的子方法来开启自动换行:
|
|
上面简单的设置了每行的最大宽度,但是呢,使用这种方法必须是没有设置标签的尺寸。如果你觉得需要规范文本大小,你也可以这么做:
|
|
但是这么用的话,我们就无法使用setMaxLineWidth()来设置了。
文字间距
3.2版本后,可以调整文字的行间距和文字间距:
|
|
注意,SystemFont不支持这种用法。
单独设置某个字符
我们可以使用下面的方法获取某个字符:
lb->getStringLength(),获取字符串长度lb->getLetter(i),获取第i个位置上的字符
|
|
注意,SystemFont不支持这种用法。