cocos2dx 3.0rc自定义弹出窗口类

定义一个层的基类:包括出现动作,消失动作(消失后自毁)

#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();
	}
}



你可能感兴趣的:(cocos2dx 3.0rc自定义弹出窗口类)