Cocos2d-x之LayerMultiplex的使用

1、用处

用于管理Layer的切换,而不用切换场景。

2、代码

1).h文件

#include "cocos2d.h"
#include "ui/CocosGUI.h"
#include "VisibleRect.h"
USING_NS_CC;
using namespace ui;

class LayerMultiplexDemo : public Scene
{
public:
    CREATE_FUNC(LayerMultiplexDemo);
    virtual bool init();
};

class BaseLayer : public Layer
{
public:
    CREATE_FUNC(BaseLayer);
    virtual bool init();
    Text* text;
    Size winSize;
};

class MainLayer : public BaseLayer
{
public:
    CREATE_FUNC(MainLayer);
    virtual bool init();

    void menuCallback1(Ref* sender);
    void menuCallback2(Ref* sender);
    void menuCallback3(Ref* sender);
};

class Layer1 : public BaseLayer
{
public:
    CREATE_FUNC(Layer1);
    virtual bool init();
    void touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type);
};

class Layer2 : public BaseLayer
{
public:
    CREATE_FUNC(Layer2);
    virtual bool init();
    void touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type);
};

class Layer3 : public BaseLayer
{
public:
    CREATE_FUNC(Layer3);
    virtual bool init();
    void touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type);
};

2).cpp文件

#include "LayerMultiplexDemo.h"
bool LayerMultiplexDemo::init()
{
    bool bRet = false;
    do{
        CC_BREAK_IF(!Scene::init());

        MenuItemFont::setFontSize(20);

        auto layer  = MainLayer::create();
        auto layer1 = Layer1::create();
        auto layer2 = Layer2::create();
        auto layer3 = Layer3::create();

        auto layerMultiplex = LayerMultiplex::create(layer,layer1, layer2, layer3, nullptr);
        addChild(layerMultiplex, 0);

        bRet = true;
    }while(0);
    return bRet;
}

bool BaseLayer::init()
{
    bool bRet = false;
    do{
        CC_BREAK_IF(!Layer::init());
        winSize = Director::getInstance()->getWinSize();

        text = Text::create();
        text->setFontSize(40);
        text->setPosition(Vec2(winSize.width/2,winSize.height - 100));
        addChild(text);

        bRet = true;
    }while(0);
    return bRet;
}

bool MainLayer::init()
{
    bool bRet = false;
    do{
        CC_BREAK_IF(!BaseLayer::init());
        text->setString("Hello! This is MainLayer!");

        auto label1 = Label::createWithBMFont("bitmapFontTest3.fnt", "Layer 1");
        auto item1 = MenuItemLabel::create(label1, CC_CALLBACK_1(MainLayer::menuCallback1, this));

        auto label2 = Label::createWithBMFont("bitmapFontTest3.fnt", "Layer 2");
        auto item2 = MenuItemLabel::create(label2, CC_CALLBACK_1(MainLayer::menuCallback2, this));

        auto label3 = Label::createWithBMFont("bitmapFontTest3.fnt", "Layer 3");
        auto item3 = MenuItemLabel::create(label3, CC_CALLBACK_1(MainLayer::menuCallback3, this));

        auto menu = Menu::create(item1,item2,item3,nullptr);
        menu->alignItemsVertically();
        addChild(menu);
        menu->setPosition(Vec2(winSize.width/2,winSize.height/2));

        bRet = true;
    }while(0);
    return bRet;
}

void MainLayer::menuCallback1(cocos2d::Ref *sender)
{
    static_cast<LayerMultiplex*>(_parent)->switchTo(1);
}

void MainLayer::menuCallback2(cocos2d::Ref *sender)
{
    static_cast<LayerMultiplex*>(_parent)->switchTo(2);
}
void MainLayer::menuCallback3(cocos2d::Ref *sender)
{
    static_cast<LayerMultiplex*>(_parent)->switchTo(3);
}

bool Layer1::init()
{
    bool bRet = false;
    do{
        CC_BREAK_IF(!BaseLayer::init());

        text->setString("Hello! This is Layer1");

        auto layout = Layout::create();
        layout->setContentSize(Size(300,300));
        layout->setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID);
        layout->setBackGroundColor(Color3B::GRAY);
        layout->ignoreAnchorPointForPosition(false);
        layout->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
        layout->setPosition(Vec2(winSize.width/2,winSize.height/2));
        addChild(layout);
        auto button = Button::create("btn-about-normal.png","btn-about-selected.png");
        button->setPosition(Vec2(layout->getContentSize().width/2,layout->getContentSize().height/2));
        layout->addChild(button);
        button->addTouchEventListener(CC_CALLBACK_2(Layer1::touchEvent, this));

        bRet = true;
    }while(0);
    return bRet;
}
void Layer1::touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type)
{
    static_cast<LayerMultiplex*>(_parent)->switchTo(0);
}

bool Layer2::init()
{
    bool bRet = false;
    do{
        CC_BREAK_IF(!BaseLayer::init());
        text->setString("Hello! This is Layer2");

        auto layout = Layout::create();
        layout->setContentSize(Size(300,300));
        layout->setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID);
        layout->setBackGroundColor(Color3B::GRAY);
        layout->ignoreAnchorPointForPosition(false);
        layout->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
        layout->setPosition(Vec2(winSize.width/2,winSize.height/2));
        addChild(layout);
        auto button = Button::create("btn-about-normal.png","btn-about-selected.png");
        button->setPosition(Vec2(layout->getContentSize().width/2,layout->getContentSize().height/2));
        layout->addChild(button);
        button->addTouchEventListener(CC_CALLBACK_2(Layer2::touchEvent, this));

        bRet = true;
    }while(0);
    return bRet;
}
void Layer2::touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type)
{
    static_cast<LayerMultiplex*>(_parent)->switchTo(0);
}

