本文仅供个人记录和复习,不用于其他用途
什么是标签
举个很简单的例子,在游戏结束的分数结算界面,你经常会看到你的游戏分数以及一个大大的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
不支持这种用法。