Stroke example for CCLabelTTF and CCSprite.
阿新 • • 發佈:2018-12-30
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; }