DialogLayer,DialogMenu和DialogTableView类,分别继承CCLayer,CCMenu和CCTabelview。写这几个类是为了在初始化的时候能够改变他们的触摸优先级。我们只需要让DialogLayer的触摸优先级高于CCMenu的中触摸优先级,并且吐掉触摸事件。这样,DialogLayer下层的CCMenu就不能接触到触摸事件了。DialogLayer上也需要按钮,或者其他控件。DialogMenu的触摸优先级比DialogLayer还要高,就可以把DialogMenu加在DialogLayer上了。这样就可以实现对话框了。
但是在游戏中可能不止一层对话框,对话框上还有可能出现一些对话框。这是要做的就是让第二层对话框的CCLayer和CCMenu的触摸优先级比第一层的还高。但是每次创建都得知道对话框得层数太麻烦,我们可以在AppDelegate里,增加一个变量
dialogHanderHanlderPriority用来记录对话框得层数,然后每次创建对话框的时候根据层数来初始化它得触摸优先级就行了。以下是代码,全部写在.h文件里的方便大家看
#include "cocos2d.h"
#include "CCTableView.h"
#include "AppDelegate.h"
USING_NS_CC;
using namespace cocos2d::extension;
class DialogLayer;
class DialogLayerDelegate{
public:
virtual void dialogLayerClosed(DialogLayer* dialogLayer) = 0;
virtual void gameDataChanged(DialogLayer* dialogLayer) = 0;
virtual ~DialogLayerDelegate(){};
};
class DialogLayer : public CCLayer{
public:
DialogLayer(){
m_delegate = NULL;
setTouchMode(kCCTouchesOneByOne);
m_handlerPriorityFactor = 1;
};
virtual ~DialogLayer(){};
virtual bool init(){m_handlerPriorityFactor = AppDelegate::sharedAppDelegate()->getHanlderPriority(); return CCLayer::init();
};
CREATE_FUNC(DialogLayer);
bool initWithFactor(unsigned int factor){m_handlerPriorityFactor = factor;return true;};
static DialogLayer* createWithFactor(unsigned int factor){
DialogLayer* pRet = new DialogLayer();
if (pRet && pRet->initWithFactor(factor)) {
pRet->autorelease();
}else{
CC_SAFE_DELETE(pRet);
}
return pRet;
};
virtual void onEnter(){
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->addTargetedDelegate(this, (m_handlerPriorityFactor*2)*kCCMenuHandlerPriority, true);
AppDelegate::sharedAppDelegate()->addHanlderPriority();
CCLayer::onEnter();
};
virtual void onExit(){
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->removeDelegate(this);
AppDelegate::sharedAppDelegate()->reduceHanlderPriority();
CCLayer::onExit();
};
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){
return true;
};
virtual void closeLayer(){
if (m_delegate) {
m_delegate->dialogLayerClosed(this);
}
this->removeFromParentAndCleanup(true);
}
void needToUpdate(){
if (m_delegate) {
m_delegate->gameDataChanged(this);
}
};
void setDelegate(DialogLayerDelegate* delegate){m_delegate = delegate;};
DialogLayerDelegate* getDelegate(){return m_delegate;};
virtual void showTheDialog(){
CCScene* scene = CCDirector::sharedDirector()->getRunningScene();
//debug
CCAssert(scene, "getRunningScene() == NULL");
if (scene) {
scene->addChild(this);
}
};
private:
unsigned int m_handlerPriorityFactor;
DialogLayerDelegate* m_delegate;
};
class DialogMenu : public CCMenu{
public:
DialogMenu(){
m_handlerPriorityFactor = 1;
};
virtual ~DialogMenu(){};
virtual bool init(){m_handlerPriorityFactor = AppDelegate::sharedAppDelegate()->getHanlderPriority();return CCMenu::init();
};
CREATE_FUNC(DialogMenu);
static DialogMenu* createWithFactor(unsigned int factor){
DialogMenu* pRet = new DialogMenu();
if (pRet && pRet->init()) {
pRet->autorelease();
pRet->m_handlerPriorityFactor = factor;
}else{
CC_SAFE_DELETE(pRet);
}
return pRet;
};
virtual void registerWithTouchDispatcher(void){
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->addTargetedDelegate(this, (4*m_handlerPriorityFactor)*kCCMenuHandlerPriority, true);
};
private:
unsigned int m_handlerPriorityFactor;
};
class DialogTableView : public CCTableView{
public:
DialogTableView(){
m_handlerPriorityFactor = 1;
};
virtual ~DialogTableView(){};
static DialogTableView* create(CCTableViewDataSource* dataSource, CCSize size, CCNode *container)
{
DialogTableView *table = new DialogTableView();
table->m_handlerPriorityFactor = AppDelegate::sharedAppDelegate()->getHanlderPriority();
table->initWithViewSize(size, container);
table->autorelease();
table->setDataSource(dataSource);
table->CCTableView::_updateContentSize();
return table;
}
static DialogTableView* createWithFactor(CCTableViewDataSource* dataSource, CCSize size, CCNode *container, unsigned int factor)
{
DialogTableView *table = new DialogTableView();
table->initWithViewSize(size, container);
table->autorelease();
table->setDataSource(dataSource);
table->CCTableView::_updateContentSize();
table->m_handlerPriorityFactor = factor;
return table;
}
virtual void registerWithTouchDispatcher(void){
CCDirector* pDirector = CCDirector::sharedDirector();
pDirector->getTouchDispatcher()->addTargetedDelegate(this, (3*m_handlerPriorityFactor)*kCCMenuHandlerPriority , true);
};
private:
unsigned int m_handlerPriorityFactor;
};
DialogLayerDelegate是一个委托,
virtual void gameDataChanged(DialogLayer* dialogLayer) = 0;