我们所用的版本是2.x,
首先写一个类继承CCLabelTTF
#pragma once
#include “cocos2d.h”
namespace Game
{
using namespace cocos2d;
class LabelTTFStroke:public cocos2d::CCLabelTTF
{
public:
LabelTTFStroke(void);
~LabelTTFStroke(void);
static LabelTTFStroke * create(const char *string, const char *fontName, float fontSize, float strokeSize=0, const cocos2d::ccColor3B & strokeColor=ccc3(0,0,0), cocos2d::CCTextAlignment hAlignment=kCCTextAlignmentCenter, cocos2d::CCVerticalTextAlignment vAlignment=kCCVerticalTextAlignmentTop);
void visit();
private:
cocos2d::ccColor3B m_strokeColor;
float m_strokeSize;
};
}
#include “LabelTTFStroke.h”
namespace Game
{
using namespace cocos2d;
LabelTTFStroke:abelTTFStroke(void):
m_strokeColor(ccc3(0,0,0)),
m_strokeSize(0.0f)
{
}
LabelTTFStroke::~LabelTTFStroke(void)
{
}
void LabelTTFStroke::visit()
{
if(!isVisible())
return;
if(m_strokeSize>0)
{
ccColor3B col = getColor();
CCPoint pos = getPosition();
setColor(m_strokeColor);
setPosition(ccp(pos.x + 1 * m_strokeSize, pos.y + 1 * m_strokeSize));
CCLabelTTF::visit();
setPosition(ccp(pos.x – 1 * m_strokeSize, pos.y -1 *m_strokeSize));
CCLabelTTF::visit();
setPosition(ccp(pos.x + 1 * m_strokeSize, pos.y – 1 * m_strokeSize));
CCLabelTTF::visit();
setPosition(ccp(pos.x – 1 * m_strokeSize, pos.y + 1 * m_strokeSize));
CCLabelTTF::visit();
setColor(col);
setPosition(ccp(pos.x, pos.y));
}
CCLabelTTF::visit();
}
LabelTTFStroke * LabelTTFStroke::create(const char *string, const char *fontName, float fontSize, float strokeSize, const cocos2d::ccColor3B & strokeColor, CCTextAlignment hAlignment, CCVerticalTextAlignment vAlignment)
{
LabelTTFStroke *pRet = new LabelTTFStroke();
if(pRet && pRet->initWithString(string, fontName, fontSize, CCSizeZero, hAlignment, vAlignment))
{
pRet->m_strokeColor = strokeColor;
pRet->m_strokeSize = strokeSize;
pRet->autorelease();
return pRet;
}
CC_SAFE_DELETE(pRet);
return NULL;
}
}
重写visit()函数,不同的方向,根据描边的宽度,重新画4遍,这样一个描边就相当于画了5遍,描边4遍,自己一遍
visit 也可以这样写
void LabelTTFStroke::visit()
{
if(!isVisible())
return;
if(m_strokeSize>0)
{
ccColor3B col = getColor();
CCPoint pos = getPosition();
setColor(m_strokeColor);
setPosition(ccp(pos.x + 1 * m_strokeSize, pos.y));
CCLabelTTF::visit();
setPosition(ccp(pos.x – 1 * m_strokeSize, pos.y));
CCLabelTTF::visit();
setPosition(ccp(pos.x, pos.y – 1 * m_strokeSize));
CCLabelTTF::visit();
setPosition(ccp(pos.x, pos.y + 1 * m_strokeSize));
CCLabelTTF::visit();
setColor(col);
setPosition(ccp(pos.x, pos.y));
}
CCLabelTTF::visit();
}
使用方法:
Game:abelTTFStroke* pLabel1 = Game:abelTTFStroke::create(“Hello World”, “Arial”, 30, 2.0, ccc3(255,0,0));
// position the label on the center of the screen
pLabel1->setPosition(ccp(origin.x + visibleSize.width/2,
origin.y + visibleSize.height – pLabel->getContentSize().height-50));
// add the label as a child to this layer
this->addChild(pLabel1, 1);
缺点:描边尺寸不能设置太大,否则会有问题。