[置顶] cocos2d实现CCLabelTTF真正字体描边效果

在开发游戏中,我们需要在需要在游戏中显示一个字体轮廓比较清晰的效果,我们就需要给字体的周围进行描边,让字体显示比较更加突出,我重写了cclabelttf类,使它具有描边的特效,和描边的大小以及颜色。。。

开发人员:Jason's.Alex   QQ:531401335

csdn博客:http://blog.csdn.net/RuShrooM

 


 

 

 

 
  
 
  
#include "cocos2d.h"

using namespace cocos2d;



class StrokeLabelTTF : public cocos2d::CCNode

{

public:

	StrokeLabelTTF();

	~StrokeLabelTTF();



public:

	static StrokeLabelTTF* create(const char *string, const char *fontName, float fontSize, float strokeSize,const cocos2d::ccColor3B&      colStroke = cocos2d::ccc3(0, 0, 0), cocos2d::CCTextAlignment hAlignment=cocos2d::kCCTextAlignmentCenter, cocos2d::CCVerticalTextAlignment vAlignment=cocos2d::kCCVerticalTextAlignmentTop);

	bool initWithString(const char *label, const char *fontName, float fontSize, float fStrokeSize, const cocos2d::ccColor3B&      colStroke, cocos2d::CCTextAlignment hAlignment, cocos2d::CCVerticalTextAlignment vAlignment);

    

    static StrokeLabelTTF * create(const char *string, const char *fontName, float fontSize);



public:

	void setColor(const cocos2d::ccColor3B& color3);

	void setString(const char *label);

	void setStrokeColor(cocos2d::ccColor3B col){ m_colStroke = col; updateStroke(); }

	void setStrokeSize(float StrokeSize){ m_fStrokeSize = StrokeSize; updateStroke();}

    void setAnchorPoint(const cocos2d::CCPoint &anchorPoint);





protected:

	void updateStroke();



private:

	float                   m_fStrokeSize;

	cocos2d::ccColor3B      m_colStroke;

	cocos2d::CCSprite*      m_sprite;

	cocos2d::CCLabelTTF*    m_label;

    CCPoint anchorPoint;

};

 

#include "StrokeLabelTTF.h"

USING_NS_CC;

StrokeLabelTTF::StrokeLabelTTF()

	:m_colStroke(ccc3(0,0,0))

	,m_fStrokeSize(1.0f)

	,m_sprite(NULL)

	,m_label(NULL)

    ,anchorPoint(0.5,0.5)

{}

StrokeLabelTTF::~StrokeLabelTTF()

{

	CC_SAFE_RELEASE_NULL(m_label);

}

bool StrokeLabelTTF::initWithString(const char *string, const char *fontName, float fontSize, float strokeSize,const cocos2d::ccColor3B& colStroke, CCTextAlignment hAlignment,CCVerticalTextAlignment vAlignment)

{

	m_fStrokeSize = strokeSize;

	m_colStroke = colStroke;

	m_label = CCLabelTTF::create(string, fontName, fontSize, CCSizeZero,hAlignment,vAlignment);

	m_label->retain();



	updateStroke();



	return true;

}

StrokeLabelTTF* StrokeLabelTTF::create(const char *string, const char *fontName, float fontSize, float fStrokeSize,const cocos2d::ccColor3B& colStroke ,CCTextAlignment hAlignment,CCVerticalTextAlignment vAlignment)

{

	StrokeLabelTTF *pRet = new StrokeLabelTTF();

	if(pRet && pRet->initWithString(string, fontName, fontSize, fStrokeSize, colStroke, hAlignment, vAlignment))

	{

		pRet->autorelease();

		return pRet;

	}

	CC_SAFE_DELETE(pRet);

	return NULL;

}



StrokeLabelTTF * StrokeLabelTTF::create(const char *string, const char *fontName, float fontSize)

{

    StrokeLabelTTF *pRet = new StrokeLabelTTF();

    

    if(pRet && pRet->initWithString(string,fontName,fontSize,1.5,ccc3(0,0,0),kCCTextAlignmentCenter,kCCVerticalTextAlignmentTop))

    {

        pRet->autorelease();

        return pRet;

    }

    

    CC_SAFE_DELETE(pRet);

    return NULL;

    

}



void StrokeLabelTTF::updateStroke()

{

	if (m_sprite)

	{

		removeChild(m_sprite, true);

	}



	CCSize textureSize = m_label->getContentSize();

	textureSize.width += 2 * m_fStrokeSize;

	textureSize.height += 2 * m_fStrokeSize;

	//call to clear error

	glGetError();

	CCRenderTexture *rt = CCRenderTexture::create(textureSize.width, textureSize.height);

	if(!rt)

	{

		CCLOG("create render texture failed !!!!");

		addChild(m_label);

		return;

	}



	ccColor3B col = m_label->getColor();

	m_label->setColor(m_colStroke);



	ccBlendFunc originalBlend = m_label->getBlendFunc();

	ccBlendFunc func = { GL_SRC_ALPHA, GL_ONE};

	m_label->setBlendFunc(func);



	m_label->setAnchorPoint(ccp(0.5f,0.5f));



	rt->begin();

	for(int i = 0; i < 360; i += 15)

	{

		float r = CC_DEGREES_TO_RADIANS(i);

		m_label->setPosition(ccp(

			textureSize.width * 0.5f + sin(r) * m_fStrokeSize,

			textureSize.height * 0.5f + cos(r) * m_fStrokeSize));

		m_label->visit();

	}



	m_label->setColor(col);

	m_label->setBlendFunc(originalBlend);

	m_label->setPosition(ccp(textureSize.width * 0.5f, textureSize.height * 0.5f));

	m_label->visit();

	rt->end();



	CCTexture2D *texture = rt->getSprite()->getTexture();

	texture->setAliasTexParameters();

	m_sprite = CCSprite::createWithTexture(rt->getSprite()->getTexture());

	setContentSize(m_sprite->getContentSize());

	m_sprite->setAnchorPoint(this->anchorPoint);//------------

	m_sprite->setPosition(ccp(0, 0));

	((CCSprite *)m_sprite)->setFlipY(true);

	addChild(m_sprite);

}

void StrokeLabelTTF::setString(const char *label)

{

	if (m_label)

	{

		if(0!=strcmp(label, m_label->getString()))

		{

			m_label->setString(label);

			updateStroke();

		}

	}

	else

	{

		CCLOG("ERROR:CCLabelTTFStroke::setString m_label=NULL");

	}

}

void StrokeLabelTTF::setColor(const ccColor3B& color3)

{

	if (m_label)

	{

		ccColor3B col = m_label->getColor();

		if(color3.r!=col.r || color3.g!=col.g || color3.b!=col.b)

		{

			m_label->setColor(color3);

			updateStroke();

		}

	}

	else

	{

		CCLOG("ERROR:CCLabelTTFStroke::setColor m_label=NULL");

	}

}



void StrokeLabelTTF::setAnchorPoint(const cocos2d::CCPoint &anchorPoint1)

{



    this->anchorPoint=anchorPoint1;

    updateStroke();

}


 


 

你可能感兴趣的:(cocos2d)