bool Layer3::init()
{
    bool bRet = false;
    do{
        CC_BREAK_IF(!BaseLayer::init());
        text->setString("Hello! This is Layer3");

        auto layout = Layout::create();
        layout->setContentSize(Size(300,300));
        layout->setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID);
        layout->setBackGroundColor(Color3B::GRAY);
        layout->ignoreAnchorPointForPosition(false);
        layout->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
        layout->setPosition(Vec2(winSize.width/2,winSize.height/2));
        addChild(layout);
        auto button = Button::create("btn-about-normal.png","btn-about-selected.png");
        button->setPosition(Vec2(layout->getContentSize().width/2,layout->getContentSize().height/2));
        layout->addChild(button);
        button->addTouchEventListener(CC_CALLBACK_2(Layer3::touchEvent, this));

        bRet = true;
    }while(0);
    return bRet;
}
void Layer3::touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type)
{
    static_cast<LayerMultiplex*>(_parent)->switchTo(0);
}

3、使用效果

时间: 2024-12-30 01:38:57

Cocos2d-x之LayerMultiplex的使用的相关文章

Cocos2d-x3.2 LayerMultiplex使用说明

LayerMultiplex是层的控制器类 使用如下 LayerMultiplexTest.h // // LayerMultiplexTest.h // cpp4 // // Created by 杜甲 on 10/13/14. // // #ifndef __cpp4__LayerMultiplexTest__ #define __cpp4__LayerMultiplexTest__ #include "cocos2d.h" USING_NS_CC; class LayerMult

cocos2d::Vector

v3.0 beta加入 定义在"COCOS2DX_ROOT/cocos/base"的"CCVector.h"头文件中. template<class T>class CC_DLL Vector; cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器. cocos2d::Vector<T>中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector. 在Cocos2d-x v3.

Cocos2D中Action的进阶使用技巧(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 大家对Cocos2d中动作的使用大概都非常清楚了,事实上本身action的概念也不复杂. 可是在某些情况下,一般的动作不能满足我们需求的时候,我们就必须使用更高级的Action方法来解决这个问题. 比方,串行化(不是序列化哦,这是两个全然不同的概念)不同Action的执行-有些童鞋可能会说非常easy,直接用CCActionSequence不就结了,可是等等我

Cocos2d入门--3-- 向量的应用

 Cocos2d入门--3-- 向量的应用 小球向一个方向持续运动的Demo HelloWorldScene.h ...... //设置一个protected的属性 protected: cocos2d::Vec2 _vec; ...... HelloWorldScene.cpp //这个是通过随机数设置向量的方向 _vec.set(random(-0.1f, 1.0f), random(-1.0f, 1.0f)); //通过normalize这个标准化函数,能够使得向量的大小为1 _vec.n

Cocos2d入门--1-- 初涉相关属性或代码

 Cocos2d入门--1-- 初涉相关属性或代码 Cocos2d vision:  cocos2d-x-3.8.1 万丈高楼,起于累土.对于一个游戏框架的学习,其实在于框架功能的使用积累,学会了如何在cocos2d游戏引擎的基础上使用它提供的各种功能,并灵活运用, 以及学会查阅Cocos2d官方提供的API文档.相信自己也能开发出自己喜爱或者让别人羡慕的游戏. 目录: 1>认识origin和visibleSize以及cocos2d的基础绘画类DrawNode的简单实用 2>认识 CCLOG(

UITableViewController 滚动引起的cocos2d动画暂停问题的解决

UITableViewController 滚动引起的cocos2d动画暂停问题的解决 之前在使用UITableViewController进行滚动时,cocos2d的动画会暂停,直至滚动完毕才会继续动画. 后来发现可以这样解决,想要了解更多,请查阅NSRunLoop相关知识. // .h NSTimer* m_timer; // .m- (void)updateCCDirector { [[CCDirector sharedDirector] drawScene]; if (!self.tab

cocos2d 游戏开发实战

文章转自:http://uliweb.clkg.org/tutorial/read/40 6   cocos2d 游戏开发实战 6.1   创建cocos2d项目 6.2   cocos2d v3 "hello world" 6.2.1   显示一个飞船 6.3   精灵 6.4   開始 space viking 之旅 6.4.1   添加 sneakyinput 6.5   精灵的移动效果,旋转效果 6.6   定时器效果 6.7   启动 cocos2d,默认竖屏 6.8   检

cocos2d::Map

v3.0 beta加入 定义在"COCOS2DX_ROOT/cocos/base"的"CCMap.h"头文件中. template <class K, class V> class CC_DLL Map; cocos2d::Map<K,V>是使用std::unordered_map作为底层结构的关联式容器. 而std::unordered_map是一个存储键值对的关联式容器,它可以通过它们的键快速检索对应的值. 使用unordered_map

cocos2d::Value

cocos2d::Value 于v3.0beta加入 定义在"COCOS2DX_ROOT/cocos/base"的头文件"CCValue.h"中 class Value; cocos2d::Value是许多基本类型(int,float,double,bool,unsigned char,char*和std::string)还有std::vector<Value>, std::unordered_map<std::string,Value>和s