zoukankan      html  css  js  c++  java
  • cocos2d/-x 用CCRenderTexture为一个CCLabelTTF创建阴影。

    游戏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());


  • 相关阅读:
    systemverilog中堵塞和非堵塞事件以及同步
    Win 10最大的亮点不是免费而是人工智能
    STL源代码学习(vector篇)
    【金阳光測试】大话Android自己主动化測试--Android自己主动化系列(1)--金阳光于2013年4月份
    [PHP]怎样在SAE的CodeIgniter项目中隐藏掉index.php
    ubuntu 非长期支持版升级系统版本号(ssh登录情况适用)
    #26 Remove Duplicates from Sorted Array
    怎样建设内网网站
    scrollView and tableView
    关于Kingfisher--备用
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3149672.html
Copyright © 2011-2022 走看看