1. 程式人生 > >cocos2dx基礎篇(2)——字型標籤CCLabel

cocos2dx基礎篇(2)——字型標籤CCLabel

【嘮叨】

    CCLabelTTF、CCLabelAtlas、CCLabelBMFont。

    cocos2dx提供了三種文字字型的顯示:CCLabelTTF(一般字型)、CCLabelAtlas(自定義字型)、CCLabelBMFont(自定義字型)。接下來給大家講講這三種字型的使用方法。

【CCLabelTTF】

    CCLabelTTF是最簡單且使用最方便的字型類,可以使用.ttf格式的字型。其父類為CCSprite,所以也繼承了CCSprite所有的操作,故也可以將其當做CCSprite來用。

    CCLabelTTF每次呼叫 setString(即改變文字)的時候,一個新的OpenGL紋理將會被建立。這意味著setString和建立一個新的標籤一樣慢。所以,當你需要頻繁的更新顯示的文字內容的時候,儘可能不去使用該物件,而是使用CCLabelAtlas或者是CCLabelBMFont。

1、常用操作

//
class CC_DLL CCLabelTTF : public CCSprite, public CCLabelProtocol
{
/**
 *		建立CCLabelTTF的三種方法
 */
	//create(要顯示的字串,字型名稱.ttf,字型大小);
	//create(要顯示的字串,字型名稱.ttf,字型大小,尺寸大小CCSize,水平對其方式)
	//create(要顯示的字串,字型名稱.ttf,字型大小,尺寸大小CCSize,水平對其方式,垂直對齊方式)
	static CCLabelTTF* create(const char *string, const char *fontName, float fontSize);
	static CCLabelTTF* create(const char *string, const char *fontName, float fontSize, const CCSize& dimensions, CCTextAlignment hAlignment);
	static CCLabelTTF* create(const char *string, const char *fontName, float fontSize, const CCSize& dimensions, CCTextAlignment hAlignment, CCVerticalTextAlignment vAlignment);


/**
 *		屬性設定
 *		setString , 
 *		setHorizontalAlignment , setVerticalAlignment , 
 *		setDimensions , setFontSize , setFontName
 */
	//顯示的字串內容
	void setString(const char *label);
	const char* getString(void);

	//水平對齊方式CCTextAlignment::
		//kCCTextAlignmentLeft             左對齊
		//kCCTextAlignmentCenter           居中,預設方式
		//kCCTextAlignmentRight            右對齊
	void setHorizontalAlignment(CCTextAlignment alignment);
	CCTextAlignment getHorizontalAlignment();

	//垂直對齊方式CCVerticalTextAlignment::
		//kCCVerticalTextAlignmentBottom   底部
		//kCCVerticalTextAlignmentCenter   中心
		//kCCVerticalTextAlignmentTop      頂部,預設方式
	void setVerticalAlignment(CCVerticalTextAlignment verticalAlignment);
	CCVerticalTextAlignment getVerticalAlignment();

	//尺寸大小
	void setDimensions(const CCSize &dim);
	CCSize getDimensions();

	//字型大小
	void setFontSize(float fontSize);
	float getFontSize();

	//字型型別名 如Arial,宋體等
	void setFontName(const char *fontName);
	const char* getFontName();


/**
 *		繼承自CCSprite常用函式
 *		更多操作見:http://shahdza.blog.51cto.com/2410787/1539567
 */
	setColor(ccColor3B);  //設定顏色
	setPosition(CCPoint); //設定位置
	setRotation(float);   //旋轉角度,角度制0~360
	setOpacity(float);    //設定透明度
	setScale(float);      //放縮
	setFlipX(float);      //左右翻轉
}
//

2、程式碼舉例

//
	bool HelloWorld::init()
	{
		if ( !CCLayer::init() )return false;
		
	//獲取可視區域尺寸大小
		CCSize mysize = CCDirector::sharedDirector()->getVisibleSize();
	//獲取可視區域的原點位置
		CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
	//螢幕正中心位置
		CCPoint midPos = ccp(mysize.width/2, mysize.height/2);

	//建立CCLabelTTF的三種方法
		CCLabelTTF* lb1 = CCLabelTTF::create("aaaaaaaa", "arial", 20);
		CCLabelTTF* lb2 = CCLabelTTF::create("bbbbbbbb", "宋體", 40, CCSizeMake(50,100), CCTextAlignment::kCCTextAlignmentCenter);
		CCLabelTTF* lb3 = CCLabelTTF::create("cccccc", "黑體", 40, CCSizeMake(480,320), CCTextAlignment::kCCTextAlignmentRight, CCVerticalTextAlignment::kCCVerticalTextAlignmentBottom);

	//設定位置,螢幕中心
		lb1->setPosition( midPos );
		lb2->setPosition( midPos );
		lb3->setPosition( midPos );

	//新增到HelloWorld層中
		this->addChild(lb1);
		this->addChild(lb2);
		this->addChild(lb3);

	//其他操作
		lb1->setColor( ccc3(255, 0, 0) ); //設定顏色ccc3
		lb1->setRotation(60.0f);          //旋轉
		lb2->setColor( cocos2d::ccBLUE ); //設定顏色ccBLUE
		lb3->setString("hello world!");   //設定文字內容
	}
