游戏UI中为了使字体更加漂亮,通常需要为字体添加一个阴影。其实不用美工,程序就可以添加。先为CCLabelTTF创建一个CCRenderTexture:
CCRenderTexture* CCLabelTTFWithStroke::createStroke(cocos2d::CCLabelTTF *label, float size, ccColor3B cor){//目标label,纹理的大小,和颜色
CCRenderTexture* rt = CCRenderTexture::create(label->getTexture()->getContentSize().width + size*2, label->getTexture()->getContentSize().height + size*2);
CCPoint originalPos = label->getPosition();
ccColor3B originalColor = label->getColor();
bool originalVisibility = label->isVisible();
label->setColor(cor);
label->setVisible(true);
ccBlendFunc originalBlend = label->getBlendFunc();
label->setBlendFunc((ccBlendFunc){ GL_SRC_ALPHA, GL_ONE });
CCPoint bottomLeft = ccp(label->getTexture()->getContentSize().width*label->getAnchorPoint().x + size, label->getTexture()->getContentSize().height*label->getAnchorPoint().y + size);
CCPoint positionOffset = ccp(label->getTexture()->getContentSize().width*label->getAnchorPoint().x - label->getTexture()->getContentSize().width/2, label->getTexture()->getContentSize().height*label->getAnchorPoint().y - label->getTexture()->getContentSize().height/2);
CCPoint position = ccpSub(originalPos, positionOffset);
rt->begin();
for (int i = 0; i<360; i+=30) {
label->setPosition(ccp(bottomLeft.x + sin(CC_DEGREES_TO_RADIANS(i))*size,bottomLeft.y + cos(CC_DEGREES_TO_RADIANS(i))*size));
label->visit();
}
rt->end();
label->setPosition(originalPos);
label->setColor(originalColor);
label->setBlendFunc(originalBlend);
label->setVisible(originalVisibility);
rt->setPosition(position);
return rt;
}
然后,用这个 CCRenderTexture可以创建一个CCSprite:
CCRenderTexture* stroke = createStroke(m_label, m_strokeSize, m_stokeColor);
CCSprite* strokeSprite= CCSprite::createWithTexture(stroke->getSprite()->getTexture());
。
这时候只需要把strokeSprite加在CCLabelTTF的下面就可以了。
但是通常需要改变CCLabelTTF的内容。可以封装一个类,创建label的时候一起创建strokeSprite。改变CCLabelTTF的内容的时候只需要创建新的
CCRenderTexture,然后让strokeSprite重新setTexture就可以了:
CCRenderTexture* stroke = createStroke(m_label, m_strokeSize, m_stokeColor);
m_strokeSprite->setTexture(stroke->getSprite()->getTexture());