在游戲當(dāng)中經(jīng)常需要添加標(biāo)簽和文本對此cocos2d提供了強(qiáng)大的文本渲染功能。cocos2d支持所有內(nèi)置的iOS字體以及一些TrueType字體。
創(chuàng)新互聯(lián)建站服務(wù)項(xiàng)目包括吉縣網(wǎng)站建設(shè)、吉縣網(wǎng)站制作、吉縣網(wǎng)頁制作以及吉縣網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,吉縣網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到吉縣省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
在cocos2d中文本渲染功能通常由兩個(gè)類實(shí)現(xiàn)CCLabelTTF和CCLabelBMFont。下面我們來詳細(xì)說明這兩個(gè)類在實(shí)際項(xiàng)目當(dāng)中如何使用。
CCLabelTTF類繼承自CCSprite因?yàn)槠滗秩舅俣认鄬^慢所以通常用于顯示一些靜態(tài)的標(biāo)簽和純文本。CCLabelTTF類的常用方法如下。
+(id)labelWithString:(NSString*)string fontName:(NSString*)name fontSize:(CGFloat)size該方法根據(jù)字體名稱和字體大小初始化一個(gè)新的標(biāo)簽對象CCLabelTTF對象將使用CCTexture2D類從文本創(chuàng)建一個(gè)紋理圖。
-(id)initWithString:(NSString*)string fontName:(NSString*)name fontSize:(CGFloat)size該方法根據(jù)字體名稱和字體大小初始化一個(gè)新的標(biāo)簽對象CCLabelTTF對象將使用CCTexture2D類從文本創(chuàng)建一個(gè)紋理圖。該方法與前一個(gè)方法功能大致相似只不過該方法是實(shí)例方法需要用CCLabelTTF對象調(diào)用。
-(void) setString:(NSString*)str該方法設(shè)置CCLabelTTF對象的文本內(nèi)容。
接下來我們通過示例演示在項(xiàng)目中如何使用CCLabelTTF類。實(shí)現(xiàn)代碼如下。
程序清單codes/13/13.12/LabelTTFTest/LabelTTFTest/HelloWorldLayer.m
-(id) init
{
if( (self=[super init]) ) {
CGSize winSize = [[CCDirector sharedDirector] winSize];
// 使用特定的文本內(nèi)容、字體名稱和字體大小3個(gè)參數(shù)創(chuàng)建并初始化一個(gè)新的標(biāo)簽對象
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”按鈕執(zhí)行LabelTTFTest項(xiàng)目模擬器屏幕正中顯示HelloWorld標(biāo)簽控制臺輸出如圖13.50所示。
上面代碼首先使用特定的文本內(nèi)容、字體名稱和字體大小3個(gè)參數(shù)創(chuàng)建并初始化了一個(gè)新的標(biāo)簽對象然后設(shè)置了標(biāo)簽在屏幕中的位置并添加為當(dāng)前層的子節(jié)點(diǎn)最后從UIFont類中查詢出iOS中的所有可用字體并打印在控制臺中。
使用CCLabelTTF類顯示靜態(tài)的標(biāo)簽文本很方便但是渲染速度相對較慢并且缺乏靈活性為此cocos2d提供了CCLabelAtlas類和CCLabelBMFont類來替代CCLabelTTF類。由于CCLabelAtlas類相對于CCLabelBMFont類來說過于復(fù)雜所以在實(shí)際開發(fā)中通常建議使用CCLabelBMFont類。CCLabelBMFont類和CCLabelTTF類的區(qū)別如下。
CCLabelBMFont類的渲染速度要比CCLabelTTF類快很多。
CCLabelBMFont類來自于圖片文件并且有很多第三方編輯器支持非常靈活。
CCLabelBMFont類支持不同寬度的字符。
所以如果在項(xiàng)目開發(fā)中只是需要使用標(biāo)準(zhǔn)的iOS字體并且不需要經(jīng)常修改標(biāo)簽的文本內(nèi)容那么使用CCLabelTTF類就可以滿足。但有些時(shí)候如果需要使用定制的字體而且需要每一幀都更改文本的內(nèi)容這時(shí)就建議使用CCLabelBMFont類。
CCLabelBMFont類繼承自CCSpriteBatchNode并實(shí)現(xiàn)了CCLabelProtocol和CCRGBAProtocol兩個(gè)協(xié)議。因?yàn)槔^承自CCSpriteBatchNode所以文本中的每一個(gè)字符會被作為一個(gè)獨(dú)立的CCSprite精靈對象看待每個(gè)字符的大小、著色、透明度和旋轉(zhuǎn)角度等屬性都可以被修改。CCLabelBMFont類還可以被當(dāng)作菜單項(xiàng)的一部分。CCLabelBMFont類有如下兩個(gè)特有的屬性。
opacity透明度變量類型是Glubyte。
color顏色變量類型是ccColor3B使用RGB數(shù)值表示的色彩。
那么CCLabelBMFont類如何使用呢因?yàn)镃CLabelBMFont類繼承自CCSpriteBatchNode并且來自于圖片文件所以其實(shí)它的作用就相當(dāng)于精靈表單而其中的每一個(gè)字符則相當(dāng)于精靈表單中的單個(gè)精靈對象。字符是以圖片形式存儲的因此必須使用字體圖集。字體圖集其實(shí)就是一張大的圖片其中包含了所有要顯示的字符以及描述字符在字體圖集中位置的坐標(biāo)數(shù)據(jù)字體圖集可以理解成前面學(xué)習(xí)過的精靈表單。當(dāng)字符是以圖片形式存儲時(shí)也無法直接修改它的大小如果在游戲當(dāng)中需要使用多種大小不同的字符我們必須為每一種大小創(chuàng)建一個(gè)單獨(dú)的字體圖集。
cocos2d中使用FNT文件保存位圖字體cocos2d本身并沒有提供創(chuàng)建字體圖集的工具但是有很多第三方工具可以創(chuàng)建字體圖集。cocos2d官方推薦以下幾種創(chuàng)建字體圖集的工具。
qGlyph Designer該軟件為收費(fèi)的商業(yè)軟件下載地址為http://glyphdesigner. 71squared.com。
qSlick2D Hiero Bitmap Font Generator該軟件為Java開發(fā)的免費(fèi)軟件下載地址為http://slick.cokeandcode.com/demos/hiero.jnlp。
qHiero該軟件為Java開發(fā)的免費(fèi)軟件使用簡單下載地址為http://www.n4te.com/ hiero/hiero.jnlp。
本書使用Hiero軟件創(chuàng)建字體圖集它的作用類似于前面創(chuàng)建紋理圖集的Zwoptex。
打開瀏覽器在地址欄輸入http://www.n4te.com/hiero/hiero.jnlp下載Hiero工具。
打開Hiero后主界面顯示如圖13.51所示。
在主界面左上方“Font”字體列表框中選擇字體如“Arial Rounded MT Bold”。選擇后上方中間位置的“Sample Text”列表框中會顯示相對應(yīng)的字體樣本。
在上方右側(cè)的“Effects”列表框中可以設(shè)置顏色、輪廓、陰影等。
在下方的“Rendering”區(qū)域切換到“Glyph cache”將“Page width”和“Page height”設(shè)置為256使用最小的2的次方的圖像包含所有需要的文本字符。Hiero將創(chuàng)建一個(gè)256*256的字體圖集如圖13.52所示。
單擊左上角的“File”選擇“Save BMFont files”將文件命名為“my.fnt”。Hiero將同時(shí)創(chuàng)建一個(gè)FNT文件和一個(gè)PNG文件FNT文件就類似于使用Zwoptex創(chuàng)建的plist文件。
以上就是使用Hiero制作字體圖集的具體方法。接下來將演示如何使用CCLabelBMFont類在游戲開發(fā)中使用字體圖集。
首先創(chuàng)建一個(gè)LabelBMFontTest項(xiàng)目選擇“Resources”組并單擊右鍵選擇“Add Files to‘LabelBMFontTest’”將剛才生成的my.fnt和my.png添加到Resoures組當(dāng)中。接下來在init方法里面添加一段代碼使用LabelBMFontTest操作字體圖集。實(shí)現(xiàn)代碼如下。
程序清單codes/13/13.12/LabelBMFontTest/LabelBMFontTest/HelloWorldLayer.m
-(id) init
{
if( (self=[super init]) ) {
CGSize winSize = [[CCDirector sharedDirector] winSize];
// 創(chuàng)建一個(gè)標(biāo)簽使用my.fnt字體圖集
CCLabelBMFont *label = [CCLabelBMFont
labelWithString:@"Hello BMFont" fntFile:@"my.fnt"];
label.position = ccp(winSize.width/2,winSize.height/2);
[self addChild:label];
// CCScaleBy動(dòng)作2秒后放大2倍
id scaleBy = [CCScaleBy actionWithDuration:2.0f scale:2];
[label runAction:scaleBy];
}
return self;
}
單擊“Run”按鈕執(zhí)行LabelBMFontTest項(xiàng)目模擬器顯示如圖13.53所示。
上面代碼首先用CCLabelBMFont的類方法創(chuàng)建了一個(gè)標(biāo)簽并使用了剛剛在Hiero中生成的my.fnt字體圖集然后將標(biāo)簽設(shè)置在屏幕正中。接下來讓標(biāo)簽執(zhí)行一個(gè)動(dòng)作2秒之后放大到原來的2倍。通過觀察發(fā)現(xiàn)標(biāo)簽放大后字體邊緣會出現(xiàn)鋸齒為什么會出現(xiàn)這種現(xiàn)象呢因?yàn)镃CLabelBMFont是紋理圖紋理圖類似于位圖位圖在放大時(shí)會出現(xiàn)模糊或者失真現(xiàn)象。所以在開發(fā)中使用CCLabelBMFont時(shí)不要把縮放比例設(shè)置得過大如果字體標(biāo)簽需要縮放對于不同大小的字符需要設(shè)置不同的字體圖集。