2016年3月31日 星期四

20160331_cocos2d-3.2 Label的屬性與方法

http://shahdza.blog.51cto.com/2410787/1560612
【Label的屬性與方法】
    Label繼承於:
    > SpriteBatchNode : 用於加快字體的渲染速度。
    > LabelProtocol   : 用於設置Label的字符串內容。

    主要函數如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
//
class CC_DLL Label : public SpriteBatchNode, public LabelProtocol
{
/**
 * 字體設置
 *     - setSystemFontName : 字體(字體名字、字體文件)
 *     - setSystemFontSize : 字體大小
 *     - setString         : 字符串內容
 *     - setTextColor      : 文字內容顏色
 **/
    //設置System Font類型的字體(字體名字、字體文件)
    //設置System Font類型的字體大小
    //請不要用於其他Label類型!(TTF、CharMap、BMFont)
    virtual void setSystemFontName(const std::string& systemFont);
    virtual void setSystemFontSize(float fontSize);
    virtual const std::string& getSystemFontName() const return _systemFont;}
    virtual float getSystemFontSize() const return _systemFontSize;}
    //改變字符串內容並重新渲染
    //註:如果你沒有為Label設置TTF/BMFont/CharMap,會產生很大的開銷
    virtual void setString(const std::string& text) override;
    virtual const std::string& getString() const override {  return _originalUTF8String; }
    //設置文字顏色,僅支持TTF和System Font
    //註:區別 Node節點的顏色
    //      Node ::setColor     : Color3B
    //      Label::setTextColor : Color4B
    virtual void setTextColor(const Color4B &color);
    const Color4B& getTextColor() const return _textColor; }
/**
 * 獲取Label的某個字符
 *     - getLetter
 *     - 不支持System Font
 **/
    //不支持System Font
    virtual Sprite* getLetter(int lettetIndex);
/**
 * 文字渲染效果
 *     - Shadow  : 陰影
 *     - Outline : 輪廓,僅支持TTF
 *     - Glow    : 發光,僅支持TTF
 **/
    //陰影Shadow(陰影顏色,相對Label的偏移,模糊度)
    //註: 其中blurRadius在3.2中並未實現
    virtual void enableShadow(const Color4B& shadowColor = Color4B::BLACK,const Size &offset = Size(2,-2), int blurRadius = 0);
    //輪廓Outline,僅支持TTF(輪廓顏色,輪廓粗細)
    virtual void enableOutline(const Color4B& outlineColor,int outlineSize = -1);
    //發光Glow,僅支持TTF
    virtual void enableGlow(const Color4B& glowColor);
    //取消陰影/輪廓/發光渲染效果
    virtual void disableEffect();
/**
 * 對齊方式
 *    > TextHAlignment : 水平對齊方式
 *        - TextHAlignment:LEFT    : 左對齊
 *        - TextHAlignment:CENTER  : 居中對齊,默認
 *        - TextHAlignment:RIGHT   : 右對齊
 *    > TextVAlignment : 垂直對齊方式
 *        - TextVAlignment::TOP    : 頂部,默認
 *        - TextVAlignment::CENTER : 中心
 *        - TextVAlignment::BOTTOM : 底部
 **/
    //設置對齊方式
    void setAlignment(TextHAlignment hAlignment) { setAlignment(hAlignment,_vAlignment);}
    void setAlignment(TextHAlignment hAlignment,TextVAlignment vAlignment);
    TextHAlignment getTextAlignment() const return _hAlignment;}
    //設置水平對齊方式
    void setHorizontalAlignment(TextHAlignment hAlignment) { setAlignment(hAlignment,_vAlignment); }
    TextHAlignment getHorizontalAlignment() const return _hAlignment; }
    //設置垂直對齊方式
    void setVerticalAlignment(TextVAlignment vAlignment) { setAlignment(_hAlignment,vAlignment); }
    TextVAlignment getVerticalAlignment() const return _vAlignment; }
