在使用之前,我们的先看一下用这个能实现什么效果,大家应该都玩过保卫萝卜吧,我们就用CClayerMultiplex,实现一下保卫萝卜的设置界面。
是不是点击,选项,数据统计,制作方界面都会变,可能有的小伙伴会想,我用多个类也能实现,或者我用类似选关的方法,让层左右滑动呗,当然都可以......我只是讲例子(当然实际作出来的效果和原版很差距,上面只有3个层背景)
首先,我们先查看一下官方是怎么用这玩意的
CCLayerMultplex:可以包含好几个layer,但是只显示一个layer,可以实现多个Layer之间的切换
官方示例是这样的
在.h中
//实现多层切换的CCLayerMultiplex对象
CCLayerMultiplex* multi;
在.cpp中
//设置窗口的背景颜色为绿色
CCLayerColor* layer1 = CCLayerColor::create(ccc4(0, 255, 0, 255));
//设置窗口的背景颜色为红色
CCLayerColor* layer2 = CCLayerColor::create(ccc4(255, 0, 0, 255));
//多层
multi = CCLayerMultiplex::create(layer1, layer2, NULL);
//multi->switchTo(1);
addChild(multi);
奥,这样一看,这个家伙好像一个有特定功能的控制器,把层摆放好,每一个做好标记
那我也借鉴一下,试试
注:因为我也是刚刚学习cocos2d-x的新手,代码偏于傻瓜化,不要笑
我在.h里这样写
#pragma once
#include "cocos2d.h"
using namespace cocos2d;
class Setting : public CCLayer
{
public:
bool init();
static CCScene* scene();
CCLayerMultiplex *LL; //多层控制器
void SetBack(CCObject*);//设置按钮的回调函数
void Datatongji(CCObject*);//数据统计
void Makemen(CCObject*);//制作方
CREATE_FUNC(Setting);
Setting(void);
~Setting(void);
};
.cpp
#include "Setting.h"
Setting::Setting(void)
{
}
Setting::~Setting(void)
{
}
bool Setting::init()
{
CCLayer::init();
//-----获取坐标和锚点--------
CCSize sz = CCDirector::sharedDirector()->getVisibleSize();
CCPoint point = CCDirector::sharedDirector()->getVisibleOrigin();
//-----加载plist文件---------
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("scene/setting01-hd.plist");
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("scene/setting02-hd.plist");
//-----添加三个层,使用CClayerMultiplex管理层-------------
CCLayer* L1 = CCLayer::create();
CCSprite* L1bg = CCSprite::createWithSpriteFrameName("setting_bg.png");
L1->addChild(L1bg);
L1->setPosition(ccp(sz.width/2,sz.height/2));
CCLayer* L2 = CCLayer::create();
CCSprite* L2bg = CCSprite::createWithSpriteFrameName("statistics_bg.png");
L2->addChild(L2bg);
L2->setPosition(ccp(sz.width/2,sz.height/2));
CCLayer* L3 = CCLayer::create();
CCSprite* L3bg = CCSprite::createWithSpriteFrameName("credits_bg.png");
L3->addChild(L3bg);
L3->setPosition(ccp(sz.width/2,sz.height/2));
LL = CCLayerMultiplex::create(L1,L2,L3,NULL);
LL->switchTo(0);
this->addChild(LL,1);
//-----添加按钮--------------
//选项按钮
CCMenuItemImage* set = CCMenuItemImage::create(NULL,NULL,this,menu_selector(Setting::SetBack));
CCSprite* set1 = CCSprite::createWithSpriteFrameName("options_normal_CN.png");
CCSprite* set2 = CCSprite::createWithSpriteFrameName("options_selected_CN.png");
set->setNormalImage(set1);
set->setSelectedImage(set2);
//数据统计
CCMenuItemImage* Datemen = CCMenuItemImage::create(NULL,NULL,this,menu_selector(Setting::Datatongji));
CCSprite* Datemen1 = CCSprite::createWithSpriteFrameName("statistics_normal_CN.png");
CCSprite* Datemen2 = CCSprite::createWithSpriteFrameName("statistics_selected_CN.png");
Datemen->setNormalImage(Datemen1);
Datemen->setSelectedImage(Datemen2);
//制作方
CCMenuItemImage* men = CCMenuItemImage::create(NULL,NULL,this,menu_selector(Setting::Makemen));
CCSprite* men1 = CCSprite::createWithSpriteFrameName("credits_normal_CN.png");
CCSprite* men2 = CCSprite::createWithSpriteFrameName("credits_selected_CN.png");
men->setNormalImage(men1);
men->setSelectedImage(men2);
//menu菜单集合
CCMenu* menu = CCMenu::create(set,Datemen,home,men,NULL);
menu->setPosition(ccp(sz.width/2,sz.height/2));
set->setPosition(ccp(-210,275));//不要在意这些数字,要根据你自己做的demo设置
Datemen->setPosition(ccp(0,275));
men->setPosition(ccp(210,275));
this->addChild(menu,2);
return true;
}
CCScene* Setting::scene()
{
CCScene *p = CCScene::create();
Setting* pMenu = Setting::create();
p->addChild(pMenu);
return p;
}
void Setting::SetBack(CCObject*)
{
LL->switchTo(0);//这里不得不说一下,switchTo激活层,数字0粗略的认为是下标吧,我蒙着填写的,结果好用,好吧,无话可说!
}
void Setting::Datatongji(CCObject*)
{
LL->switchTo(1);
}
void Setting::Makemen(CCObject*)
{
LL->switchTo(2);
}
看一下不一样的结果吧
想必大家看到结果图是,要吐槽的心情已经很复杂了,没添加其它精灵也就算了,居然连按钮也应付,呵呵,就那么个意思吧,哪位大神要是实在看我的代码看不下去了,敬请批评!
好嘞,完工,迅速消失在茫茫人海中......