//

3、執行結果

wKiom1PuEtuTg0nvAAB4e7qGENI605.jpg

4、分析與總結

    (1)lb2由於設定了其尺寸大小為CCSizeMake(50,100),所以只顯示了一部分的內容。

    (2)lb3的對齊方式為右下角顯示。

    (3)CCLabelTTF的錨點為(0.5,0.5)。

【CCLabelAtlas】

    CCLabelAtlas一般常用來顯示數字資訊,如分數、排名等。因為只是數字所以也犯不上使用CCLabelBMFont載入那麼大的文字影象,所以使用這個比較合適。而資源一般來自一張.png圖片,或.plist檔案。不過它也可以用來顯示其他字元,如英文字元。

    當然CCLabelAtlas繼承於CCNode類,故可以使用父類的一些函式,如:放縮、旋轉等操作。

    並且圖片中每個字元的大小必須是固定的,若要改變字型大小,只能通過放縮來實現。

    例如如下圖數字圖片資源:

wKioL1PuGGagDhoTAAAnr1bvdEA492.jpg

1、常用操作

//
class CC_DLL CCLabelAtlas : public CCAtlasNode, public CCLabelProtocol
{
/**
 *		建立CCLabelAtlas字型方法
 */
	//create(要顯示的數字串,數字資源圖片png,每個數字的寬,每個數字的高,圖片第一個是什麼數字)
	//從圖片中從左到右,一塊一塊擷取。從數字startCharMap開始一一對應。
	//第一塊小圖片對應數字startCharMap;第二塊小圖片對應數字startCharMap+1;第三塊對應startCharMap+2 …… 以此類推。
	//注意:startCharMap為ASCII碼,即數字'0'為48。
	static CCLabelAtlas * create(const char *string, const char *charMapFile, unsigned int itemWidth, unsigned int itemHeight, unsigned int startCharMap);


/**
 *		設定字串內容
 *		注意:內容的文字必須是資源圖片中存在的才可以!!!
 */
	void setString(const char *label);
	const char* getString(void);
};
//

2、程式碼舉例

//
	//建立CCLabelTTF的方法
	CCLabelAtlas* lb4 = CCLabelAtlas::create("20140815", "fonts/digit.png", 20, 20, '0');
	
	//設定位置
	lb4->setPosition(midPos);
	
	//新增到HelloWorld層中
	this->addChild(lb4);
//

3、執行結果

wKioL1PuG9CRoWnRAABuCw6__7E902.jpg

4、分析與總結

    (1)CCLabelAtlas使用的圖片資源的每塊字元的大小必須是固定的,不然會出錯。

    (2)CCLabelAtlas常常用來顯示數字資訊,如分數、排名等。但也可以用來顯示英文字母。

    (3)要改變字型大小,只能通過setScale進行放縮。

    (4)錨點為(0,0)。

【CCLabelBMFont】

    CCLabelBMFont文字是最快速最自由的字型類。

    CCLabelBMFont的父類是CCSpriteBatchNode,特色就是以佔用更多記憶體為代價加快標籤的更新,這與其他任何CCSprite類相似。CCLabelBMFont相當於每次改變只改變了圖片座標,而CCLabelTTF要重新渲染。

    這個類使用之前,需要新增好字型檔案,包括一個圖片檔案(*.png)和一個字型座標檔案(*.fnt),這兩個檔名稱必須一樣。可以下載一個fnt編輯工具來自定義字型。

    值得注意的是:它的每個字母或符號都是單獨的一個CCSprite精靈,可以使用getChildByTag(i)來獲取第i個位置上的字元,來對每個字元單獨設定屬性、動作等。

    這個類沒辦法指定字型的字號,但可以用Scale屬性進行縮放來調整大小。

1、常用操作

