1. 程式人生 > >Cocos2d-x學習筆記(四) 布景層的加入移除

Cocos2d-x學習筆記(四) 布景層的加入移除

dcl from position 顏色 顯示地圖 idt col 分享 學習

布景層類也就是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;
}

執行後效果例如以下:

技術分享

同一時候我們還能夠給這個層改變顏色、大小和其它的屬性。在這裏我就不示範了。接下來我們寫一些簡單應用樣例。

在前面的樣例中場景與層是寫在同一個類裏的。如今為了便於理解,我將場景與層分開處理,也就是場景和層都將是單獨的類。

首先我創建了兩個布景層類,AboutLayerPlayLayer,實現代碼例如以下:

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

給層設置屬性Tag1,然後在加入層前將Tag1的層先移除,盡管我認為這是個蠻笨的辦法,只是眼下我對cocos2dx的了解也僅限於此呀!

?? ??

Cocos2d-x學習筆記(四) 布景層的加入移除