[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;
}

運行的效果以下:

相關文章
相關標籤/搜索