//
class CC_DLL CCLabelBMFont : public CCSpriteBatchNode, public CCLabelProtocol, public CCRGBAProtocol
{
/**
 *		建立CCLabelBMFont方法
 */
	//create(要顯示的字串,字型資源名稱.fnt)
	static CCLabelBMFont * create(const char *str, const char *fntFile);


/**
 *		屬性設定
 *		setFntFile , setString ,
 *		setAnchorPoint , setAlignment , setWidth ,
 *		setScale , setColor , setOpacity
 */
	//設定字型資源名稱.fnt
	void setFntFile(const char* fntFile);
	const char* getFntFile();

	//設定內容
	virtual void setString(const char *newString);
	virtual const char* getString(void);

	//設定錨點
	virtual void setAnchorPoint(const CCPoint& var);

	//水平對齊方式CCTextAlignment::
		//kCCTextAlignmentLeft		左對齊
		//kCCTextAlignmentCenter	居中
		//kCCTextAlignmentRight		右對齊
	virtual void setAlignment(CCTextAlignment alignment);

	//設定寬度? 可是我用了好像都不知道是什麼效果...
	virtual void setWidth(float width);

	//放縮
	virtual void setScale(float scale);
	virtual void setScaleX(float scaleX);
	virtual void setScaleY(float scaleY);

	//設定顏色
	virtual void setColor(const ccColor3B& color);
	virtual const ccColor3B& getColor(void);

	//透明度0~255,其中255為不透明
	virtual void setOpacity(GLubyte opacity);
};
//

2、程式碼舉例

//
	//建立兩個CCLabelBMFont字型
		CCLabelBMFont* lb5 = CCLabelBMFont::create("hello", "fonts/bitmapFontTest.fnt");
		CCLabelBMFont* lb6 = CCLabelBMFont::create("world", "fonts/bitmapFontTest.fnt");

	//設定位置
		lb5->setPosition( midPos );
		lb6->setPosition( midPos - ccp(0,100) );

	//新增到Layer層中
		this->addChild(lb5);
		this->addChild(lb6);

	//屬性設定
		lb5->setColor(ccRED);  //設定字型顏色為紅色
		lb6->setString("abc"); //設定內容

	//獲取某個位置的字母,像精靈一樣使用
		CCSprite* lb5_c1 = (CCSprite*)lb5->getChildByTag(0); //獲取第0個字母h
		CCSprite* lb5_c2 = (CCSprite*)lb5->getChildByTag(3); //獲取第3個字母l
		lb5_c1->setColor(ccc3(0,255,0));                     //設定為綠色
		lb5_c2->setScale(2.0f);                              //放大
//

3、執行結果

wKiom1Pu8EPiacByAACCHD-grGA852.jpg

4、分析與總結

    (1)CCLabelBMFont的每個字元都是一個單獨的CCSprite精靈,可以對每個字元單獨進行設定。

    (2)CCLabelBMFont的使用功能是CCLabel中最豐富最靈活的一個。

    (3)錨點為(0.5,0.5)。

相關推薦

cocos2dx基礎(2)——字型標籤CCLabel

【嘮叨】     CCLabelTTF、CCLabelAtlas、CCLabelBMFont。     cocos2dx提供了三種文字字型的顯示:CCLabelTTF(一般字型)、CCLabelAtlas(自定義字型)、CCLabelBMFont(自定義字型)。接下來給大

python之路-基礎2

python10、if else 流程判斷舉例說明1:import getpass #引用getpass這個模塊 _username = "kk" _password = "123456" username = input("username:") password = getpass.getpass("p

SpringMVC---基礎(2)

success ota 修飾 poj api 接受 handler servle forward 10. MVC 的 Handler 方法可以接受哪些 ServletAPI 類型的參數     原生的jsp中的變量參數,它們可以在函數中使用,就像在servlet中一樣

react 基礎 #2 create-react-app

1. 介紹 在開發react應用時,應該沒有人用傳統的方法引入react的原始檔(js),然後在html編輯吧。 大家都是用webpack + es6來結合react開發前端應用。 這個時候,我們可以手動使用npm來安裝各種外掛,來從頭到尾自己搭建環境。 比如: npm install rea

rust學習筆記基礎2--基礎變數宣告的基本規則(霜之小刀)

rust學習筆記基礎篇2–基礎變數宣告的基本規則(霜之小刀) 歡迎轉載和引用,若有問題請聯絡 若有疑問,請聯絡 Email : [email protected] QQ:2279557541 Rust的對變數的宣告很嚴格,有嚴格的型別和必須在宣

Docker基礎2:映象管理

1、映象簡介 簡單說,Docker映象是一個不包含Linux核心而又精簡的Linux作業系統。        映象不是一個單一的檔案,而是有多層構成。我們可以通過docker history <ID/NAME> 檢視映象中各層內容及大小,每

cocos2dx基礎(25) 簡單碰撞檢測

