[Cocos2d-x For WP8]Layer 层

    层(CCLayer) 从概念上说,层就是场景里的背景。 CCLayer一样是CCNode的子类,一般用addChild方法添加子节点。CCLayer对象定义了可描绘的区域,定义了描绘的规则。CCLayer能够实现半透明的效果,层的事件相应机制 : 最外层最早接受到事件(屏幕触碰),最后是底层,若是在某层处理了该事件,则后面的层不会在接受到事件信号。html

    CCLayer类的做用主要有三个。node

(1)其余子节点的容器和组织者url

例如对一个层使用动做,那么全部在这个层上的物体都会受到影响。这意味着同一层的全部物体能够一块儿移动、旋转和缩放。若是这些物体都是同一个层的子节点,就能够经过改变层的属性或者在层上执行动做,从而影响层上全部子节点。spa

(2)接收触摸事件code

设置isTouchEnabled为YES,可让层接收触摸事件。一旦启用isTouchEnabled属性,将会开始调用许多与接收触摸输入相关的方法。这些事件包括:当新的触摸事件开始时,当手指在触摸屏上移动时,以及当用户手指离开屏幕之后。htm

(3)接收加速计事件对象

和触摸输入同样,加速计必须在启用之后才能接收加速计事件。blog

头文件:

 #include <CCLayer.h>                       

继承关系图:

       CCNode   CCTouchDelegate   CCAccelerometerDelegate   CCKeypadDelegate   CCObject   CCCopying   CCLayerColor   CCLayerMultiplex   CCMenu   CCLayerGradient                           

1.CCLayerColor是一个透明的、能够按照RGB设置填充颜色的层,是实现CCRGBAProtocol协议的CCLayer子类。它继承了CCNode全部属性和方法,同时还能够接收触摸事件和加速计事件。排序

2.CCLayerGradient渐变色层,CCLayerColor有一个子类CCLayerGradient,能够在背景上绘制渐变色。CCLayerGradient继承了CCLayerColor的全部特性,增长了渐变方向、插值模式等属性。如下代码初始化带有特定渐变效果的色彩层。继承

3.CCMenu是表示菜单栏,用来建立游戏中的各类菜单,包括主菜单、游戏设置等,而实现菜单系统的就是CCMenu类及其子类。

CCMenu继承自CCLayer,是一个菜单管理选择画面层,该画面以Menu对象为集合类,由MenuItem类实例组成各类按钮。CCMenu类提供的方法主要用来按横向、竖向或者多行列排序展现MenueItem的类实例。同时,CCMenu只支持CCMenuItem节点做为它的子节点。

注意 CCMenuItem是基础类,不能直接用来建立菜单,它的做用主要是设置按钮状态以及处理回调方法。须要使用CCMenuItem的子类来建立定制菜单项。

4.CCLayerMultipex,CCLayer的子类CCLayerMultipex,能够容纳多个层,但每次只可激活其中的一个。一般不鼓励使用CCLayerMultipex。

下面代码示例CCLayerColor的使用:

class LayerTest1 : public cocos2d::CCLayer
{
public:
    LayerTest1();
    ~LayerTest1();
    virtual void onEnter();
    void updateSize(cocos2d::CCPoint &touchLocation);

    virtual void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
    virtual void ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
    virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
};

void LayerTest1::onEnter()
{
    CCLayer::onEnter();
    setTouchEnabled(true);  
    CCSize s = CCDirector::sharedDirector()->getWinSize();
    //建立一个颜色的层,设置宽度和高度
    CCLayerColor* layer = CCLayerColor::create( ccc4(0xFF, 0x00, 0x00, 0x80), 200, 200); 
    //将忽略锚点置为false。因为默认设置是忽略锚点,也就是以左下角为锚点,可让布景层考虑锚点的影响,这时默认的锚点在中心。
    layer->ignoreAnchorPointForPosition(false);
    layer->setPosition( ccp(s.width/2, s.height/2) );
    addChild(layer, 1, 1);
}
//根据触摸点修改颜色层的大小
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(1);
    l->setContentSize( newSize );
}

void LayerTest1::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
    ccTouchesMoved(pTouches, pEvent);
}
//触摸在屏幕移动的时候将修改颜色层的大小
void LayerTest1::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
    CCTouch *touch = (CCTouch*)pTouches->anyObject();
    CCPoint touchLocation = touch->getLocation();

    updateSize(touchLocation);
}

void LayerTest1::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
    ccTouchesMoved(pTouches, pEvent);
}
CCScene* HelloWorld::scene()
{
    CCScene * scene = NULL;
    do 
    {   // 'scene'是一个能够自动释放的对象
        scene = CCScene::create();
        //建立失败跳出循环
        CC_BREAK_IF(! scene);
        // 'layer'是一个能够自动释放的对象
        HelloWorld *layer = HelloWorld::create();
        //建立失败跳出循环
        CC_BREAK_IF(! layer);
        // 添加layer到scene上面
        scene->addChild(layer);

        LayerTest1 *layer2 = new LayerTest1();
        // 添加layer到scene上面
        scene->addChild(layer2);
    } while (0);

    // 返回scene
    return scene;
}

运行的效果以下:

相关文章
相关标签/搜索