最近再做一款手機游戲,用的是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);
這就可以了。