Cocos2d-x学习(六):cocos2d-x中的模态对话框简单实现
2012-05-28 11:30
435 查看
cocos2d-x中没有为我们提供模态对话框的实现,不过有一个分平台来实现的确认对话框的实现CCMessageBox,可以实现的对话框。可是定制性不强,可以当做系统级的提示,但是如果作为游戏中的对话框就显得不那么妥当了!
自定义一个模态对话框需要注意两方面:
一. 触摸事件响应的优先级别
二.易扩展
其实第一点是比较麻烦的一个方面,第二点主要是根据用法的不同而需要的优化设计。
其中nPriority属性是注册的单位所响应的优先级别,nPriority的值越小,响应的级别越高!我们熟悉的菜单,其响应级别是一个枚举值 -128,也就是cocos2d-x中定义的最高响应级别(当然我们是可以注册为 -129, -130的。。。),这里只是说cocos2d-x中的定义!
自定义一个继承于CCLayerColor的对话框层(之所以是CCLayerColor,为的是设置个半透明色作为背景,使其看起来更像模态对话框)
需要注意的是两个变量,m_pMenu是对话框上的菜单层,m_bTouchedMenu是用来记录当前的触摸事件是否是对菜单层所做的。
在其onEnter()方法中(此方法在第一次添加到显示屏时调用),注册其触摸事件响应级别为高于普通菜单响应级别
然后在ccTouchBegan()方法中判断是否为菜单层的触摸事件,用于触摸事件的分发
在其它的事件中判断当前是否为菜单触摸事件,如果是触摸事件,则交由菜单处理
最后记得在触摸事件完成后将此值置为false
简单的写了一个小例子,当点击退出按钮时,弹出模态对话框,点击OK退出程序,点击Cancel关闭对话框
效果如图
当然,根据需要可以将需求转化为自定义的对话框的样式!这只是一个简单的思路而已!!
代码下载地址
自定义一个模态对话框需要注意两方面:
一. 触摸事件响应的优先级别
二.易扩展
其实第一点是比较麻烦的一个方面,第二点主要是根据用法的不同而需要的优化设计。
1. 触摸事件响应规则
不论我们初始化一个场景(CCScene),一个层(CCLayer),还是一个精灵(CCSprite),当我们需要监听其触摸事件的时候,都要在其初始化的时候注册到引擎当中,CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(CCTouchDelegate *pDelegate, int nPriority, bool bSwallowsTouches)
其中nPriority属性是注册的单位所响应的优先级别,nPriority的值越小,响应的级别越高!我们熟悉的菜单,其响应级别是一个枚举值 -128,也就是cocos2d-x中定义的最高响应级别(当然我们是可以注册为 -129, -130的。。。),这里只是说cocos2d-x中的定义!
2. 设计模态对话框的困难
模态对话框的作用是只允许用户在当前对话框上做操作,也就是说要屏蔽对对话框下层按钮,菜单类的操作!基于这种特性,我们会遇到不知道将nPriority值注册为多少的困惑(1)注册大于-128的值,根据响应事件的规则,对话框下层中的菜单的优先级别是-128,高于对话框的触摸响应级别,则先响应,这样便无法做到屏蔽对话框下层菜单的操作。
(2)注册小于等于-128的值,根据响应事件的规则,可以屏蔽对话框下层菜单的操作,但是问题来了,对话框层的菜单操作也将失效,这是源于cocos2d-x中CCMenu的机制,即所有的CCMenu对象的优先级都是-128。
3.解决方法
基于以上的困难有两种解决方案:(1)自定义一个触摸事件响应级别高于普通菜单层的对话框层和“对话框层”,这样由高到底便可响应触摸事件
(2)自定义一个触摸事件响应级别高于普通菜单层的对话框层,当触摸事件发生时,判断触摸事件,事件分发!
第二种方法代码应该比较简单,总结一下自定义一个继承于CCLayerColor的对话框层(之所以是CCLayerColor,为的是设置个半透明色作为背景,使其看起来更像模态对话框)
class DialogLayer: public CCLayerColor { // 模态对话框菜单 CCMenu *m_pMenu; // 记录菜单点击 bool m_bTouchedMenu; public: DialogLayer(); ~DialogLayer(); virtual bool init(); // 初始化对话框内容 void initDialog(); LAYER_NODE_FUNC(DialogLayer); void onEnter(); void onExit(); virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent); void okMenuItemCallback(CCObject *pSender); void cancelMenuItemCallback(CCObject *pSender); };
需要注意的是两个变量,m_pMenu是对话框上的菜单层,m_bTouchedMenu是用来记录当前的触摸事件是否是对菜单层所做的。
在其onEnter()方法中(此方法在第一次添加到显示屏时调用),注册其触摸事件响应级别为高于普通菜单响应级别
void DialogLayer::onEnter() { CCLayerColor::onEnter(); CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, kCCMenuTouchPriority - 1, true); }
然后在ccTouchBegan()方法中判断是否为菜单层的触摸事件,用于触摸事件的分发
bool DialogLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { m_bTouchedMenu = m_pMenu->ccTouchBegan(pTouch, pEvent); return true; }
在其它的事件中判断当前是否为菜单触摸事件,如果是触摸事件,则交由菜单处理
void DialogLayer::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { if (m_bTouchedMenu) { m_pMenu->ccTouchMoved(pTouch, pEvent); } }
最后记得在触摸事件完成后将此值置为false
void DialogLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { if (m_bTouchedMenu) { m_pMenu->ccTouchEnded(pTouch, pEvent); m_bTouchedMenu = false; } } void DialogLayer::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { if (m_bTouchedMenu) { m_pMenu->ccTouchEnded(pTouch, pEvent); m_bTouchedMenu = false; } }
简单的写了一个小例子,当点击退出按钮时,弹出模态对话框,点击OK退出程序,点击Cancel关闭对话框
效果如图
当然,根据需要可以将需求转化为自定义的对话框的样式!这只是一个简单的思路而已!!
代码下载地址
相关文章推荐
- Cocos2d-x学习(六):cocos2d-x中的模态对话框简单实现
- Cocos2d-x学习(六):cocos2d-x中的模态对话框简单实现
- cocos2d-x中的模态对话框简单实现
- cocos2d-x中的模态对话框简单实现
- cocos2d-x中的模态对话框简单实现
- cocos2d-x中的模态对话框简单实现
- cocos2d-x中的模态对话框简单实现
- cocos2d-x中的模态对话框简单实现
- cocos2d-x 3.2 实现模态对话框
- Cocos2d-x学习(七):cocos2d-x中ScrollView的简单实现
- cocos2d-x 中layer如何实现模态对话框
- cocos2d基础学习--自定义对话框实现
- qt模态对话框 以及exec()事件循环简单实现
- cocos2d-x学习日志(12) --弹出对话框的设计与实现
- Cocos2d-x学习(七):cocos2d-x中ScrollView的简单实现
- [cocos2d]如何实现模态对话框
- Cocos2d-x学习(十二):用cocos2d-x实现MoonWarriors(无限背景滚动的简单实现)
- Cocos2d-x 实现模态对话框
- cocos2d-x学习日志(12) --弹出对话框的设计与实现
- Android编程学习系列:第三篇,简单的对话框功能实现