天天看點

瘋狂ios之cocos2d中的文本

在遊戲當中經常需要添加标簽和文本對此cocos2d提供了強大的文本渲染功能。cocos2d支援所有内置的iOS字型以及一些TrueType字型。

在cocos2d中文本渲染功能通常由兩個類實作CCLabelTTF和CCLabelBMFont。下面我們來詳細說明這兩個類在實際項目當中如何使用。

CCLabelTTF類繼承自CCSprite因為其渲染速度相對較慢是以通常用于顯示一些靜态的标簽和純文字。CCLabelTTF類的常用方法如下。

+(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類。實作代碼如下。

程式清單codes/13/13.12/LabelTTFTest/LabelTTFTest/HelloWorldLayer.m

-(id) init

{

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所示。

瘋狂ios之cocos2d中的文本

上面代碼首先使用特定的文本内容、字型名稱和字型大小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官方推薦以下幾種建立字型圖集的工具。

qGlyph Designer該軟體為收費的商業軟體下載下傳位址為http://glyphdesigner. 71squared.com。

qSlick2D Hiero Bitmap Font Generator該軟體為Java開發的免費軟體下載下傳位址為http://slick.cokeandcode.com/demos/hiero.jnlp。

qHiero該軟體為Java開發的免費軟體使用簡單下載下傳位址為http://www.n4te.com/ hiero/hiero.jnlp。

本書使用Hiero軟體建立字型圖集它的作用類似于前面建立紋理圖集的Zwoptex。

打開浏覽器在位址欄輸入http://www.n4te.com/hiero/hiero.jnlp下載下傳Hiero工具。

瘋狂ios之cocos2d中的文本

打開Hiero後主界面顯示如圖13.51所示。

瘋狂ios之cocos2d中的文本

在主界面左上方“Font”字型清單框中選擇字型如“Arial Rounded MT Bold”。選擇後上方中間位置的“Sample Text”清單框中會顯示相對應的字型樣本。

在上方右側的“Effects”清單框中可以設定顔色、輪廓、陰影等。

在下方的“Rendering”區域切換到“Glyph cache”将“Page width”和“Page height”設定為256使用最小的2的次方的圖像包含所有需要的文本字元。Hiero将建立一個256*256的字型圖集如圖13.52所示。

瘋狂ios之cocos2d中的文本

單擊左上角的“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

// 建立一個标簽使用my.fnt字型圖集

CCLabelBMFont *label = [CCLabelBMFont

labelWithString:@"Hello BMFont" fntFile:@"my.fnt"];

// CCScaleBy動作2秒後放大2倍

id scaleBy = [CCScaleBy actionWithDuration:2.0f scale:2];

[label runAction:scaleBy];

單擊“Run”按鈕執行LabelBMFontTest項目模拟器顯示如圖13.53所示。

瘋狂ios之cocos2d中的文本

上面代碼首先用CCLabelBMFont的類方法建立了一個标簽并使用了剛剛在Hiero中生成的my.fnt字型圖集然後将标簽設定在螢幕正中。接下來讓标簽執行一個動作2秒之後放大到原來的2倍。通過觀察發現标簽放大後字型邊緣會出現鋸齒為什麼會出現這種現象呢因為CCLabelBMFont是紋理圖紋理圖類似于位圖位圖在放大時會出現模糊或者失真現象。是以在開發中使用CCLabelBMFont時不要把縮放比例設定得過大如果字型标簽需要縮放對于不同大小的字元需要設定不同的字型圖集。

本文轉自 

fkJava李剛 51CTO部落格,原文連結:http://blog.51cto.com/javaligang/1396135 ,如需轉載請自行聯系原作者

繼續閱讀