cocos2d-x使用第三方的TTF字体库
最近再做一款手机游戏,用的是cocos2d-x引擎,对于这个引擎我不太熟悉,以前我是做苹果系统的UI界面的,对于cocos2d-x这个引擎接触的比较少。后来遇到一个问题就是游戏中的很多角色都需要使用特殊的字体,比如隶书,行楷等等。但是ios内部不支持这么复杂的中文字体,怎么办呢,不多废话了,直接本主题吧。。。
1.从网上下载你所需要的字体,比如xxx.ttf,我这里推荐一个网站,http://www.zhaozi.cn/s/all/ttf/ (这是我们部门的美工推荐给我的)。
2.打开Xcode,我是在Xcode下进行编码的,至于以后移植安卓,再做介绍。打开Xcode的plist文件。如下图,首先把需要的字体文件添加进Resource目录下,然后打开这个目录下的info.plist文件(cocos2d和cocos2d-x的名字是info.plist,如果自己建别的工程,名字可能会不同),右键新建一行,起名叫做Font provided by application ,然后把你想要添加的自己写入相应的item中,注意要带后缀名。
3.我们已经把自己加入了系统中,但是如何使用呢?我看过不少网站上写着说TTF字库的名字就是字体名字,有的说你双击打开字库,窗口上的标题就是自己名字,例如
或许对于英文字库来说,可能是正确的,但是对于中文字库来说,错误率很高,设置说几乎都是错的,这也是为什么我要写这篇文章。我研究了好几天,试了很多方法,才把这个问题搞定了。下面我来介绍一下我的方法吧。
首先新建一个cocos2d或者基础的ios应用工程,注意不是cocos2d-x的,因为我们要用到oc的代码,我就新建了一个cocos2d的工程,在HelloWorldLayer类的init()方法改写成如下:
-(id) init
{
// always call "super" init
// Apple recommends to re-assign "self" with the "super's" return value
if( (self=[super init]) ) {
NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];
NSArray *fontNames;
NSInteger indFamily, indFont;
for (indFamily=0; indFamily<[familyNames count]; ++indFamily)
{
NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);
fontNames = [[NSArray alloc] initWithArray:
[UIFont fontNamesForFamilyName:
[familyNames objectAtIndex:indFamily]]];
for (indFont=0; indFont<[fontNames count]; ++indFont)
{
NSLog(@" Font name: %@", [fontNames objectAtIndex:indFont]);
}
[fontNames release];
}
[familyNames release];
}
return self;
}
运行程序,控制台就会把当前系统支持的字体都打印出来,但是这个时候面对了两三百行的字体名字,你也不知道到底哪个才是你想要的,到了关键时刻了,怎么办呢?你把这些输出复制出来,打开TextWrangler这个工具,粘贴进去,当然直接粘贴进代码也是可以的。然后你把info.plist文件中加入的几个字体库删除了,在运行一遍,这时候你得到的输出就是没有那些字体名称的,这时就找到了字体的名称
// 2013-03-01 13:43:00.934 Cocos2dLabelFont[3739:c07] Family name: FZXingKai-S04T
// 2013-03-01 13:43:00.935 Cocos2dLabelFont[3739:c07] Font name: FZXKFW--GB1-0
// 2013-03-01 13:43:01.006 Cocos2dLabelFont[3739:c07] Family name: FZPangWa-M18T
// 2013-03-01 13:43:01.007 Cocos2dLabelFont[3739:c07] Font name: FZPWFW--GB1-0
// 2013-03-01 13:43:00.920 Cocos2dLabelFont[3739:c07] Font name: TJenLei-Medium
好了,到这里你就可以使用你的字体了,记得把从info.plist文件删除的字库文件名加上。
5.现在我们在init()方法中[fontNames release];后面写上如下代码
CCLabelTTF *label1 = [CCLabelTTF labelWithString:@"长城中隶繁体0123456789" fontName:@"TJenLei-Medium" fontSize:24];
CCLabelTTF *label2 = [CCLabelTTF labelWithString:@"方正胖娃繁体0123456789" fontName:@"FZPWFW--GB1-0" fontSize:24];
CCLabelTTF *label3 = [CCLabelTTF labelWithString:@"方正行楷繁体0123456789" fontName:@"FZXKFW--GB1-0" fontSize:24];
CCLabelTTF *label4 = [CCLabelTTF labelWithString:@"方正行楷繁体0123456789" fontName:@"--unknown-1--" fontSize:24];
CGSize size = [[CCDirector sharedDirector] winSize];
label1.position = ccp( size.width /2 , size.height/2+50 );
label2.position = ccp( size.width /2 , size.height/2 );
label3.position = ccp( size.width /2 , size.height/2-50 );
label4.position = ccp( size.width /2 , size.height/2-100 );
[self addChild: label1];
[self addChild: label2];
[self addChild: label3];
[self addChild: label4];
6.运行,结果如下图
7.好了,大功告成了,现在知道了字库的自己名称,那么我们就可以把它用在cocos2d-x的工程中了,同理,使用方法如下
CCLabelTTF* labelTitle = CCLabelTTF::create("测试字体", "--unknown-1--", 24);
这就可以了。