在游戏当中常常须要添加标签和文本对此cocos2d提供了强大的文本渲染功能。cocos2d支持全部内置的iOS字体以及一些TrueType字体。浏览器
在cocos2d中文本渲染功能一般由两个类实现CCLabelTTF和CCLabelBMFont。下面咱们来详细说明这两个类在实际项目当中如何使用。编辑器
CCLabelTTF类继承自CCSprite由于其渲染速度相对较慢因此一般用于显示一些静态的标签和纯文本。CCLabelTTF类的经常使用方法以下。ide
+(id)labelWithString:(NSString*)string fontName:(NSString*)name fontSize:(CGFloat)size该方法根据字体名称和字体大小初始化一个新的标签对象CCLabelTTF对象将使用CCTexture2D类从文本建立一个纹理图。工具
-(id)initWithString:(NSString*)string fontName:(NSString*)name fontSize:(CGFloat)size该方法根据字体名称和字体大小初始化一个新的标签对象CCLabelTTF对象将使用CCTexture2D类从文本建立一个纹理图。该方法与前一个方法功能大体类似只不过该方法是实例方法须要用CCLabelTTF对象调用。学习
-(void) setString:(NSString*)str该方法设置CCLabelTTF对象的文本内容。字体
接下来咱们经过示例演示在项目中如何使用CCLabelTTF类。实现代码以下。ui
程序清单codes/13/13.12/LabelTTFTest/LabelTTFTest/HelloWorldLayer.mspa
-(id) init.net
{code
if( (self=[super init]) ) {
CGSize winSize = [[CCDirector sharedDirector] winSize];
// 使用特定的文本内容、字体名称和字体大小3个参数建立并初始化一个新的标签对象
CCLabelTTF *label = [CCLabelTTF labelWithString:@"Hello World"
fontName:@"Marker Felt" fontSize:64];
label.position = ccp(winSize.width/2,winSize.height/2);
[self addChild:label];
// iOS支持的全部字体
NSArray *fontFamilyNames = [UIFont familyNames];
for (NSString *familyName in fontFamilyNames) {
NSArray *names = [UIFont fontNamesForFamilyName:familyName];
CCLOG(@"%@ = %@",familyName,names);
}
}
return self;
}
单击“Run”按钮执行LabelTTFTest项目模拟器屏幕正中显示HelloWorld标签控制台输出如图13.50所示。
上面代码首先使用特定的文本内容、字体名称和字体大小3个参数建立并初始化了一个新的标签对象而后设置了标签在屏幕中的位置并添加为当前层的子节点最后从UIFont类中查询出iOS中的全部可用字体并打印在控制台中。
使用CCLabelTTF类显示静态的标签文本很方便可是渲染速度相对较慢而且缺少灵活性为此cocos2d提供了CCLabelAtlas类和CCLabelBMFont类来替代CCLabelTTF类。因为CCLabelAtlas类相对于CCLabelBMFont类来讲过于复杂因此在实际开发中一般建议使用CCLabelBMFont类。CCLabelBMFont类和CCLabelTTF类的区别以下。
CCLabelBMFont类的渲染速度要比CCLabelTTF类快不少。
CCLabelBMFont类来自于图片文件而且有不少第三方编辑器支持很是灵活。
CCLabelBMFont类支持不一样宽度的字符。
因此若是在项目开发中只是须要使用标准的iOS字体而且不须要常常修改标签的文本内容那么使用CCLabelTTF类就能够知足。但有些时候若是须要使用定制的字体并且须要每一帧都更改文本的内容这时就建议使用CCLabelBMFont类。
CCLabelBMFont类继承自CCSpriteBatchNode并实现了CCLabelProtocol和CCRGBAProtocol两个协议。由于继承自CCSpriteBatchNode因此文本中的每个字符会被做为一个独立的CCSprite精灵对象看待每一个字符的大小、着色、透明度和旋转角度等属性均可以被修改。CCLabelBMFont类还能够被看成菜单项的一部分。CCLabelBMFont类有以下两个特有的属性。
opacity透明度变量类型是Glubyte。
color颜色变量类型是ccColor3B使用RGB数值表示的色彩。
那么CCLabelBMFont类如何使用呢由于CCLabelBMFont类继承自CCSpriteBatchNode而且来自于图片文件因此其实它的做用就至关于精灵表单而其中的每个字符则至关于精灵表单中的单个精灵对象。字符是以图片形式存储的所以必须使用字体图集。字体图集其实就是一张大的图片其中包含了全部要显示的字符以及描述字符在字体图集中位置的坐标数据字体图集能够理解成前面学习过的精灵表单。当字符是以图片形式存储时也没法直接修改它的大小若是在游戏当中须要使用多种大小不一样的字符咱们必须为每一种大小建立一个单独的字体图集。
cocos2d中使用FNT文件保存位图字体cocos2d自己并无提供建立字体图集的工具可是有不少第三方工具能够建立字体图集。cocos2d官方推荐如下几种建立字体图集的工具。
q
Glyph Designer该软件为收费的商业软件下载地址为http://glyphdesigner. 71squared.com。
q
Slick2D Hiero Bitmap Font Generator该软件为Java开发的免费软件下载地址为http://slick.cokeandcode.com/demos/hiero.jnlp。
q
Hiero该软件为Java开发的免费软件使用简单下载地址为http://www.n4te.com/ hiero/hiero.jnlp。
本书使用Hiero软件建立字体图集它的做用相似于前面建立纹理图集的Zwoptex。
打开浏览器在地址栏输入http://www.n4te.com/hiero/hiero.jnlp下载Hiero工具。
打开Hiero后主界面显示如图13.51所示。
在主界面左上方“Font”字体列表框中选择字体如“Arial Rounded MT Bold”。选择后上方中间位置的“Sample Text”列表框中会显示相对应的字体样本。
在上方右侧的“Effects”列表框中能够设置颜色、轮廓、阴影等。
在下方的“Rendering”区域切换到“Glyph cache”将“Page width”和“Page height”设置为256使用最小的2的次方的图像包含全部须要的文本字符。Hiero将建立一个256*256的字体图集如图13.52所示。
单击左上角的“File”选择“Save BMFont files”将文件命名为“my.fnt”。Hiero将同时建立一个FNT文件和一个PNG文件FNT文件就相似于使用Zwoptex建立的plist文件。
以上就是使用Hiero制做字体图集的具体方法。接下来将演示如何使用CCLabelBMFont类在游戏开发中使用字体图集。
首先建立一个LabelBMFontTest项目选择“Resources”组并单击右键选择“Add Files to‘LabelBMFontTest’”将刚才生成的my.fnt和my.png添加到Resoures组当中。接下来在init方法里面添加一段代码使用LabelBMFontTest操做字体图集。实现代码以下。
程序清单codes/13/13.12/LabelBMFontTest/LabelBMFontTest/HelloWorldLayer.m
-(id) init
{
if( (self=[super init]) ) {
CGSize winSize = [[CCDirector sharedDirector] winSize];
// 建立一个标签使用my.fnt字体图集
CCLabelBMFont *label = [CCLabelBMFont
labelWithString:@"Hello BMFont" fntFile:@"my.fnt"];
label.position = ccp(winSize.width/2,winSize.height/2);
[self addChild:label];
// CCScaleBy动做2秒后放大2倍
id scaleBy = [CCScaleBy actionWithDuration:2.0f scale:2];
[label runAction:scaleBy];
}
return self;
}
单击“Run”按钮执行LabelBMFontTest项目模拟器显示如图13.53所示。
上面代码首先用CCLabelBMFont的类方法建立了一个标签并使用了刚刚在Hiero中生成的my.fnt字体图集而后将标签设置在屏幕正中。接下来让标签执行一个动做2秒以后放大到原来的2倍。经过观察发现标签放大后字体边缘会出现锯齿为何会出现这种现象呢由于CCLabelBMFont是纹理图纹理图相似于位图位图在放大时会出现模糊或者失真现象。因此在开发中使用CCLabelBMFont时不要把缩放比例设置得过大若是字体标签须要缩放对于不一样大小的字符须要设置不一样的字体图集。