Cocos2D-x权威指南
上QQ阅读APP看书,第一时间看更新

3.4.2 颜色布景层类CCLayerColor

颜色布景层类CCLayerColor是CCLayer类的子类,包含CCLayer类的特性,并且有两个拓展功能:可以为布景层增添颜色,以及设置不透明度。

首先看CCLayerColor类的定义初始化,如代码清单3-18所示。这段代码是tests项目下LayerTest.cpp文件中LayerTest1的onEnter函数。

代码清单3-18 CCLayerColor类的定义初始化

void LayerTest1::onEnter()
{
    LayerTest::onEnter();
    setTouchEnabled(true);
    CCSize s=CCDirector::sharedDirector()->getWinSize();
    CCLayerColor* layer=CCLayerColor::create(ccc4(0xFF,0x00,0x00,0x80),200,200);
    layer->ignoreAnchorPointForPosition(false);
    layer->setPosition(CCPointMake(s.width/2,s.height/2));
    addChild(layer,1,kTagLayer);
}

create函数的第一个参数是颜色的ARGB值,使用ccc4定义,其中第一个参数是颜色a值,第二个参数是R值,第三个参数是G值,最后一个参数是B值。除此之外,create函数的后两个参数是布景层的宽和高。

另外,使用ignoreAnchorPointForPosition将忽略锚点置为false。由于默认设置是忽略锚点,也就是以左下角为锚点,可以让布景层考虑锚点的影响(关于锚点在之前已经介绍过),这时默认的锚点在中心。运行效果如图3-14所示。

另外,LayerTest.cpp文件中的LayerTest1的updateSize函数中,可以修改颜色布景层的大小,如代码清单3-19所示。

图3-14 定义颜色布景层的显示效果

代码清单3-19 修改颜色布景层的大小

void LayerTest1::updateSize(CCPoint &touchLocation)
{
    CCSize s=CCDirector::sharedDirector()->getWinSize();
    CCSize newSize=CCSizeMake(fabs(touchLocation.x - s.width/2)*2,fabs(touchLocation.
    y - s.height/2)*2);
    CCLayerColor* l=(CCLayerColor*)getChildByTag(kTagLayer);
    l->setContentSize(newSize);
}

通过setContentSize可以设置颜色布景层的大小。对于CCLayerColor类来说,还有一个比较常用的函数setBlendFunc,可以让布景层的颜色产生渐变效果。比如,需要在整屏添加全屏的一些覆盖效果、全屏变黑或者全屏变暗时,都可以使用这个方法。代码清单3-20所示是tests项目LayerTestBlend类中的newBlend函数,也就是使用setBlendFunc的示例。

代码清单3-20 使用setBlendFunc的示例

void LayerTestBlend::newBlend(float dt)
{
    CCLayerColor *layer=(CCLayerColor*)getChildByTag(kTagLayer);
    GLenum src;
    GLenum dst;
    if(layer->getBlendFunc().dst==GL_ZERO)
    {
        src=GL_SRC_ALPHA;
        dst=GL_ONE_MINUS_SRC_ALPHA;
    }
    else
    {
        src=GL_ONE_MINUS_DST_COLOR;
        dst=GL_ZERO;
    }
    ccBlendFunc bf={src,dst};
    layer->setBlendFunc(bf);
}

传入的参数是一个有起始效果和结束效果的参数,运行之后的效果如图3-15和图3-16所示。

图3-15 传入参数GL_SRC_ALPHA的效果

图3-16 传入参数GL_ONE_MINUS_DST_COLOR的效果

CCLayerColor类作为一个带颜色的布景层,在开发中可以给我们做特效带来方便。下一节介绍多层布景层类。