Stroke example for CCLabelTTF and CCSprite.

来源:互联网 发布:魔兽数据库7.3 编辑:程序博客网 时间:2024/06/07 23:00

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();1011    ccColor3B originalColor = label->getColor();1213    GLubyte originalOpacity = label->getOpacity();1415    bool originalVisibility = label->getIsVisible();1617    label->setColor(color);1819    label->setOpacity(opacity);2021    label->setIsVisible(true);2223    ccBlendFunc originalBlend = label->getBlendFunc();2425    ccBlendFunc bf = {GL_SRC_ALPHA, GL_ONE};2627    label->setBlendFunc(bf);2829    CCPoint bottomLeft = ccp(30        label->getTexture()->getContentSize().width * label->getAnchorPoint().x + size, 31        label->getTexture()->getContentSize().height * label->getAnchorPoint().y + size);3233    CCPoint positionOffset= ccp(34        - label->getTexture()->getContentSize().width / 2,35        - label->getTexture()->getContentSize().height / 2);3637    CCPoint position = ccpSub(originalPos, positionOffset);3839    rt->begin();4041    for (int i=0; i<360; i+= 15) // you should optimize that for your needs42    {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();4950    label->setPosition(originalPos);51    label->setColor(originalColor);52    label->setBlendFunc(originalBlend);53    label->setIsVisible(originalVisibility);54    label->setOpacity(originalOpacity);5556    rt->setPosition(position);5758    return rt;59}



 CCSprite* sprite = CCSprite::spriteWithFile("some_sprite.png");23    addChild(sprite);45    CCRenderTexture* tex = createStroke(sprite, 2 /*size*/, ccc3(0, 255, 0)/*color*/, 50 /*opacity*/);67    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;    }



原创粉丝点击