cocos2d-x使用第三方的TTF字体库

时间:2023-02-08 18:36:28

http://blog.csdn.net/wm_jiangnanan/article/details/8665040


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中,注意要带后缀名。

cocos2d-x使用第三方的TTF字体库


3.我们已经把自己加入了系统中,但是如何使用呢?我看过不少网站上写着说TTF字库的名字就是字体名字,有的说你双击打开字库,窗口上的标题就是自己名字,例如

cocos2d-x使用第三方的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.运行,结果如下图


cocos2d-x使用第三方的TTF字体库


7.好了,大功告成了,现在知道了字库的自己名称,那么我们就可以把它用在cocos2d-x的工程中了,同理,使用方法如下

    CCLabelTTF* labelTitle = CCLabelTTF::create("测试字体", "--unknown-1--", 24);
这就可以了。