【3.x】     將數學類 CCPoint、CCRect 改為v3.x版本的 Vec2、Rect 就好了。 【簡單碰撞檢測】     在一些遊戲中經常會遇到碰撞檢測的情況,如憤怒的小鳥飛出去後,是否與石頭髮生碰撞。     雖然說有一個Box2D物理碰撞引擎,但

cocos2dx基礎(26) 單例模式

    單例模式,說的通俗一點就是:建立某個類的全域性唯一靜態例項物件。也就是說從它建立開始,一直到整個遊戲程式結束才會釋放資源,期間一直儲存的著資料。     單例類在大部分遊戲中應該是必不可少的部分,如整個遊戲音樂的開關控制、資料的載入與儲存等都需要一個全域性訪問點來控

機器學習之路的Python基礎2

@theme print格式化輸出 @author lz @time 2018/11/25 apple_price=float(input(“請輸入價格”))#因為input中輸入的是系統預設為字串 apple_number=float(input(“蘋果的數量”)

資料結構基礎-------2. 單鏈表的建立及運算

/* * 單鏈表的建立及其運算 * 2018.10.23 * @L.F * * */ #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int Dat

SpringDataJpa基礎2:Repository介面及子介面

1、Repository介面概述      Repository介面是Spring Data的一個核心介面,它不提供任何方法,開發者需要在自己定義的介面中宣告需要的方法。     Spring Data可以讓我們只定義介面,只要遵循 Spri

ELK基礎2:nginx限制kibana訪問

這裡主要說明我們如何使用nginx顯示kibana訪問,上一篇的內容中我們已經講述了kibana的安裝知識。 1、nginx安裝 【解壓縮】 [[email protected]_woyun soft]# tar -zxvf nginx-1.14.2.tar.gz -C /

Linux學習之基礎-2

1、Linux上檔案管理類命令及其常用方法和相關例項 ls命令:- list directory contents ls命令用於顯示目錄內容,類似DOS下的dir命令,它的使用許可權是所有使用者。 1、格式:ls [OPTION]… [FILE]… 2、常用option和示例

cocos2dx基礎(7) 觸碰事件

    cocos2dx遊戲引擎的重點是在於移動裝置的跨平臺開發,而移動裝置上的遊戲大部分都是通過螢幕觸碰來進行的。比如主選單的按鈕觸碰,打飛機中飛機的觸碰移動,都需要用到觸碰操作。想一想之前講的選單按鈕CCMenu,選單項的點選響應事件,其實就是觸碰。     cocos

【圖形學與遊戲程式設計】開發筆記-基礎2:DX11初始化

(本系列文章由pancy12138編寫,轉載請註明出處:http://blog.csdn.net/pancy12138) 這篇文章應該屬於開始程式設計的第一節了,這一節我們將要講解如何使用C++初始化directx,以及一些新的除錯技巧。因為windows程式框架相關的內

持續整合之jenkins實踐教程:基礎(2): 整合gitlab

作為持續整合的利器Jenkins已經得到了廣泛地應用,僅僅作為一個工具,Jenkins已然有了自己的生態圈,支援其的plugin更是超過1300+。在實際中如何使用以及如何更好地使用jenkins,一直是大家在實踐並討論的。本系列文章將會從如何使用jenki

cocos2dx基礎(24)——基本動畫CCAnimation/CCAnimate

【嘮叨】     基本動畫製作需要用到CCAnimation類,用於儲存動畫相關的資訊。以及由CCActionInterval繼承的CCAnimate動畫動作。     還有一些在建立動畫動作的過程中,可能會用到的一些類CCSpriteFrame、CCSpriteFrameCache、

你真的瞭解面試問題的意義嗎?-java面試基礎(2)

一:請說出String StringBuffer StringBuilder區別 這個是一個很基礎的問題,簡單就幾句話,但是面試官是真的想聽你背這幾句話嗎? 我們是不是應該從原理上去分析呢?我們這裡通

cocos2dx[3.2]——新字型標籤Label

【嘮叨】     在3.x中,廢棄了2.x裡的LabelTTF、LabelAtlas、LabelBMFont三個字型類,取而代之的是全新的字型標籤Label。     實際上Label是將三個字型類進行了融合,進行統一的管理與渲染,這使得建立字型標籤Lab

Python開發【第五】:Python基礎2

對齊方式 dex 字符串 後退 ring lag nic 有效 func 字符串格式化 Python的字符串格式化有兩種方式: 百分號方式、format方式 百分號的方式相對來說比較老,而format方式則是比較先進的方式,企圖替換古老的方式,目前兩者並存。[PEP-310