回忆暑假,弹框的问题一直萦绕在我身边,我决心今夜来重新复习这个问题。回忆起当初共同探讨的时期还是十分怀念的。 废话不多说。弹出框,顾名思义就是弹出一个窗口(一个Sprite纹理图片);并且对下面的层触摸事件等没有影响。 我就用暂停来实现这些功能。
首先面对弹出框,我们需要理解什么是触摸级别。触摸级别是cocos2dx触发触摸事件的优先级,级别越低,触摸的优先级越高,所以有菜单的触摸级别是-128,这已经是相当优先了。 好了 接下来我们试着去实现这些功能。
.h文件
#ifndef __PAUSEGAME__
#define __PAUSEGAME__
#include "cocos2d.h"
#include "cocos-ext.h"
US_NS_CC;
using namespace cocos2d:extension;
class pushWindow : public CCLayer
{
public:
static CCScene* scene();
virtual bool init();
CREATE_FUNC(pushWindow);
virtual bool ccTouchBagan(CCTouch* pTouch,CCEvent* pevent);
void continueGame(CCObject* obj);
void exitGame(CCObject* obj);
void push_Window(CCObject* psender,CCControlEvent event);
private:
CCMenuItemImage* continue_Button;
CCMenuItemImage* exit_Button;
CCMenu* menu;
};
#endif
.cpp文件
#include "pausegame.h"
CCScene* pushWndow::scene()
{
CCScene* scene=CCScene::create();
pushWindow* layer=pushWindow::create();
scene->addChild(layer);
return scene;
}
virtual bool pushWindow::init()
{
if(!CCLayer::init())
{
return false;
}
CCSize visibleSize=CCDirector::sharedDirector()->getVisibleSize();
CCSprite* bg_Sprite=CCSprite::create("bg_Sprite.png");
bg_Sprite->setPosition(ccp(visibleSize.width/2,visibleSize,height/2));
this->addChild(bg_Sprite);
CCScale9Sprite* pause_ButtonH=CCScale9Sprite::create("pause_ButtonH.png");
CCScale9Sprite* pause_Button=CCScale9Sprite::create("pause_Button.png");
CCControlButton* pauseBtn=CCControlButton::create(pause_ButtonH);
pauseBtn->setBackgroundSpriteForState(pause_Button,CCControlStateSelected)
pauseBtn->setPreferredSize(CCSizeMake(100,100));
pauseBtn->setPosition(ccp(visibleSize.width*0.9,visibleSize.height*0.9));
this->addChild(pauseBtn);
pauseBtn->addTargetWithActionForControlEvents(this,cccontrol_selector(pushWindow::push_Window),CCControlEventTouchInside);
}
void pushWindow::push_Window(CCObject* psender, CCControlEvent event)
{
CCDirector::sharedDirector()->pause();
CCSize size=CCDirector::sharedDirector()->getVisibleSize();
CCLayerColor* layerColor=CCLayerColor::create(ccc4(0,0,0,100));
layerColor->setTag(1);
this->addChild(layerColor);
CCSprite* pause_Window=CCSprite::create("pause_Window");
pause_Window->setPosition(ccp(size.width/2,size.heignt/2));
this->addChild(pause_Window);
continue_Button=CCMenuItemImage::create("continue_Sprite.png","continue_Sprite.png",this,menu_selector());
continue_Button->setPosition(ccp(0,-size.height*0.13));
exit_Button=CCMenuItemImage::create("exit_Sprite.png","exit_Sprite.png",this,menu_selector());
exit_Button->setPosition(ccp(0,size.height*0.13));
menu=CCMenu::create(continue_Button,exit_Button,NULL);
menu->setPositon(ccp(pause_Window->getContentSize().width/2,pause_Window->getContentSize().height/2));
menu->setTouchPriority(kCCMenuHandlerPrioritv*2-1,true);
pause->addChild(menu);
pause_Window-<setTag(2);
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,kCCMenuHandlerPrioritv*2,true);
}
void pushWindow:: continueGame(CCObject* obj )
{
CCDirector::sharedDirector()->resume();
CCLayerColor* layer_Color=dynamic_cast<CCLayerColor*>(this->getChildByTag(1));
layer_Color->removeFromParentAndClean(true);
CCSprite* layer_Sprite=dynamic_cast<CCSprite*>(this-<getChildByTag(2));
layer_Sprite->removeFromParentAndClean(true);
}
void pushWindow:: exitGame(CCObject* obj)
{
CCDirector::sharedDirector()->end();
}
bool pushWindow::ccTouchBegan(CCTouch* ptouch,CCEvent* pevent)
{
return true;
}