層(CCLayer) 從概念上說,層就是場景裏的背景。 CCLayer一樣是CCNode的子類,一般用addChild方法添加子節點。CCLayer對象定義了可描繪的區域,定義了描繪的規則。CCLayer能夠實現半透明的效果,層的事件相應機制 : 最外層最早接受到事件(屏幕觸碰),最後是底層,若是在某層處理了該事件,則後面的層不會在接受到事件信號。html
CCLayer類的做用主要有三個。node
(1)其餘子節點的容器和組織者url
例如對一個層使用動做,那麼全部在這個層上的物體都會受到影響。這意味着同一層的全部物體能夠一塊兒移動、旋轉和縮放。若是這些物體都是同一個層的子節點,就能夠經過改變層的屬性或者在層上執行動做,從而影響層上全部子節點。spa
(2)接收觸摸事件code
設置isTouchEnabled爲YES,可讓層接收觸摸事件。一旦啓用isTouchEnabled屬性,將會開始調用許多與接收觸摸輸入相關的方法。這些事件包括:當新的觸摸事件開始時,當手指在觸摸屏上移動時,以及當用戶手指離開屏幕之後。htm
(3)接收加速計事件對象
和觸摸輸入同樣,加速計必須在啓用之後才能接收加速計事件。blog
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; }
運行的效果以下: