• [置顶] 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();
    }



  • 相关阅读:
    EasyPlayer iOS开源流媒体播放器中AAC解码PCM问题
    EasyPlayer iOS开源流媒体播放器中AAC解码PCM问题
    AAC包增加ADTS头Without MediaCodec
    AAC包增加ADTS头Without MediaCodec
    嵌入式流媒体音视频服务器EasyIPCamera中live555发送性能优化点
    嵌入式流媒体音视频服务器EasyIPCamera中live555发送性能优化点
    EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案
    EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案
    Visual Studio解决方案vs2005/vs2008/vs2010/vs2012/vs2013/vs2015版本互相转换工具
    Visual Studio解决方案vs2005/vs2008/vs2010/vs2012/vs2013/vs2015版本互相转换工具
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3268505.html
Copyright © 2020-2023  润新知