cocos2d-x生成带边框的标签CCLabelTTF文本

cocos2d-x生成带边框的标签CCLabelTTF文本

    上面有篇文章是介绍利用TTF字体库生成各种格式的CCLabelTTF标签的,现在问题又来了,策划要求做一个有黑边的文字,这样会使得界面显示的文本更加清楚,这里我们就共同介绍一下黑边文字的方式。

    实现黑边文字的方法有两种:

一种是两个CCLabelTTF,前面放一个,后面放一个,后面的那个CCLabelTTF放大一点,这样就会在上方的文字周边包围一圈边框,但是经过实验,这样显示的效果不是很好。

二是五个CCLabelTTF,中间放一个,然后在上下左右各方一个便宜1像素或者2像素的CCLabelTTF,经过实验,这样的效果是很好的。

    这里我们让这个类继承自CCLayerColor,然后把CCLabelTTF的常用方法写进去,这样就可以做出一个自制的CCLabelTTF了,我们实现了以下方法

    //设置位置
    virtual void setPosition(const CCPoint& pos);
    
    //设置文字
    virtual void setString(const char *label);
    
    //设置外边颜色
    void setOutSideColor(const ccColor3B &outSideColor);
    
    //设置中心颜色
    void setInsideColor(const ccColor3B &insideColor);
    
    //设置锚点
    virtual void setAnchorPoint(const CCPoint& anchor);

    //设置对其方式
    void setHorizontalAlignment(CCTextAlignment alignment);
    
    //设置文本域
    void setDimensions(const CCSize &dim);

    //设置偏移值
    void setOffset(float offset);

    //获得contentSize
    virtual const CCSize &getContentSize();
    
    //获取位置
    virtual const CCPoint& getPosition();
    
    //设置颜色
    virtual void setColor(const ccColor3B& color);

这些基本都是CCLabelTTF 的基本方法,他们的意义我就不再多说了,这里只是提一个方法,就是void setOffset(float offset);这是设置周围四个CCLabelTTF偏移量的,

通过调节偏移量,可以显示不同黑边的文字。默认是1像素。


下面我就把代码粘贴出来

//
//  SGCCLabelTTF.h
//  Test
//
//  Created by 江南岸 on 13-4-9.
//
//

/*
 *  边框文字,会显示出不同颜色的边框
 */


#ifndef __Test__SGCCLabelTTF__
#define __Test__SGCCLabelTTF__

#include <iostream>
#include "cocos2d.h"
USING_NS_CC;
class SGCCLabelTTF : public CCLayerColor
{
private:
    //四个方向的标签
    CCLabelTTF *m_upLabel;      //上
    CCLabelTTF *m_downLabel;    //下
    CCLabelTTF *m_leftLabel;    //左
    CCLabelTTF *m_rightLabel;   //右
    CCLabelTTF *m_mainLabel;    //中间
    
    float _offset;
    
    //内颜色
    ccColor3B m_colorInside;
    
    //外颜色
    ccColor3B m_colorOutSide;
    
    void viewDidLoad(const char *str, const char *fileFont, int fontSize);
    
public:
    SGCCLabelTTF();
    
    ~SGCCLabelTTF();
    
    static SGCCLabelTTF *create(const char *str,const char*fileFont,int fontSize);

    //设置位置
    virtual void setPosition(const CCPoint& pos);
    
    //设置文字
    virtual void setString(const char *label);
    
    //设置外边颜色
    void setOutSideColor(const ccColor3B &outSideColor);
    
    //设置中心颜色
    void setInsideColor(const ccColor3B &insideColor);
    
    //设置锚点
    virtual void setAnchorPoint(const CCPoint& anchor);

    //设置对其方式
    void setHorizontalAlignment(CCTextAlignment alignment);
    
    //设置文本域
    void setDimensions(const CCSize &dim);

    //设置偏移值
    void setOffset(float offset);
    
    //获得contentSize
    virtual const CCSize &getContentSize();
    
    //获取位置
    virtual const CCPoint& getPosition();
    
    //设置颜色
    virtual void setColor(const ccColor3B& color);


};



#endif /* defined(__Test__SGCCLabelTTF__) */


//
//  SGCCLabelTTF.cpp
//  Test
//
//  Created by 江南岸 on 13-4-9.
//
//

#include "SGCCLabelTTF.h"
SGCCLabelTTF::SGCCLabelTTF()
{
    m_downLabel = NULL;
    m_upLabel = NULL;
    m_leftLabel = NULL;
    m_rightLabel = NULL;
    m_mainLabel = NULL;
    _offset = 2;
    
    m_colorInside = ccWHITE;
    m_colorOutSide = ccBLACK;
}

SGCCLabelTTF::~SGCCLabelTTF()
{
    
}

