我们所用的版本是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);

缺点:描边尺寸不能设置太大,否则会有问题。