Hey guys! Several days ago i found a cocs2d-iphone examples "stroke effect for CCLabelTTF objects". Here is the link to the cocos2d-iphone forum: http://www.cocos2d-iphone.org/forum/topic/12126
I made little modifications in this example and rewrote it for c++. Here is my code:
1CCRenderTexture* createStroke(CCSprite* label, int size, ccColor3B color, GLubyte opacity)
2 {
3
4 CCRenderTexture* rt = CCRenderTexture::renderTextureWithWidthAndHeight(
5 label->getTexture()->getContentSize().width + size * 2,
6 label->getTexture()->getContentSize().height+size * 2
7 );
8
9 CCPoint originalPos = label->getPosition();
10
11 ccColor3B originalColor = label->getColor();
12
13 GLubyte originalOpacity = label->getOpacity();
14
15 bool originalVisibility = label->getIsVisible();
16
17 label->setColor(color);
18
19 label->setOpacity(opacity);
20
21 label->setIsVisible(true);
22
23 ccBlendFunc originalBlend = label->getBlendFunc();
24
25 ccBlendFunc bf = {GL_SRC_ALPHA, GL_ONE};
26
27 label->setBlendFunc(bf);
28
29 CCPoint bottomLeft = ccp(
30 label->getTexture()->getContentSize().width * label->getAnchorPoint().x + size,
31 label->getTexture()->getContentSize().height * label->getAnchorPoint().y + size);
32
33 CCPoint positionOffset= ccp(
34 - label->getTexture()->getContentSize().width / 2,
35 - label->getTexture()->getContentSize().height / 2);
36
37 CCPoint position = ccpSub(originalPos, positionOffset);
38
39 rt->begin();
40
41 for (int i=0; i<360; i+= 15) // you should optimize that for your needs
42 {
43 label->setPosition(
44 ccp(bottomLeft.x + sin(CC_DEGREES_TO_RADIANS(i))*size, bottomLeft.y + cos(CC_DEGREES_TO_RADIANS(i))*size)
45 );
46 label->visit();
47 }
48 rt->end();
49
50 label->setPosition(originalPos);
51 label->setColor(originalColor);
52 label->setBlendFunc(originalBlend);
53 label->setIsVisible(originalVisibility);
54 label->setOpacity(originalOpacity);
55
56 rt->setPosition(position);
57
58 return rt;
59}
CCSprite* sprite = CCSprite::spriteWithFile("some_sprite.png");
2
3 addChild(sprite);
4
5 CCRenderTexture* tex = createStroke(sprite, 2 /*size*/, ccc3(0, 255, 0)/*color*/, 50 /*opacity*/);
6
7 addChild(tex, sprite->getZOrder() - 1);
static CCRenderTexture* createStroke(CCSprite* label, int size, ccColor3B color, GLubyte opacity){
CCRenderTexture* rt = CCRenderTexture::create(label->getTexture()->getContentSize().width + size * 2,
label->getTexture()->getContentSize().height+size * 2);
CCPoint originalPos = label->getPosition();
ccColor3B originalColor = label->getColor();
GLubyte originalOpacity = label->getOpacity();
label->setColor(color);
label->setOpacity(opacity);
bool originalVisibility = label->isVisible();
ccBlendFunc originalBlend = label->getBlendFunc();
ccBlendFunc bf = {GL_SRC_ALPHA, GL_ONE};
label->setBlendFunc(bf);
CCPoint bottomLeft = ccp(
label->getTexture()->getContentSize().width * label->getAnchorPoint().x + size,
label->getTexture()->getContentSize().height * label->getAnchorPoint().y + size);
//原來沒有判斷AnchorPoint的寫法
// CCPoint positionOffset= ccp( - label->getTexture()->getContentSize().width / 2,
// - label->getTexture()->getContentSize().height / 2);
//SetAnchorPoint會影響到positionOffset,所以要做判斷
CCPoint positionOffset = CCPointZero;
if(label->getAnchorPoint().x == 0.5f){
positionOffset.x = 0;
}else if(label->getAnchorPoint().x == 0.0f){
positionOffset.x =- label->getTexture()->getContentSize().width / 2;
}else{
positionOffset.x = label->getTexture()->getContentSize().width/2;
}
if(label->getAnchorPoint().y == 0.5f){
positionOffset.y = 0;
}else if(label->getAnchorPoint().y == 0.0f){
positionOffset.y =- label->getTexture()->getContentSize().height / 2;
}else{
positionOffset.y = label->getTexture()->getContentSize().height/2;
}
CCPoint position = ccpSub(originalPos, positionOffset);
rt->begin();
for (int i=0; i<360 data-blogger-escaped-for="" data-blogger-escaped-i="" data-blogger-escaped-label-="" data-blogger-escaped-needs="" data-blogger-escaped-optimize="" data-blogger-escaped-should="" data-blogger-escaped-that="" data-blogger-escaped-you="" data-blogger-escaped-your="">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);
label->setOpacity(originalOpacity);
rt->setPosition(position);
//反踞齒
rt->getSprite()->getTexture()->setAntiAliasTexParameters();
return rt;
}
本文介绍了一种使用 Cocos2d-X 实现边框效果的方法。通过创建渲染纹理并调整精灵的位置和颜色,可以在文字或图片周围绘制边框。此方法适用于 C++ 开发者,并提供了详细的代码示例。
80万+

被折叠的 条评论
为什么被折叠?



