//HelloWorld.h#include "cocos2d.h"#include "ui/CocosGUI.h"#include "First.h"#include "Second.h"#include "Third.h"USING_NS_CC;using namespace ui;enum Tag{ FIRST = 1, SECOND, THIRD};class HelloWorld : public cocos2d::Layer{public: // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::Scene* createScene(); // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); Size winSize; First* first; Second* second; Third* third; void createLayout(int tag); // a selector callback void menuCloseCallback(cocos2d::Ref* pSender); void touchEvent(Ref *pSender, cocos2d::ui::Widget::TouchEventType type);// void touchEvent(Ref* pSender,cocos2d::ui::Widget::TouchEventType type); // implement the "static create()" method manually CREATE_FUNC(HelloWorld);};
//HelloWorld.cpp#include "HelloWorldScene.h"#define MAX_LAYER 3;USING_NS_CC;Scene* HelloWorld::createScene(){ // 'scene' is an autorelease object auto scene = Scene::create(); // 'layer' is an autorelease object auto layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene;}static int sceneIdx = -1;Layout* createActionManagerLayer(int nIndex){ log("sceneIdx = %d",nIndex); switch(nIndex) { case 0: return First::create(); case 1: return Second::create(); case 2: return Third::create(); } return NULL;}Layout* nextActionManagerAction();Layout* backActionManagerAction();Layout* restartActionManagerAction();Layout* nextActionManagerAction(){ sceneIdx++; sceneIdx = sceneIdx % MAX_LAYER; auto layer = createActionManagerLayer(sceneIdx);// layer->autorelease(); return layer;}Layout* backActionManagerAction(){ sceneIdx--; int total = MAX_LAYER; if( sceneIdx < 0 ) sceneIdx += total; auto layer = createActionManagerLayer(sceneIdx);// layer->autorelease(); return layer;}Layout* restartActionManagerAction(){ auto layer = createActionManagerLayer(sceneIdx);// layer->autorelease(); return layer;} // on "init" you need to initialize your instancebool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Vec2 origin = Director::getInstance()->getVisibleOrigin(); ///////////////////////////// // 2. add a menu item with "X" image, which is clicked to quit the program // you may modify it. // add a "close" icon to exit the progress. it's an autorelease object auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 , origin.y + closeItem->getContentSize().height/2)); // create menu, it's an autorelease object auto menu = Menu::create(closeItem, NULL); menu->setPosition(Vec2::ZERO); this->addChild(menu, 1); winSize = Director::getInstance()->getWinSize(); auto layout = Layout::create(); layout->setSize(Size(winSize.width,winSize.height/4)); layout->setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID); layout->setBackGroundColor(Color3B::WHITE); layout->ignoreAnchorPointForPosition(false); layout->setAnchorPoint(Vec2::ANCHOR_MIDDLE_TOP); layout->setPosition(Vec2(winSize.width/2,winSize.height)); addChild(layout); auto image1 = ui::ImageView::create("b2.png"); image1->setTag(FIRST); image1->setPosition(Vec2(layout->getSize().width/4,layout->getSize().height/2)); image1->addTouchEventListener(CC_CALLBACK_2(HelloWorld::touchEvent, this)); layout->addChild(image1); auto image2 = ui::ImageView::create("r2.png"); image2->setTag(SECOND); image2->setPosition(Vec2(layout->getSize().width/2,layout->getSize().height/2)); image2->addTouchEventListener(CC_CALLBACK_2(HelloWorld::touchEvent, this)); layout->addChild(image2); auto image3 = ui::ImageView::create("f2.png"); image3->setTag(THIRD); image3->addTouchEventListener(CC_CALLBACK_2(HelloWorld::touchEvent, this)); image3->setPosition(Vec2(layout->getSize().width/4*3,layout->getSize().height/2)); layout->addChild(image3); auto first = First::create(); first->setTag(10); first->setPosition(Vec2(winSize.width/2,winSize.width/4)); addChild(first); return true;}void HelloWorld::touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type){ auto tag = static_cast<ui::ImageView*>(pSender)->getTag(); log("tag=%d",tag); auto child = getChildByTag(10); if(child != nullptr) { removeChildByTag(10); } switch(tag) { case FIRST: { log("First"); auto temp = backActionManagerAction(); temp->setTag(10); temp->setPosition(Vec2(winSize.width/2,winSize.width/4)); addChild(temp); break; } case SECOND: { log("Second"); auto temp = restartActionManagerAction(); temp->setPosition(Vec2(winSize.width/2,winSize.width/4)); temp->setTag(10); addChild(temp); break; } case THIRD: { log("Third"); auto temp = nextActionManagerAction(); temp->setPosition(Vec2(winSize.width/2,winSize.width/4)); temp->setTag(10); addChild(temp); break; } default: { break; } }}void HelloWorld::menuCloseCallback(Ref* pSender){#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert"); return;#endif Director::getInstance()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0);#endif}
//First.h#include "cocos2d.h"#include "ui/CocosGUI.h"USING_NS_CC;using namespace ui;class First : public Layout{public: CREATE_FUNC(First); virtual bool init(); void touchEvent(Ref* pSender,cocos2d::ui::Widget::TouchEventType type);};
//First.cpp#include "First.h"bool First::init(){ bool bRet = false; do{ CC_BREAK_IF(!Layout::init()); auto winSize = Director::getInstance()->getWinSize(); setSize(Size(winSize.width/2,winSize.height/4)); setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID); setBackGroundColor(Color3B::GREEN); ignoreAnchorPointForPosition(false); setAnchorPoint(Vec2::ANCHOR_MIDDLE_BOTTOM); auto text = Text::create("1","",30); text->setColor(Color3B::WHITE); text->setPosition(Vec2(getSize().width/2,getSize().height/2)); addChild(text); bRet = true; }while(0); return bRet;}void First::touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type){ auto temp = static_cast<ui::ImageView*>(pSender); log("tag = %d",temp->getTag());}
//Second.h#include "cocos2d.h"#include "ui/CocosGUI.h"USING_NS_CC;using namespace ui;class Second : public Layout{public: CREATE_FUNC(Second); virtual bool init(); void touchEvent(Ref* pSender,cocos2d::ui::Widget::TouchEventType type);};
//Second.cpp#include "Second.h"bool Second::init(){ bool bRet = false; do{ CC_BREAK_IF(!Layout::init()); auto winSize = Director::getInstance()->getWinSize(); setSize(Size(winSize.width/2,winSize.height/4)); setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID); setBackGroundColor(Color3B::GREEN); ignoreAnchorPointForPosition(false); setAnchorPoint(Vec2::ANCHOR_MIDDLE_BOTTOM); auto text = Text::create("2","",30); text->setColor(Color3B::WHITE); text->setPosition(Vec2(getSize().width/2,getSize().height/2)); addChild(text); bRet = true; }while(0); return bRet;}void Second::touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type){ auto temp = static_cast<ui::ImageView*>(pSender); log("tag = %d",temp->getTag());}
//Third.h#include "cocos2d.h"#include "ui/CocosGUI.h"USING_NS_CC;using namespace ui;class Third : public Layout{public: CREATE_FUNC(Third); virtual bool init(); void touchEvent(Ref* pSender,cocos2d::ui::Widget::TouchEventType type);};
//Third.cpp#include "Third.h"bool Third::init(){ bool bRet = false; do{ CC_BREAK_IF(!Layout::init()); auto winSize = Director::getInstance()->getWinSize(); setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID); setBackGroundColor(Color3B::GREEN); setSize(Size(winSize.width/2,winSize.height/4)); ignoreAnchorPointForPosition(false); setAnchorPoint(Vec2::ANCHOR_MIDDLE_BOTTOM); auto text = Text::create("3","",30); text->setColor(Color3B::WHITE); text->setPosition(Vec2(getSize().width/2,getSize().height/2)); addChild(text); bRet = true; }while(0); return bRet;}void Third::touchEvent(cocos2d::Ref *pSender, cocos2d::ui::Widget::TouchEventType type){ auto temp = static_cast<ui::ImageView*>(pSender); log("tag = %d",temp->getTag());}
Implement layout page Switching Using testcpp imitation