cocos2d-x中用CCLayer实现对话框的简单做法,自动屏蔽下层Touch事件

11 篇文章 0 订阅
11 篇文章 0 订阅
在cocos2d-x中实现对话框是一件比较麻烦的事情,而且由于移植的需要游戏中很多时候不能用系统API实现。现在用CCLayer实现对话框,原理是改写自己写

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;


作用是在对话框如过对游戏产生了什么影响,这时需要改变其他地方的时候,通过委托产生改变。具体的委托如何实现就不多说了


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值