zoukankan      html  css  js  c++  java
  • Cocos2d-x 实现模态对话框

    模态对话框(其本身是一个Layer)是指只有该对话框能够响应触摸操作,而其它层不能响应此触摸操作。模态对话框一般在场景中的最上层。

     

    模态对话框会有两种触摸代理,一种是对话框该层本身,还有一种是CCMenu。cocos2d-x使用优先级来管理触摸代理,优先级数越小,响应优先级越高。对于同一个触摸,如果有优先级数字更小的代理响应了,则优先级数字更大代理不再响应此触摸。

     

    要想拦截模态对话框下的层(包括菜单)对触摸消息不响应, 我们必须将的模态对话框优先级设置小于-128 ,并且如果此触摸只要被响应了就会吞噬掉(CCTouchDispatcher::addTargetedDelegate中第三个参数设置为true),则在此对话框中的触摸不会被下一层响应到。这样就可以成功的拦截按钮的消息传到模态对话框的下层。但是这样也意味着当前模态对话框的菜单消息(-128)也被拦截了,所以我们需要手动将消息传给模态对话框上的按钮进行处理---主动调用模态对话框中CCMenu的触摸方法。

     

    设置模态对话框响应触摸(TargetedTouch)优先级数比-128小就行了。重写定向触摸响应方法,包括:

    ccTouchBegan,  ccTouchEnded,  ccTouchMoved 和  ccTouchCancelled,并在这些方法中主动调用CCMenu的相应响应方法。

     

    代码实现:

    1、注意模态对话框也是一个层,所以也是继承自CCLayer。

    当然,由于出现模态对话框的时候,都会有一个半透明灰色的背景,如果你是用图片来作为背景的话,就继承自CCLayer就ok了。但是也可以继承自CCColorLayer 这样有个好处,可以直接设置不透明度和背景颜色 ,比如半透明的灰色:

    1     setColor(ccc3(255,0,0));
    2     setOpacity(128);

    2、.h文件

     1 void onEnter();
     2     void onExit();
     3     
     4     virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
     5     virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
     6     virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
     7     virtual void ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
     8     
     9     cocos2d::CCMenu *m_pMenu; // 模态对话框菜单
    10     bool m_bTouchedMenu;// 记录菜单点击

    3、.cpp文件

     1 void PauseGameDialogLayer::onEnter()
     2 {
     3     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(
     4                                                                             this,//在那个类中实现触屏回调函数
     5                                                      kCCMenuHandlerPriority - 1, // -128-1 = -129优先级  
     6                                                                             true);//触摸时间是否被该目标截获  
     7 }
     8 
     9 void PauseGameDialogLayer::onExit()
    10 {
    11     BaseLayer::onExit();
    12     CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
    13 }
     1 bool PauseGameDialogLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
     2 {
     3     m_bTouchedMenu = m_pMenu->ccTouchBegan(pTouch, pEvent);
     4     return true;
     5 }
     6 
     7 void PauseGameDialogLayer::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
     8 {
     9     if (m_bTouchedMenu) {
    10         m_pMenu->ccTouchMoved(pTouch, pEvent);
    11     }
    12 }
    13 
    14 void PauseGameDialogLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
    15 {
    16     if (m_bTouchedMenu) {
    17         m_pMenu->ccTouchEnded(pTouch, pEvent);
    18         m_bTouchedMenu = false;
    19     }
    20 }
    21 
    22 void PauseGameDialogLayer::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
    23 {
    24     if (m_bTouchedMenu) {
    25         m_pMenu->ccTouchEnded(pTouch, pEvent);
    26         m_bTouchedMenu = false;
    27     }
    28 }

    这样就好了,可以和普通的menu菜单一样使用啦!

    原文链接:http://blog.csdn.net/crayondeng/article/details/11353955

  • 相关阅读:
    ionic准备之angular基础——dom操作相关(6)
    ionic准备之angular基础——$watch,$apply,$timeout方法(5)
    ionic准备之angular基础——run方法(4)
    ionic准备之angular基础——继承(3)
    开发ionic准备之安卓模拟器设置(2)
    创建你的第一个ionic+cordova应用(1)
    C#nameof用法
    C#中使用goto
    MySQL-解决 Table'performance_schema.session_variables' doesn't exist 问题
    dp方程
  • 原文地址:https://www.cnblogs.com/atong/p/3309836.html
Copyright © 2011-2022 走看看