Cocos2d-x學習筆記(四) 布景層的加入移除
布景層類也就是CCLayer類,每一個遊戲場景中都能夠有非常多層,每一層負責各自的任務。顯示地圖、顯示人物等。同一時候層還是一個容器,能夠放入文本、圖片和菜單。構成遊戲中一個個UI。這次將學習在場景中加入移除層、設置層屬性和在層中實現一些簡單的操作。
首先我們來看一下層的創建:
bool LayerTest::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } CCSize s = CCDirector::sharedDirector()->getWinSize(); CCLayerColor* layer = CCLayerColor::create( ccc4(255,0,0,255),200,200); layer->ignoreAnchorPointForPosition(false); layer->setPosition( CCPointMake(s.width/2, s.height/2) ); addChild(layer, 1); return true; }
執行後效果例如以下:
同一時候我們還能夠給這個層改變顏色、大小和其它的屬性。在這裏我就不示範了。接下來我們寫一些簡單應用樣例。
在前面的樣例中場景與層是寫在同一個類裏的。如今為了便於理解,我將場景與層分開處理,也就是場景和層都將是單獨的類。
首先我創建了兩個布景層類,AboutLayer和PlayLayer,實現代碼例如以下:
AboutLayer.h
#pragma once #include "cocos2d.h" USING_NS_CC; class AboutLayer : public cocos2d::CCLayer { public: virtual bool init(); void menuCloseCallback(CCObject* pSender); CREATE_FUNC(AboutLayer); };
AboutLayer.cpp
#include "AboutLayer.h" bool AboutLayer::init() { CCSize s = CCDirector::sharedDirector()->getWinSize(); CCLayerColor* pLayer = CCLayerColor::create(ccc4(255,0,0,255)); pLayer->ignoreAnchorPointForPosition(false); pLayer->setContentSize(CCSizeMake(200,200));//設置層大小 pLayer->setPosition(CCPointMake(s.width/2-100, s.height/2));//設置層位置 CCLabelTTF *pLabel = CCLabelTTF::create("This is AboutLayer","Thonburi", 14); pLabel->setPosition(CCPointMake(pLayer->getContentSize().width/2, pLayer->getContentSize().height/2)); pLayer->addChild(pLabel); return true; }
然後創建一個場景類,我將它命名為SingleScene,代碼例如以下:
SingleScene.h
#pragma once #include "cocos2d.h" #include "AboutLayer.h" #include "PlayLayer.h" class SingleScene : public cocos2d::CCScene { public: virtual bool init(); static CCScene* runScene(); void menuAboutClick(CCObject* pSender); void menuPlayClick(CCObject* pSender); CREATE_FUNC(SingleScene); };
SingleScene.cpp
#include "SingleScene.h" CCScene* SingleScene::runScene() { SingleScene* scene = new SingleScene(); scene->init(); return scene; } bool SingleScene::init() { //創建aboutbutton CCMenuItemImage *pAboutItem = CCMenuItemImage::create("btn-about-normal.png", "btn-about-selected.png",this,menu_selector(SingleScene::menuAboutClick)); pAboutItem->setPosition(ccp(100,30)); //創建menu CCMenu *pMenu = CCMenu::create(pAboutItem,NULL); pMenu->setPosition(CCPointZero); addChild(pMenu); return true; }
類創建好了,我們來實現點擊button後,在SingleScene.cpp中加入一個層。加入層的關鍵代碼:
void SingleScene::menuAboutClick(CCObject* pSender){ AboutLayer* pLayer_about = AboutLayer::create(); addChild(pLayer_about,1,1); }
至於層裏面的顯示內容大家自由發揮吧。有前幾章的學習應該沒什麽問題~
執行效果例如以下,按下Aboutbutton後彈出一個層來。
接下來我們在AboutLayer.cpp上加入一個button。讓我們按下button能夠移除這個層。
移除層的關鍵代碼:
void AboutLayer::menuCloseCallback(CCObject* pSender) { this->removeFromParentAndCleanup(true); }
執行效果例如以下,點擊右上角的關閉button會將about層移除掉。
相同的代碼我再在PlayLayer裏面實現一遍,這樣看起來像不像遊戲裏的功能菜單的雛形啦?哈哈。
布景層的簡單功能學習完畢了,想要了解很多其它功能在以後的學習中會有機會碰到。
在這裏有個小小的問題。大家應該會發現假設不停的按同一個button會產生非常多個相同的層。盡管他們在相同的位置肉眼看不出來,但他們確確實實是會存在的。為了解決問題我在加入層的方面裏加了一句代碼:
void SingleScene::menuAboutClick(CCObject* pSender){ if (getChildByTag(1)!=NULL) removeChild(getChildByTag(1)); AboutLayer* pLayer_about = AboutLayer::create(); addChild(pLayer_about,1,1); }
給層設置屬性Tag為1,然後在加入層前將Tag為1的層先移除,盡管我認為這是個蠻笨的辦法,只是眼下我對cocos2dx的了解也僅限於此呀!
Cocos2d-x學習筆記(四) 布景層的加入移除