cocos2d-x中没有为我们提供模态对话框的实现,不过有一个分平台来实现的确认对话框的实现CCMessageBox,可以实现的对话框。可是定制性不强,可以当做系统级的提示,但是如果作为游戏中的对话框就显得不那么妥当了!
自定义一个模态对话框需要注意两方面:
一. 触摸事件响应的优先级别
二.易扩展
其实第一点是比较麻烦的一个方面,第二点主要是根据用法的不同而需要的优化设计。
不论我们初始化一个场景(CCScene),一个层(CCLayer),还是一个精灵(CCSprite),当我们需要监听其触摸事件的时候,都要在其初始化的时候注册到引擎当中,
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(CCTouchDelegate *pDelegate, int nPriority, bool bSwallowsTouches)
模态对话框的作用是只允许用户在当前对话框上做操作,也就是说要屏蔽对对话框下层按钮,菜单类的操作!基于这种特性,我们会遇到不知道将nPriority值注册为多少的困惑
基于以上的困难有两种解决方案:
第二种方法代码应该比较简单,总结一下
自定义一个继承于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);
};
在其onEnter()方法中(此方法在第一次添加到显示屏时调用),注册其触摸事件响应级别为高于普通菜单响应级别
void DialogLayer::onEnter()
{
CCLayerColor::onEnter();
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, kCCMenuTouchPriority - 1, true);
}
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);
}
}
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关闭对话框
效果如图
当然,根据需要可以将需求转化为自定义的对话框的样式!这只是一个简单的思路而已!!
代码下载地址