/**
 * Label尺寸大小
 *     - setLineBreakWithoutSpace : 開啟自動換行功能
 *     - setMaxLineWidth          : 文字內容的最大行寬
 *     - setWidth                 : Label尺寸大小,寬
 *     - setHeight                : Label尺寸大小,高
 *     - setDimensions            : Label尺寸大小
 **/
    //是否開啟自動換行功能
    void setLineBreakWithoutSpace(bool breakWithoutSpace);
    //最大行寬,內容超過MaxLineWidth,就會自動換行
    //前提條件: 僅在width==0時,起作用。
    //  > width == 0;
    //  > setMaxLineWidth(lineWidth);
    //  > setLineBreakWithoutSpace(true);
    //它的效果與下面是類似的.
    //  > setWidth(lineWidth);
    //  > setLineBreakWithoutSpace(true);
    //只是width==0時,就無法設置文本的對齊方式了.
    void setMaxLineWidth(unsigned int maxLineWidth);
    unsigned int getMaxLineWidth() { return _maxLineWidth;}
    //設置Label的尺寸大小
    //可以理解為Label的文本框大小
    //當setLineBreakWithoutSpace(true)時,內容超過width,會自動換行
    //並且內容支持文本的對齊方式
    //註:設置尺寸大小,使用的是setDimensions,而不是setContentSize !
    void setWidth(unsigned int width) { setDimensions(width,_labelHeight); }
    void setHeight(unsigned int height){ setDimensions(_labelWidth,height); }
    void setDimensions(unsigned int width,unsigned int height);
    unsigned int getWidth() const return _labelWidth; }
    unsigned int getHeight() const return _labelHeight; }  
    const Size& getDimensions() constreturn _labelDimensions; }
/**
 * v3.2 新增
 *     - setLineHeight        : 設置行間距
 *     - setAdditionalKerning : 設置文字間距
 *     - getStringLength      : 字符串內容長度
 */
    //設置行間距,不支持system font
    void setLineHeight(float height);
    float getLineHeight() const;
    //設置文字間距,不支持system font
    void setAdditionalKerning(float space);
    float getAdditionalKerning() const;
    //獲取Label的字符串內容長度
    int getStringLength() const;
/**
 * 重寫Node父類的方法
 *     - setBlendFunc   : 混合模式
 *     - setScale       : 放縮字體大小
 *     - addChild       : 添加子節點
 *     - getDescription : 顯示Label的描述
 **/
    //設置顏色混合模式
    virtual void setBlendFunc(const BlendFunc &blendFunc) override;
    //放縮字體大小(一般用於CharMap、BMFont)
    virtual void setScale(float scale) override;
    virtual void setScaleX(float scaleX) override;
    virtual void setScaleY(float scaleY) override;
    virtual float getScaleX() const override;
    virtual float getScaleY() const override;
    //添加子節點
    virtual void addChild(Node * child, int zOrder=0, int tag=0) override;
    virtual void sortAllChildren() override;
    //Label描述
    virtual std::string getDescription() const override;
};
//


【文字渲染效果】
    支持三種渲染效果:
    > Shadow  : 陰影
    > Outline : 輪廓,僅支持TTF
    > Glow    : 發光,僅支持TTF
    註:其中Outline與Glow兩個效果,只會作用一個。即無法一起使用。
    
    使用舉例:
1
2
3
4
5
6
7
8
9
10
11
12
//
    Label* lb = Label::createWithTTF("123abc""fonts/Marker Felt.ttf", 50);
    lb->setPosition(visibleSize / 2);
    this->addChild(lb);
    lb->enableShadow(Color4B::GREEN, Size(10, 10)); //陰影
    lb->enableOutline(Color4B::RED, 3);             //輪廓
    //lb->enableGlow(Color4B::GREEN);                 //發光
    //取消陰影、輪廓、發光效果
    //lb->disableEffect();
//
    如圖所示:
wKioL1Qvv4HyUNY-AABCHrs_f5E221.jpg

wKiom1Qvv0-juVHmAABDu6Gdx6s457.jpg

wKioL1Qvv4HQG4l9AABKGsut21I226.jpg




