cocos2dx 弹出框 网上有好多实现 但是都不是想要的
直接上代码:
头文件:
- #ifndef _POP_LAYER_H_
- #define _POP_LAYER_H_
- #include "cocos2d.h"
- #include "extensions/cocos-ext.h"
- USING_NS_CC;
- using namespace cocos2d::extension;
- class PopupLayer: public CCLayer{
- public:
- PopupLayer();
- ~PopupLayer();
- virtual bool init();
- CREATE_FUNC(PopupLayer);
- //void registerWithTouchDispatcher(void);
- //bool onTouchBegan(cocos2d::CCTouch *pTouch,cocos2d::CCEvent *pEvent);
- static PopupLayer* create(const char* backgroundImage);
- void setTitle(const char* title,int fontsize = 20);
- void setContentText(const char* text,int fontsize = 20,int padding = 50,int paddintTop = 100);
- void setCallbackFunc(Ref* target,SEL_CallFuncN callfun);
- bool addButton(const char* normalImage,const char* selectedImage,const char* title,int tag = 0);
- virtual void onEnter();
- virtual void onExit();
- void buttonCallback(Ref* pSender);
- bool onTouchBegan(Touch* touch,Event* event);
- void onTouchMoved(Touch* touch,Event* event);
- void onTouchEnded(Touch* touch,Event* event);
- private:
- // 文字内容两边的空白区
- int m_contentPadding;
- int m_contentPaddingTop;
- CCObject* m_callbackListener;
- SEL_CallFuncN m_callback;
- CC_SYNTHESIZE_RETAIN(Menu*,m__pMenu,MenuButton);
- CC_SYNTHESIZE_RETAIN(Sprite*,m__sfBackGround,SpriteBackGround);
- CC_SYNTHESIZE_RETAIN(Scale9Sprite*,m__s9BackGround,Sprite9BackGround);
- CC_SYNTHESIZE_RETAIN(CCLabelTTF*,m__ltTitle,LabelTitle);
- CC_SYNTHESIZE_RETAIN(CCLabelTTF*,m__ltContentText,LabelContentText);
- };
- #endif;
类名字 随便起的 大家就不要吐槽了………………
cpp文件:
- #include "Poplayer.h"
- PopupLayer::PopupLayer():
- m__pMenu(NULL),m_contentPadding(0),m_contentPaddingTop(0),m_callbackListener(NULL),m_callback(NULL),m__sfBackGround(NULL),m__s9BackGround(NULL),m__ltContentText(NULL),m__ltTitle(NULL)
- {
- }
- PopupLayer::~PopupLayer(){
- CC_SAFE_RELEASE(m__pMenu);
- CC_SAFE_RELEASE(m__sfBackGround);
- CC_SAFE_RELEASE(m__ltContentText);
- CC_SAFE_RELEASE(m__ltTitle);
- CC_SAFE_RELEASE(m__s9BackGround);
- }
- bool PopupLayer::init(){
- bool bRef = false;
- do{
- CC_BREAK_IF(!CCLayer::init());
- this->setContentSize(CCSizeZero);
- // 初始化需要的 Menu
- CCMenu* menu = CCMenu::create();
- menu->setPosition(CCPointZero);
- setMenuButton(menu);
- setTouchEnabled(true);
- auto listener = EventListenerTouchOneByOne::create();
- listener->setSwallowTouches(true);
- listener->onTouchBegan = CC_CALLBACK_2(PopupLayer::onTouchBegan,this);
- listener->onTouchMoved = CC_CALLBACK_2(PopupLayer::onTouchMoved,this);
- listener->onTouchEnded = CC_CALLBACK_2(PopupLayer::onTouchEnded,this);
- _eventDispatcher->addEventListenerWithSceneGraPHPriority(listener,this);
- bRef = true;
- }while(0);
- return bRef;
- }
- bool PopupLayer::onTouchBegan(Touch* pTouch,Event* event)
- {
- CCLog("PopupLayer touch");
- return true;
- }
- void PopupLayer::onTouchMoved(Touch* touch,Event* event)
- {
- log("move");
- }
- void PopupLayer::onTouchEnded(Touch* touch,Event* event)
- {
- log("ended");
- }
- PopupLayer* PopupLayer::create(const char *backgroundImage){
- PopupLayer* ml = PopupLayer::create();
- ml->setSpriteBackGround(Sprite::create(backgroundImage));
- ml->setSprite9BackGround(Scale9Sprite::create(backgroundImage));
- return ml;
- }
- void PopupLayer::setTitle(const char *title,int fontsize){
- CCLabelTTF* ltfTitle = LabelTTF::create(title,"Arial",fontsize);
- setLabelTitle(ltfTitle);
- }
- void PopupLayer::setContentText(const char *text,int fontsize,int padding,int paddingTop){
- CCLabelTTF* ltf = CCLabelTTF::create(text,fontsize);
- setLabelContentText(ltf);
- m_contentPadding = padding;
- m_contentPaddingTop = paddingTop;
- }
- void PopupLayer::setCallbackFunc(Ref* target,SEL_CallFuncN callfun){
- m_callbackListener = target;
- m_callback = callfun;
- }
- bool PopupLayer::addButton(const char *normalImage,const char *selectedImage,const char *title,int tag){
- CCSize winSize = CCDirector::sharedDirector()->getWinSize();
- CCPoint pCenter = ccp(winSize.width / 2,winSize.height / 2);
- // 创建图片菜单按钮
- CCMenuItemImage* menuImage = CCMenuItemImage::create(normalImage,selectedImage,this,menu_selector(PopupLayer::buttonCallback));
- menuImage->setTag(tag);
- menuImage->setPosition(pCenter);
- // 添加文字说明并设置位置
- CCSize imenu = menuImage->getContentSize();
- CCLabelTTF* ttf = CCLabelTTF::create(title,20);
- ttf->setColor(ccc3(0,0));
- ttf->setPosition(ccp(imenu.width / 2,imenu.height / 2));
- menuImage->addChild(ttf);
- getMenuButton()->addChild(menuImage);
- return true;
- }
- void PopupLayer::buttonCallback(Ref* pSender){
- Node* node = (Node*)pSender;
- CCLog("touch tag: %d",node->getTag());
- if (m_callback && m_callbackListener){
- (m_callbackListener->*m_callback)(node);
- }
- int tag = node->getTag();
- switch(tag)
- {
- case 0:
- {
- }
- case 1:
- {
- }
- default:
- break;
- }
- this->removeFromParent();
- }
- void PopupLayer::onEnter(){
- CCLayer::onEnter();
- CCSize winSize = CCDirector::sharedDirector()->getWinSize();
- CCPoint pCenter = ccp(winSize.width / 2,winSize.height / 2);
- CCSize contentSize;
- // 设定好参数,在运行时加载
- if (getContentSize().equals(CCSizeZero)) {
- getSpriteBackGround()->setPosition(ccp(winSize.width / 2,winSize.height / 2));
- this->addChild(getSpriteBackGround(),0);
- contentSize = getSpriteBackGround()->getTexture()->getContentSize();
- } else {
- Scale9Sprite *background = getSprite9BackGround();
- background->setContentSize(getContentSize());
- background->setPosition(ccp(winSize.width / 2,winSize.height / 2));
- this->addChild(background,0);
- contentSize = getContentSize();
- }
- // 添加按钮,并设置其位置
- this->addChild(getMenuButton());
- float btnWidth = contentSize.width / (getMenuButton()->getChildrenCount() + 1);
- auto array = getMenuButton()->getChildren();
- Ref* pObj = NULL;
- for(int i = 0;i< array.capacity();i++)
- {
- Node* node = array.at(i);
- node->setPosition(ccp( winSize.width / 2 - contentSize.width / 2 + btnWidth * (i + 1),winSize.height / 2 - contentSize.height / 3));
- }
- // 显示对话框标题
- if (getLabelTitle()){
- getLabelTitle()->setPosition(ccpAdd(pCenter,ccp(0,contentSize.height / 2 - 35.0f)));
- this->addChild(getLabelTitle());
- }
- // 显示文本内容
- if (getLabelContentText()){
- CCLabelTTF* ltf = getLabelContentText();
- ltf->setPosition(ccp(winSize.width / 2,winSize.height / 2));
- ltf->setDimensions(CCSizeMake(contentSize.width - m_contentPadding * 2,contentSize.height - m_contentPaddingTop));
- ltf->setHorizontalAlignment(kCCTextAlignmentLeft);
- this->addChild(ltf);
- }
- // 弹出效果
- CCAction* popupLayer = CCSequence::create(CCScaleTo::create(0.0,0.0),CCScaleTo::create(0.06,1.05),CCScaleTo::create(0.08,0.95),1.0),NULL);
- this->runAction(popupLayer);
- }
- void PopupLayer::onExit(){
- CCLog("popup on exit.");
- CCLayer::onExit();
- }
使用方法:
G2U是 gbk转UTF_8 要不然的话 中文会乱码
- PopupLayer* pl = PopupLayer::create("popuplayer/BackGround.png");
- // ContentSize 是可选的设置,可以不设置,如果设置把它当作 9 图缩放
- pl->setContentSize(CCSizeMake(400,350));
- pl->setTitle("test");
- pl->setContentText(G2U("你好,弹出框"),20,60,250);
- // 设置回调函数,回调传回一个 CCNode 以获取 tag 判断点击的按钮
- // 这只是作为一种封装实现,如果使用 delegate 那就能够更灵活的控制参数了
- pl->setCallbackFunc(this,callfuncN_selector(LoginScene::buttonCallback));
- // 添加按钮,设置图片,文字,tag 信息
- pl->addButton("popuplayer/pop_button.png","popuplayer/pop_button.png",G2U("确定"),0);
- pl->addButton("popuplayer/pop_button.png",G2U("取消"),1);
- // 添加到当前层
- this->addChild(pl);
函数如下:
希望大家喜欢
- char* G2U(const char* gb2312)
- {
- int len = MultiByteToWideChar(CP_ACP,gb2312,-1,NULL,0);
- wchar_t* wstr = new wchar_t[len+1];
- memset(wstr,len+1);
- MultiByteToWideChar(CP_ACP,wstr,len);
- len = WideCharToMultiByte(CP_UTF8,NULL);
- char* str = new char[len+1];
- memset(str,len+1);
- WideCharToMultiByte(CP_UTF8,str,len,NULL);
- if(wstr) delete[] wstr;
- return str;
- }