菜单选项卡是什么东西呢,就是在一个场景中点击不同的菜单项会切换不同的层,但是菜单始终是在一个场景中的,玩游戏的时候经常看到的。实在不明白看看我最后的演示就ok了。我们完成这个功能用到的就是CCLayerMuliplex这个层,它也是继承自CCLayer,关于这个的基础用法,可以看看我的这篇文章CCLayer,CCLayerColor,CCLayerGradient,CCLayerMultiplex场景层的介绍。我们就是利用这个东西实现的我们的功能,其他的都很简单了。

使用CCLayerMultiplex实现菜单选项卡

//这里是三个场景层,其他的俩个都是一样的实现,只是图片改了而已
#ifndef _LAYER1_H_
#define _LAYER1_H_
#include "cocos2d.h"
using namespace cocos2d;

class Layer1 : public CCLayer
{
public:
	bool init();
	CREATE_FUNC(Layer1);
};
#endif
#include "Layer1.h"
//在init函数中添加一张图片作为背景精灵
bool Layer1::init()
{

	CCSprite * sprite = CCSprite::create("1.png");
	this->addChild(sprite);

	return true;
}
bool HelloWorld::init()
{
    if ( !CCLayer::init() )
    {
        return false;
    }

    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
	//创建背景图片
	CCSprite * background = CCSprite::create("background.png");
	background->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
	this->addChild(background);
	//创建各个选项卡对应的图层
	Layer3 * layer3 = Layer3::create();
	Layer2 * layer2 = Layer2::create();
	Layer1 * layer1 = Layer1::create();
	//将图层添加到multiplex图层中
	m_multiplex = CCLayerMultiplex::create(layer1,layer2,layer3,NULL);
	m_multiplex->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));
	this->addChild(m_multiplex);
	//创建菜单项
	CCMenuItemImage * item1 = CCMenuItemImage::create("button.png",
		"button2.png",this,menu_selector(HelloWorld::menuCloseCallback));
	item1->setTag(1);

	CCMenuItemImage * item2 = CCMenuItemImage::create("button.png",
		"button2.png",this,menu_selector(HelloWorld::menuCloseCallback));
	item2->setTag(2);

	CCMenuItemImage * item3 = CCMenuItemImage::create("button.png",
		"button2.png",this,menu_selector(HelloWorld::menuCloseCallback));
	item3->setTag(3);
	//创建菜单选项卡
	CCMenu * menu = CCMenu::create(item1,item2,item3,NULL);
	menu->alignItemsHorizontallyWithPadding(5);
	menu->setPosition(ccp(visibleSize.width/2,visibleSize.height-item1->getContentSize().height/2));
	this->addChild(menu);

    return true;
}

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
	static int curTag = 1;
	int tag = ((CCMenuItemImage *)pSender)->getTag();
	if(tag != curTag)
	{
		//切换布景,如果使用switchToAndReleaseMe会释放掉当前布景,添加到multiplex中的层默认的第一个tag是0
		this->m_multiplex->switchTo(tag-1);
		curTag = tag;
	}
}