定义一个层的基类:包括出现动作,消失动作(消失后自毁)
#pragma once #include "cocos2d.h" USING_NS_CC; class BaseLayer:public cocos2d::Layer { public: BaseLayer(void); virtual ~BaseLayer(void); void appear(); void disappear(); void close(); }; #include "BaseLayer.h" BaseLayer::BaseLayer(void) { } BaseLayer::~BaseLayer(void) { } void BaseLayer::appear() { //层弹出动画 auto visibleSize = Director::getInstance()->getVisibleSize(); auto origin = Director::getInstance()->getVisibleOrigin(); this->setPosition( Point(origin.x+visibleSize.width/2, origin.y-visibleSize.height/2)); auto moveTo = MoveTo::create(0.5, Point(origin.x+visibleSize.width/2, origin.y+visibleSize.height/2)); auto easeBounceOut = EaseBackOut::create(moveTo); this->runAction(easeBounceOut); } void BaseLayer::disappear() { //消失动画,消失后移除自身 auto visibleSize = Director::getInstance()->getVisibleSize(); auto origin = Director::getInstance()->getVisibleOrigin(); auto moveTo = MoveTo::create(0.5, Point(origin.x+visibleSize.width/2, origin.y-visibleSize.height/2)); auto easeBounceIn = EaseBackIn::create(moveTo); Sequence* seq = Sequence::create(easeBounceIn, RemoveSelf::create(true),NULL); this->runAction(seq); } void BaseLayer::close() { disappear(); }
定义几个层
#pragma once #include "cocos2d.h" #include "BaseLayer.h" USING_NS_CC; class CreateALayer:public BaseLayer { public: CreateALayer(void); ~CreateALayer(void); static CreateALayer* create(); bool init(); bool onTouchBegan(Touch* touch, Event* event); void onTouchMoved(Touch* touch, Event* event); void onTouchEnded(Touch* touch, Event* event); Sprite* sp; }; #include "CreateALayer.h" CreateALayer::CreateALayer(void) { } CreateALayer::~CreateALayer(void) { } CreateALayer* CreateALayer::create() { CreateALayer* pRet = new CreateALayer; if (pRet && pRet->init()) { pRet->autorelease(); return pRet; } else { delete pRet; pRet = NULL; return NULL; } } bool CreateALayer::init() { Layer::init(); sp = Sprite::create("btn-a-1.png"); sp->setScale(5); this->addChild(sp); auto listener = EventListenerTouchOneByOne::create(); listener->setSwallowTouches(true); listener->onTouchBegan = CC_CALLBACK_2(CreateALayer::onTouchBegan, this); listener->onTouchMoved = CC_CALLBACK_2(CreateALayer::onTouchMoved, this); listener->onTouchEnded = CC_CALLBACK_2(CreateALayer::onTouchEnded, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); appear(); return true; } bool CreateALayer::onTouchBegan( Touch* touch, Event* event ) { log("began"); sp->setOpacity(100); return true; } void CreateALayer::onTouchMoved( Touch* touch, Event* event ) { log("move"); } void CreateALayer::onTouchEnded( Touch* touch, Event* event ) { sp->setOpacity(255); log("ended"); }
#define LINE_SPACE 10//label文字间隔 typedef struct _Controller{ int index;//序号 const char *name;//名字,可有可无 int tag;//标签 std::function<BaseLayer*()> callback;//创建层的函数 } Controller; Controller g_aTestNames[] = { {0, "CreateALayer", 10001 , []() { return CreateALayer::create(); } }, {1, "CreateBLayer", 10002 , []() { return CreateBLayer::create(); } } }; //数量 static int g_testCount = sizeof(g_aTestNames) / sizeof(g_aTestNames[0]); Scene* HelloWorld::scene() { // 'scene' is an autorelease object auto scene = Scene::create(); // 'layer' is an autorelease object HelloWorld *layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; } // on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if ( !Layer::init() ) { return false; } auto visibleSize = Director::getInstance()->getVisibleSize(); auto origin = Director::getInstance()->getVisibleOrigin(); CreateLayersMenu = Menu::create(); for (int i = 0; i < g_testCount; ++i) { // #if (CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE) // auto label = LabelBMFont::create(g_aTestNames[i].c_str(), "fonts/arial16.fnt"); // #else auto label = LabelTTF::create( g_aTestNames[i].name, "Arial", 10); // #endif auto menuItem = MenuItemLabel::create(label, CC_CALLBACK_1(HelloWorld::createLayersMenuCallback, this)); CreateLayersMenu->addChild(menuItem ); menuItem->setTag(i+1000);//为了避免冲突,这里加1000 menuItem->setPosition( Point(50, (Director::getInstance()->getWinSize().height - (i + 1) * LINE_SPACE) )); } //_itemMenu->setContentSize(Size(VisibleRect::getVisibleRect().size.width, (g_testCount + 1) * (LINE_SPACE))); CreateLayersMenu->setPosition(Point(0,0)); CreateLayersMenu->setZOrder(10000); addChild(CreateLayersMenu); return true; } void HelloWorld::createLayersMenuCallback(Ref * sender) { Director::getInstance()->purgeCachedData(); // get the userdata, it's the index of the menu item clicked auto menuItem = static_cast<MenuItem *>(sender); //将其他设为白色 for (int i = 0; i < g_testCount; ++i) { MenuItemLabel* menuChild = static_cast<MenuItemLabel*>(CreateLayersMenu->getChildByTag(i+1000)); menuChild->setColor(Color3B(255,255,255)); } //点击到的颜色设为红色 menuItem->setColor(Color3B(255,100,100)); int idx = menuItem->getTag() - 1000; BaseLayer* ly = (BaseLayer*)this->getChildByTag(g_aTestNames[idx].tag); if ( ly == NULL) { //idx对应的callback ly = g_aTestNames[idx].callback(); ly->setTag(g_aTestNames[idx].tag); this->addChild(ly); return; } else { ly->close(); } }