【對齊方式】
    > TextHAlignment : 水平對齊方式
        - TextHAlignment:LEFT    : 左對齊
        - TextHAlignment:CENTER  : 居中對齊,默認
        - TextHAlignment:RIGHT   : 右對齊
    > TextVAlignment : 垂直對齊方式
        - TextVAlignment::TOP    : 頂部,默認
        - TextVAlignment::CENTER : 中心
        - TextVAlignment::BOTTOM : 底部
    僅在設置了Label的尺寸大小setDimensions(width,height),大於顯示的字符串內容的尺寸大小,才會起作用。
    對齊方式舉例,如下幾張圖片所示:
    對齊方式為:
        TextHAlignment:LEFT
        TextVAlignment::TOP
wKioL1Qvt1bAd5pCAAC6gJHn1rI260.jpg

wKioL1Qvt1bT5tb1AADDFNsBpXs376.jpg

wKiom1QvtyTCyKw7AADIdMaUl50455.jpg



【自動換行】
    在3.x中,自動換行有兩種方式。(當然你也可以使用C++裡的轉移字符'\n'進行手動換行)
    > 利用lb->setLineBreakWithoutSpace(true),來支持自動換行功能。
    > 1. 利用 setMaxLineWidth(maxLineWidth),來控制自動換行。
    > 2. 利用 setDimensions(width , height),來控制自動換行。

1、利用setMaxLineWidth
    設置每行顯示文字的最大寬度。
    註:這種方法僅在Label width == 0的情況下,才會有效。
    使用方法:
1
2
3
4
//
    lb->setLineBreakWithoutSpace(true);
    lb->setMaxLineWidth(120); //最大寬度120
//
    如圖:
wKioL1QvuCbx2CuJAACnIfYPH8o016.jpg

2、利用setDimensions
    使用方法:
1
2
3
4
5
//
    lb->setLineBreakWithoutSpace(true);
    lb->setWidth(80);         //設置Label尺寸寬80
    lb->setMaxLineWidth(120); //設置了Label width,這個就無效了
//
    如圖:
wKiom1QvuAKSA95FAAConOTfXF0856.jpg




【文字間距】
    間距的調整,是在 v3.2 之後才出現的。可以設置文本內容的行間距與文字間距。
    註:不支持System Font。
    > setLineHeight        : 設置行間距
    > setAdditionalKerning : 設置額外文字間距

    使用舉例:
1
2
3
4
//
    lb->setLineHeight(80);
    lb->setAdditionalKerning(10);
//
    圖解:
wKiom1QvvLuCSN8WAADoNwsARbo883.jpg



【單獨設置某個字符】
    學過2.x中的LabelBMFont的同學,應該知道這個是怎麼回事吧?
    在3.x中,使用TTFCharMapBMFont創建的文字標籤,其字符串內容的每個字符都是一個Sprite精靈圖片,可以對其進行單獨的設置。如精靈放縮、執行動作等。
    註:不支持System Font。
    > lb->getStringLength() : 獲取字符串內容的總長度
    > lb->getLetter(i)      : 獲取第i個位置上的字符

    使用舉例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//
    Label* lb = Label::createWithTTF("123abc""fonts/Marker Felt.ttf", 50);
    lb->setPosition(visibleSize / 2);
    this->addChild(lb);
    //獲取字符串總長度,length = 6
    CCLOG("%d", lb->getStringLength());
    //獲取第1個字符
    Sprite* letter1 = lb->getLetter(1);
    letter1->setColor(Color3B::GREEN); //設置顏色
    letter1->setScale(2.0f);           //放縮
    //獲取第4個字符
    Sprite* letter4 = lb->getLetter(4);
    letter4->setColor(Color3B::RED);  //設置顏色
    letter4->runAction(RepeatForever::create(RotateBy::create(1.0f, 90))); //執行旋轉動作
//
    如圖:
wKiom1Qvw-uiM3moAAPOzv2Anc4744.gif

cocos2dx-lua 建立滑鼠監聽

重要關鍵字  EVENT_MOUSE_SCROLL addEventListenerWithSceneGraphPriority      if IsPc() then --建立滑鼠監聽         local listener = cc.EventListenerMouse...