Cocos2dx 学习笔记29 CCLayerMultiplex管理多个层

CCLayerMultiplex继承自cclayer,它可以管理多个层,并实现不同层间的切换,但是同一时间只能有一个层是激活状态,其他都是不可见的

以下为cclayerMultiplex的用途,网上有用来做TabBar的,官方的TestCpp中用在MenuTest例子中。

(1)CCLayerMultiplex实现Tab选项卡

原创作品,转载请标明:http://www.jb51.cc/article/p-hrezrsqi-ep.html


有时候,我们希望实现一个选项卡功能,就是切换tab选项,场景中的内容会跟着改变,但是tab选项卡不动。这是用切换场景的方式没办法做到的。

这里我们就可以使用cclayerMultiplex来实现这个功能


1.创建布景

这里创建3个布景来做示范。分别是Laye1,Layer2和Layer3。代码就不贴了,布景内容可以直接使用HelloWorld的代码


2.创建主场景

主场景的初始化函数如下:

  1. boolCCMainScene::init()
  2. {
  3. boolbRet=false;
  4. do
  5. {
  6. CC_BREAK_IF(!CCScene::init());
  7. _layer1=cclayer1::create();//创建3个层的实例
  8. _layer2=cclayer2::create();
  9. _layer3=cclayer3::create();
  10. _layerMuticomplex=cclayerMultiplex::create(_layer1,_layer2,_layer3,NULL);//创建多层布景层
  11. this->addChild(_layerMuticomplex);//添加到场景,显示一个布景
  12. CCSizevisibleSize=CCDirector::sharedDirector()->getVisibleSize();
  13. CCPointorigin=CCDirector::sharedDirector()->getVisibleOrigin();
  14. CcmenuItemImage*pCloseItem1=CcmenuItemImage::create(//创建3个tab菜单,用于切换布景
  15. "w_b.png",
  16. "w_b.png",
  17. this,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> menu_selector(CCMainScene::menuCallback));
  18. CcmenuItemImage*pCloseItem2=CcmenuItemImage::create(
  19. "r_b.png",248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> "r_b.png",248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> CcmenuItemImage*pCloseItem3=CcmenuItemImage::create(
  20. "g_b.png",248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> "g_b.png",248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> //createmenu,it'sanautoreleaSEObject
  21. pCloseItem1->setTag(0);//给tab按钮设置tag,方便回调函数中的获取
  22. pCloseItem2->setTag(1);
  23. pCloseItem3->setTag(2);
  24. Ccmenu*pMenu=Ccmenu::create(pCloseItem1,pCloseItem2,pCloseItem3,0); background-color:inherit">//创建菜单
  25. pMenu->alignItemsHorizontallyWithPadding(-1);//设置菜单项间隔
  26. pMenu->setPosition(visibleSize.width/2,25);
  27. this->addChild(pMenu,1);//注意哦,菜单要在场景中添加而不是在布景中了!而且z轴要高于多层布景,保证可见。
  28. bRet=true;
  29. }while(0);
  30. returnbRet;
  31. }

回调函数如下:

copy
    voidCCMainScene::menuCallback(CCObject*pSender)
  1. intitem=((CcmenuItemImage*)pSender)->getTag();//获取选择项
  2. if(item!=curLayerPos)
  3. _layerMuticomplex->switchTo(item);//切换布景,如果使用switchToAndReleaseMe会释放掉当前布景
  4. curLayerPos=item;
  5. }
  6. }

3.效果

为了让效果明显一点,我让3个布景稍微有点区别。当然菜单是可以做normal,presseddisable三态的,这里略去。点击不同的选项卡就可以切换到不同的布景层。当然cclayerMultiplex还可以嵌套使用。




4.源码下载地址

http://download.csdn.net/detail/jackyvincefu/6421801


(2)TestCpp官方例子

    cclayer*mainLayer=newMenuDemo;
  1. cclayer*menu1=newMenuDemoItem1;
  2. cclayer*menu2=newMenuDemoItem2;
  3. cclayer*menu3=newMenuDemoItem3;
  4. cclayerMultiplex*Menu_multiplex=cclayerMultiplex::create(mainLayer,menu1,menu2,menu3,NULL);
  5. addChild(Menu_multiplex,0);
  6. mainLayer->release();
  7. menu1->release();
  8. menu2->release();
  9. menu3->release();
  10. CCDirector::sharedDirector()->replaceScene(this);

首先在你的scene中创建这个 cclayerMultiplex,不要调换了代码顺序哦!


然后写回调函数了:

    voidMenuDemo::fontMenu1_callBack(CCObject*object){
  1. ((cclayerMultiplex*)(m_pParent))->switchTo(2);
  2. }
  3. voidMenuDemo::fontMenu2_callBack(CCObject*object){
  4. ((cclayerMultiplex*)(m_pParent))->switchTo(3);
  5. voidMenuDemo::fontMenu3_callBack(CCObject*object){
  6. ((cclayerMultiplex*)(m_pParent))->switchTo(1);
  7. }

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...