cocos2dx的UI

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
具体使用下次再做陈述

你可能感兴趣的:(cocos2d-x)