转载1:
在 cocos2d 中有三个类可以在层或精灵中添加文字:
- CCLabelTTF
- CCLabelBMFont
- CCLabelAtlas
CCLabelTTF 每次调用 setString (即改变文字)的时候,一个新的OPENGL 纹理将会被创建.。这意味着setString 和创建一个新的标签一样慢。所以,当你需要频繁的更新它们的时候,尽可能的不用去使用标签对象。而应该使用CCLabelAtlas或者是CCLabelBMFont。
CCLableTTF
CCLabelTTF *label = [CCLabelTTF labelWithString:@"the string"
fontName:@"Marker Felt"
fontSize:21];
[layer addChild:label];
label.position = ......
// [label setString:@“change string”];
这个类使用的是系统中的字体,不需要额外往项目文件中添加字体文件。但如果你有自定义的字体也可以加到项目中,如果无法使用,可以查看一下ccConfig.h中的CC_FONT_LABEL_SUPPORT是否enable了。
解释一下上面的参数,labelWithString 就是指生成的这个文字标签的文字“the string”,你想写什么就可以些什么, fontName就是字体名称, fontSize是字体大小。
如果需要添加之后需要修改文字,可以使用 setString 方法。
CCLabelBMFont
CCLabelBMFont *label =[CCLabelBMFont labelWithString:@"the string"
fntFile:@"konqa32-hd.fnt"];
[layer addChild:label];
label.position = ......
// [label setString:@“change string”];
这个类使用之前,需要添加好字体文件,包括一个图片文件 (**.png) 和一个 字体坐标文件 (**.fnt)。在 cocos2d的示例项目中有现成的,可以先拿过来练习一下,找的时候注意两个文件的名称是相同的,只是扩展名不同。
解释一下参数, labelWithString 同上面一样,也是指定文字。 fntFile是文件名,写扩展名是 .fnt的那个。下面是 .fnt文件的截图
可以看到 .fnt 文件定义了 图像文件的名称,以及每个字符对应的位置信息。
这个没办法指定字体的字号,但可以用 scale 属性进行缩放来调整大小。就当它是sprite。
CCLabelAtlas
CCLabelAtlas *label = [CCLabelAtlas labelWithString:@"the string"
charMapFile:@"fps_images.png"
itemWidth:12
itemHeight:18
startCharMap:'.'];
[layer addChild:label];
label.position = ......
// [label setString:@“change string”];
在项目文件中,在resourse group里你可以找一下一个叫 fps_images.png的这个图像文件,文件如下:
解释一下参数,labelWithString就是字符, charMapFile 就是字符的图像文件(这个只要图像文件就可以了),itemWidth是每个字符的宽度,itemHeight是每个字符的高度,这个不能设错,否则显示的时候可能就不对了。 最后一个是你字体第一个字符的ASCII码值,不过不用传ASCII,而是对应的字符,
转载2:
CCLabelAtlas
CCLabelBMFont
CCLabelTTF
简单介绍
CCLabelAtlas
继承关系图
介绍
上面说明了以下几点:
1、CCLabelAtlas 比CCLabel(CCLabelTTF)快很多
2、CCLabelAtlas 中的每个字符必须有固定的高度和宽度
3、CCLabelAtlas 可以做你想要的,前提是你提供给他一张你想操作的字体的图片
4、CCLabelBMFont 比CCLabelAtlas 更灵活,他支持的字体宽可以参数化
5、增加一点,要用CCLabelAtlas创建字体你必须给出图片到字体的映射方式,也就是设置里面startCharMap的参数值,每种字体的映射方式不一样
CCLabelBMFont
继承关系图
介绍
继续说明
1、 首先CCLabelBMFont是CCSpriteBatchNode的一个子类(这个很强大)
2、 他能够把每一个字符当做一个CCSprite,这意味着每一个单独的字符都可以有自己的动作(什么旋转,放大,改变透明度)
3、 所有内部字符的的定位点(anchorpoint)为(0.5,0.5),也就是说每一个字符相对于坐标点的位置为该字符的中心点(而不是左上角,或则左下角),这里说了建议不要去修改他,因为这种改变可能会影响绘制
4、 CCLabelBMFont不仅具有CCLabel(CCLabelTTF)的灵活性,而且有CCLabelAtlas的速度和所有CCSprite的功能,如果你在考虑用CCLabelBMFont还是CCLabelAtlas时,那么就用CCLabelBMFont吧
CCLabelTTF
继承关系图
介绍
说明
CCLabelTTF很慢,考虑用CCLabelAtlas和CCLabelBMFont来替代
字体的创建方式
和cocos2d-x中大多数类型一样,字体也实现了静态工厂的模式(通过静态方法创建,采用CCPoolManager管理内存),当然你也可以采用非静态方法来创建
CCLabelAtlas:
上面已经说了
CCLabelAtlas创建的字体相对于你给的字体图片来说必须有固定的宽度和高度,你还应该给出固定的映射方式(否则创建的字体达不到你的要的效果)
setString函数:
我们可以通过初始化的方式设置label显示的字符串,如果你想改变label显示的字符串,那么你就需要用到setString函数
CCLabelAtlas:
CCLabelBMFont:
CCLabelTTF:
通过上面的源代码我们能大概描述出其创建的方式
CCLabelAtlas:
1、将字符串清空
2、将设置的字符串赋值给先前清空的字符串
CCLabelBMFont:
1、将字符串清空
2、
将设置的字符串赋值给先前清空的字符串
3、将每个节点设置为隐藏(
CCLabelBMFont 中对待每个字符是以CCNode的方式,因为他是CCSpriteBathNode的派生类)
4、显示新的字符(我们可以猜测这里的createFontChars的功能就是将新的字符赋值到每个节点中,后将节点显示出来)
CCLabelTTF
1、将字符串析构掉
2、重新new一个字符串
3、创建新的texture
4、将texture设置进去
从上面的setString函数调用开销可以看出一般我们在需要频繁改变显示的字符串的时候我们最好是采用
CCLabelAtlas,比如说显示时钟的时候,其次是
CCLabelBMFont,最后是
CCLabelTTF
具体的创建和使用上面三个类,我们可以通过Cocos2d-x中FontTest来进行测试
最后需要说明的是上面的这些类全都继承自CCNode,CCNode有个接口函数runAction,也就是说我们可以将cocos2d-x中的所有动作和这些label结合起来显示,而CCLabelBMFont是以CCNode的方式对待每个字符,那么每个字符都可以创建出动作