cocos2d-x中模态对话框的一种实现方式

来源:互联网 发布:零点咨询待遇 知乎 编辑:程序博客网 时间:2024/06/01 09:15

http://blog.csdn.net/wayne5ning/article/details/8713262

问题

典型的对话框包括按钮、表格等可以响应触摸的元素。对话框一般在场景中的最上层。模态对话框是指只有该对话框能够响应触摸操作,而其它层不能响应此操作。

分析

对话框会有两种触摸代理,一种是对话框本身,还有一种是CCMenu。cocos2d-x使用优先级来管理触摸代理,对于同一个触摸,如果有优先级数字更小的代理响应了,则优先级数字更大代理不再响应此触摸。例如,CCMenu的优先级数默认为-128。当模态对话框本身的优先级数比-128小,并且如果此触摸只要被响应了就会会吞噬掉(CCTouchDispatcher::addTargetedDelegate中第三个参数设置为true),则在此对话框中的触摸不会被下一层响应到。

然后,还有个问题是,模态对话框中的按钮也被屏蔽了。因此,解决方式之一是主动调用CCMenu的触摸方法。

解决方式

此模态对话框响应定向触摸(TargetedTouch),优先级数比-128小就行了。重写定向触摸响应方法,包括ModalDialog::ccTouchBegan, ModalDialog::ccTouchEnded, ModalDialog::ccTouchMoved 和 ModalDialog::ccTouchCancelled,并在这些方法中主动调用CCMenu的相应响应方法。需要注意的是,CCMenu在响应ccTouchEnded,ccTouchMoved 和 ccTouchCancelled时需要CCMenu::ccTouchBegan返回真,否则会出现断言错误(见CCMenu中的断言CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchEnded] -- invalid state");)。因此,如果CCMenu::ccTouchBegan返回为false,则不再响应ModalDialog::ccTouchEnded, ModalDialog::ccTouchMoved 和 ModalDialog::ccTouchCancelled。大致代码如下:

[cpp] view plaincopyprint?
  1. class ModalDialog : public CCLayer  
  2. {  
  3. public:  
  4.     CREATE_FUNC(ModalDialog);  
  5. protected:  
  6.     virtual bool init()  
  7.     {  
  8.         setTouchEnabled(true);  
  9.   
  10.         // 初始化m_pMenu;  
  11.   
  12.         return true;  
  13.     }  
  14.     virtual void registerWithTouchDispatcher()  
  15.     {  
  16.         // priority比-128小就可以了  
  17.         CCDirector::sharedDirector()->getTouchDispatcher()  
  18.             ->addTargetedDelegate(this, -150, true);  
  19.     }  
  20.     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)  
  21.     {  
  22.         m_bMenuSelected = false;  
  23.         if (NULL != m_pMenu)  
  24.         {  
  25.              m_bMenuSelected = m_pMenu->ccTouchBegan(pTouch, pEvent);  
  26.         }  
  27.         return true;  
  28.     }  
  29.     virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)  
  30.     {  
  31.         if (NULL != m_pMenu && m_bMenuSelected)  
  32.         {  
  33.             m_pMenu->ccTouchMoved(pTouch, pEvent);  
  34.         }  
  35.     }  
  36.     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)  
  37.     {  
  38.         if (NULL != m_pMenu && m_bMenuSelected)  
  39.         {  
  40.             m_pMenu->ccTouchEnded(pTouch, pEvent);  
  41.         }  
  42.     }  
  43.     virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)  
  44.     {  
  45.         if (NULL != m_pMenu && m_bMenuSelected)  
  46.         {  
  47.             m_pMenu->ccTouchCancelled(pTouch, pEvent);  
  48.         }  
  49.     }  
  50.   
  51. private:  
  52.     ModalDialog():m_pMenu(NULL){};  
  53.     ~ModalDialog(){};  
  54.     CCMenu* m_pMenu;  
  55.     // 记录按钮是否被选中  
  56.     bool m_bMenuSelected;  
  57. };  

实际使用时,为了扩展性,可以将Menu从外面添加到对话框中。
注:cocos2d-x版本为cocos2d-2.1beta3-x-2.1.1

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 vivoy66手机太卡怎么办 虚拟机装xp蓝屏怎么办 exagear玩起来卡怎么办 第五人格模拟器玩太卡怎么办 速腾油箱盖打不开怎么办 奥迪a6油箱盖打不开怎么办 苹果手提虚拟机黑屏怎么办 mac系统桌面变大怎么办 删除文件要权限怎么办 页面载入错误了怎么办 手机打不开excel表格怎么办 皇室战争闪退怎么办 苹果老是闪退怎么办 黑苹果开机黑屏怎么办 MAC磁盘删了怎么办 mac磁盘被锁定怎么办 bt5读不到网卡怎么办 笔记本电脑cpu温度过高怎么办 笔记本cpu温度过高怎么办 联想系统崩溃了怎么办 办公软件用不了怎么办 win10设置闪退怎么办 手机浏览器版本低怎么办 wps界面动不了怎么办 手机设置删了怎么办 苹果手机设置不见了怎么办 笔记本电脑键盘不好使怎么办 网咖怎么办临时卡 cydia添加雷锋源失败怎么办 电脑mac已锁定怎么办 苹果home键发热怎么办 苹果软件消失了怎么办 苹果键盘消失了怎么办 苹果图标消失了怎么办 超账户授权有误怎么办 华为账号码被盗怎么办 华为无法截屏怎么办 华为账号密码忘怎么办 华为忘记激活码怎么办 云充吧登录不上怎么办 充电器插头太松怎么办