COCOS的UI感觉很少,相对于安卓来说,也许游戏不需要那么多的需求吧。
CCLabel是CClabelxxx的总称,在cocos中并不存在这么一个类供子类继承。
CCLabelProtocol接口即CCLabel源代码
class CC_DLL CCLabelProtocol
{
public:
virtual void setString(const char *label) = 0;
virtual const char* getString(void) = 0;
};
接口中只有set与get两个虚函数,继承CCLabelProtocol接口有CCLabelTTF与CCLabelAtlas和CCLabelBMFont。
CCLabelTTF
CCLabelTTF是CCLabelProtocol的子类和CCSprite的子类,CCLabelTTF是用来渲染文本标签的,可以指定字体,每次设置字符串内容时,都需要重新创建纹理和渲染,性能不好,所以通常情况下使用CCLabelAtlas或者CCLabelBMFont代替。
class CC_DLL CCLabelTTF : public CCSprite, public CCLabelProtocol
{
public:
CCLabelTTF();
virtual ~CCLabelTTF();
const char* description();
/** * 创建 * * @param string 文字内容 * @param fontName 字体名称 * @param fontSize 字体大小 * @param hAlignment 水平对齐方式 * @param vAlignment 垂直对齐方式 * @param textDefinition 字体描述 * */
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);
static CCLabelTTF * createWithFontDefinition(const char *string, ccFontDefinition &textDefinition);
// 初始化
bool initWithString(const char *string, const char *fontName, float fontSize);
bool initWithString(const char *string, const char *fontName, float fontSize,
const CCSize& dimensions, CCTextAlignment hAlignment);
bool initWithString(const char *string, const char *fontName, float fontSize,
const CCSize& dimensions, CCTextAlignment hAlignment,
CCVerticalTextAlignment vAlignment);
bool initWithStringAndTextDefinition(const char *string, ccFontDefinition &textDefinition);
// 设置、获取TextDefinition
void setTextDefinition(ccFontDefinition *theDefinition);
ccFontDefinition * getTextDefinition();
// 设置文字阴影
void enableShadow(const CCSize &shadowOffset, float shadowOpacity, float shadowBlur, bool mustUpdateTexture = true);
// 取消文字阴影
void disableShadow(bool mustUpdateTexture = true);
// 设置描边
void enableStroke(const ccColor3B &strokeColor, float strokeSize, bool mustUpdateTexture = true);
// 取消描边
void disableStroke(bool mustUpdateTexture = true);
// 设置文字颜色
void setFontFillColor(const ccColor3B &tintColor, bool mustUpdateTexture = true);
// 初始化CCLabelTTF
bool init();
// 创建一个空CCLabelTTF
static CCLabelTTF * create();
// 设置/获取文字
virtual void setString(const char *label);
virtual const char* getString(void);
// 获取/设置水平对齐方式
CCTextAlignment getHorizontalAlignment();
void setHorizontalAlignment(CCTextAlignment alignment);
// 获取/设置垂直对齐方式
CCVerticalTextAlignment getVerticalAlignment();
void setVerticalAlignment(CCVerticalTextAlignment verticalAlignment);
CCSize getDimensions();
void setDimensions(const CCSize &dim);
// 设置、获取字体大小
float getFontSize();
void setFontSize(float fontSize);
// 设置、获取字体名称
const char* getFontName();
void setFontName(const char *fontName);
private:
// 更新纹理
bool updateTexture();
protected:
/** set the text definition for this label */
void _updateWithTextDefinition(ccFontDefinition & textDefinition, bool mustUpdateTexture = true);
ccFontDefinition _prepareTextDefinition(bool adjustForResolution = false);
/** Dimensions of the label in Points */
CCSize m_tDimensions;
// 水平对齐方式
CCTextAlignment m_hAlignment;
// 垂直对齐方式
CCVerticalTextAlignment m_vAlignment;
// 字体名称
std::string * m_pFontName;
// 标签字体大小
float m_fFontSize;
// 标签文字
std::string m_string;
// 文字阴影相关属性
bool m_shadowEnabled;
CCSize m_shadowOffset;
float m_shadowOpacity;
float m_shadowBlur;
// 文字描边相关属性
bool m_strokeEnabled;
ccColor3B m_strokeColor;
float m_strokeSize;
/** font tint */
ccColor3B m_textFillColor;
};
在使用的时候每次内部都需要updateTexture所以说比较消耗性能。
CCLabelAtlas
class CC_DLL CCLabelAtlas : public CCAtlasNode, public CCLabelProtocol
{
public:
CCLabelAtlas():m_sString(){}
virtual ~CCLabelAtlas()
{
m_sString.clear();
}
/** * 创建CCLabelAtlas * * @param string 文字内容 * @param charMapFile 字符集文件 * @param itemWidth 每个字符的宽 * @param itemHeight 每个字符的高度 * @param startCharMap 字符集中的第一个字符 */
static CCLabelAtlas * create(const char *string, const char *charMapFile, unsigned int itemWidth, unsigned int itemHeight, unsigned int startCharMap);
static CCLabelAtlas* create(const char *string, const char *fntFile);
// 初始化
bool initWithString(const char *string, const char *charMapFile, unsigned int itemWidth, unsigned int itemHeight, unsigned int startCharMap);
bool initWithString(const char *string, const char *fntFile);
bool initWithString(const char* string, CCTexture2D* texture, unsigned int itemWidth, unsigned int itemHeight, unsigned int startCharMap);
// super methods
virtual void updateAtlasValues();
virtual void setString(const char *label);
virtual const char* getString(void);
#if CC_LABELATLAS_DEBUG_DRAW
virtual void draw();
#endif
protected:
std::string m_sString; // 文字
unsigned int m_uMapStartChar; // 在字符集中的第一个字符
};
由此可见CCLabelAtlas继承自CCLabelProtocol与CCAtlasNode。CCAtlasNode封装了一个CCTextureAtlas的变量,CCTextureAtlas初始化图片文件的时候会把图片加载到缓存(CCTextureCache)中。CCLabelAtlas的绘制效率高,但是限制性太多,没有CCLabelBMFont灵活。
CCLabelBMFont
CCLabelBMFont不仅是CCLabelProtocol的子类,其实也是CCSpriteBatchNode的子类,创建CCLabelBMFont对象需要一个字符串和一个fnt格式的文件(字库)。 CCLabelBMFont *label= CCLabelBMFont::labelWithString(Bitmap Font Atlas, fonts/bitmapFontTest.fnt);
这个bitmapFontTest.fnt文件包含了这些信息:对应图片的名字(图片包含了所有你要绘制的字符)、图片中的字符对应的unicode编码、字符在图片中的坐标、宽高等。初始化CCLabelBMFont对象时,会把图片添加到缓存(CCTextureCache)中,解析fnt文件,把fnt文件中对应的信息保存到一个ccBMFontDef类型的数组里面,数组的索引是charId(字符的unicode编码值)。绘制字符串时,根据字符对应的unicode码去查找ccBMFontDef信息,从缓存中取出图片,再根据ccBMFontDef中坐标、宽高取出对应区域的字符图片,把字符在字符串中的索引位置作为tag添加到CCLabelBMFont中,因为CCLabelBMFont本身是CCSpriteBatchNode,这样就实现了批处理渲染精灵,提高了性能。
class CC_DLL CCLabelBMFont : public CCSpriteBatchNode, public CCLabelProtocol, public CCRGBAProtocol
{
public:
CCLabelBMFont();
virtual ~CCLabelBMFont();
// 释放文字占用的内存
static void purgeCachedData();
/** * 创建CCLabelBMFont * * @param str 文字 * @param fntFile 字体文件路径 * @param width 每行字体宽度 * @param alignment 对齐方式 * @param imageOffset 文字间间隔 */
static CCLabelBMFont * create(const char *str, const char *fntFile, float width, CCTextAlignment alignment, CCPoint imageOffset);
static CCLabelBMFont * create(const char *str, const char *fntFile, float width, CCTextAlignment alignment);
static CCLabelBMFont * create(const char *str, const char *fntFile, float width);
static CCLabelBMFont * create(const char *str, const char *fntFile);
static CCLabelBMFont * create();
// 初始化
bool init();
bool initWithString(const char *str, const char *fntFile, float width = kCCLabelAutomaticWidth, CCTextAlignment alignment = kCCTextAlignmentLeft, CCPoint imageOffset = CCPointZero);
/** updates the font chars based on the string to render */
void createFontChars();
// super method
virtual void setString(const char *newString);
virtual void setString(const char *newString, bool needUpdateLabel);
virtual const char* getString(void);
virtual void setCString(const char *label);
// 设置锚点
virtual void setAnchorPoint(const CCPoint& var);
// 更新Label
virtual void updateLabel();
// 设置对齐方式
virtual void setAlignment(CCTextAlignment alignment);
// 设置每行宽度
virtual void setWidth(float width);
virtual void setLineBreakWithoutSpace(bool breakWithoutSpace);
// 设置缩放
virtual void setScale(float scale);
virtual void setScaleX(float scaleX);
virtual void setScaleY(float scaleY);
// CCRGBAProtocol
virtual bool isOpacityModifyRGB();
virtual void setOpacityModifyRGB(bool isOpacityModifyRGB); virtual GLubyte getOpacity();
virtual GLubyte getDisplayedOpacity();
virtual void setOpacity(GLubyte opacity);
virtual void updateDisplayedOpacity(GLubyte parentOpacity);
virtual bool isCascadeOpacityEnabled();
virtual void setCascadeOpacityEnabled(bool cascadeOpacityEnabled);
virtual const ccColor3B& getColor(void);
virtual const ccColor3B& getDisplayedColor();
virtual void setColor(const ccColor3B& color);
virtual void updateDisplayedColor(const ccColor3B& parentColor);
virtual bool isCascadeColorEnabled();
virtual void setCascadeColorEnabled(bool cascadeColorEnabled);
// 设置/获取字体文件
void setFntFile(const char* fntFile);
const char* getFntFile();
// 获取配置文件
CCBMFontConfiguration* getConfiguration() const;
#if CC_LABELBMFONT_DEBUG_DRAW
virtual void draw();
#endif // CC_LABELBMFONT_DEBUG_DRAW
private:
char * atlasNameFromFntFile(const char *fntFile);
int kerningAmountForFirst(unsigned short first, unsigned short second);
float getLetterPosXLeft( CCSprite* characterSprite );
float getLetterPosXRight( CCSprite* characterSprite );
protected:
virtual void setString(unsigned short *newString, bool needUpdateLabel);
// Label文字内容
unsigned short* m_sString;
// 字体文件名称
std::string m_sFntFile;
// initial string without line breaks
unsigned short* m_sInitialString;
std::string m_sInitialStringUTF8;
// 对齐方式
CCTextAlignment m_pAlignment;
// 每行最大宽度
float m_fWidth;
CCBMFontConfiguration *m_pConfiguration;
bool m_bLineBreakWithoutSpaces;
// offset of the texture atlas
CCPoint m_tImageOffset;
// reused char
CCSprite *m_pReusedChar;
// texture RGBA
GLubyte m_cDisplayedOpacity;
GLubyte m_cRealOpacity;
ccColor3B m_tDisplayedColor;
ccColor3B m_tRealColor;
bool m_bCascadeColorEnabled;
bool m_bCascadeOpacityEnabled;
/** conforms to CCRGBAProtocol protocol */
bool m_bIsOpacityModifyRGB;
};
综合起来,CCLabelTTF使用起来最简单,但是每次更改都需要重画纹理,比较消耗性能。CCLabelAtlas需要做一个png的图片或者plist保存需要使用的图片信息。由于无论是png还是plist内部都保存的是图片及其其他信息,所以不需要再绘制图,相对于CCLabelTTF性能不错。CCLabelBMFont 与CCLabelAtlas类似。
CCMenu继承自CClayer,本身是一个容器,需要将CCMenuItem,CCMenuItem的子类一共有CCMenuItemFont CCMenuItemImage CCMenuItemLabel CCMenuItemSprite CCMenuItemToggle
。
具体使用下次再做陈述