SGCCLabelTTF* SGCCLabelTTF::create(const char *str, const char *fileFont, int fontSize)
{
    SGCCLabelTTF *label = new SGCCLabelTTF();
    if(label)
    {
        label->viewDidLoad(str, fileFont, fontSize);
        label->autorelease();
        return label;
    }
    
    CC_SAFE_DELETE(label);
    return label;
}

void SGCCLabelTTF::viewDidLoad(const char *str, const char *fileFont, int fontSize)
{
    
    m_leftLabel = CCLabelTTF::create(str, fileFont, fontSize);
    m_downLabel = CCLabelTTF::create(str, fileFont, fontSize);
    m_upLabel = CCLabelTTF::create(str, fileFont, fontSize);
    m_rightLabel = CCLabelTTF::create(str, fileFont, fontSize);
    m_mainLabel = CCLabelTTF::create(str, fileFont, fontSize);


    setInsideColor(m_colorInside);
    setOutSideColor(m_colorOutSide);
    
    addChild(m_leftLabel,-1);
    addChild(m_rightLabel,-1);
    addChild(m_upLabel,-1);
    addChild(m_downLabel,-1);
    addChild(m_mainLabel);
    
    CCLayerColor::initWithColor(ccc4(255, 255, 255, 0), m_mainLabel->getContentSize().width, m_mainLabel->getContentSize().height);
    
}

void SGCCLabelTTF::setPosition(const CCPoint &position)
{
    m_mainLabel->setPosition(position);
    m_leftLabel->setPosition(ccpAdd(m_mainLabel->getPosition(), ccp(-_offset, 0)));
    m_downLabel->setPosition(ccpAdd(m_mainLabel->getPosition(), ccp(0, -_offset)));
    m_upLabel->setPosition(ccpAdd(m_mainLabel->getPosition(), ccp(0, _offset)));
    m_rightLabel->setPosition(ccpAdd(m_mainLabel->getPosition(), ccp(_offset, 0)));
}

void SGCCLabelTTF::setString(const char *label)
{
    m_mainLabel->setString(label);
    m_upLabel->setString(label);
    m_downLabel->setString(label);
    m_leftLabel->setString(label);
    m_rightLabel->setString(label);    
}

void SGCCLabelTTF::setOutSideColor(const ccColor3B &outSideColor)
{
    m_colorOutSide = outSideColor;

    m_upLabel->setColor(outSideColor);
    m_downLabel->setColor(outSideColor);
    m_rightLabel->setColor(outSideColor);
    m_leftLabel->setColor(outSideColor);
    
}

void SGCCLabelTTF::setInsideColor(const ccColor3B &insideColor)
{
    m_mainLabel->setColor(insideColor);
    m_colorInside = insideColor;
}

void SGCCLabelTTF::setAnchorPoint(const CCPoint& anchor)
{
    m_mainLabel->setAnchorPoint(anchor);
    m_upLabel->setAnchorPoint(anchor);
    m_downLabel->setAnchorPoint(anchor);
    m_rightLabel->setAnchorPoint(anchor);
    m_leftLabel->setAnchorPoint(anchor);
}

void SGCCLabelTTF::setHorizontalAlignment(CCTextAlignment alignment)
{
    m_mainLabel->setHorizontalAlignment(alignment);
    m_upLabel->setHorizontalAlignment(alignment);
    m_downLabel->setHorizontalAlignment(alignment);
    m_leftLabel->setHorizontalAlignment(alignment);
    m_rightLabel->setHorizontalAlignment(alignment);

}

//设置文本域
void SGCCLabelTTF::setDimensions(const CCSize &dim)
{
    m_mainLabel->setDimensions(dim);
    m_upLabel->setDimensions(dim);
    m_downLabel->setDimensions(dim);
    m_leftLabel->setDimensions(dim);
    m_rightLabel->setDimensions(dim);
    
}

void SGCCLabelTTF::setOffset(float offset)
{
    _offset = offset;
    
    setPosition(m_mainLabel->getPosition());
}

const CCSize &SGCCLabelTTF::getContentSize()
{
    return m_mainLabel->getContentSize();
}

const CCPoint& SGCCLabelTTF::getPosition()
{
    return m_mainLabel->getPosition();
}

void SGCCLabelTTF::setColor(const ccColor3B& color)
{
    m_colorInside = color;
    m_mainLabel->setColor(color);
}




我们现在来试试这个标签的效果

     SGCCLabelTTF *label = SGCCLabelTTF::create("测试SGCCLabelTTF的黑边效果", "Arial", 50);
    //设置边框的颜色为红色
    label->setOutSideColor(ccRED);
    //设置内部颜色为黄色
    label->setColor(ccYELLOW);
    //把偏移值设置2像素
    label->setOffset(2);
    //设置位置
    label->setPosition(ccp(600, 300));
    addChild(label);

效果如下图

cocos2d-x生成带边框的标签CCLabelTTF文本_第1张图片


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