Cocos2d-x 实现模态对话框
2013-09-09 14:43
197 查看
模态对话框(其本身是一个Layer)是指只有该对话框能够响应触摸操作,而其它层不能响应此触摸操作。模态对话框一般在场景中的最上层。
模态对话框会有两种触摸代理,一种是对话框该层本身,还有一种是CCMenu。cocos2d-x使用优先级来管理触摸代理,优先级数越小,响应优先级越高。对于同一个触摸,如果有优先级数字更小的代理响应了,则优先级数字更大代理不再响应此触摸。
要想拦截模态对话框下的层(包括菜单)对触摸消息不响应, 我们必须将的模态对话框优先级设置小于-128 ,并且如果此触摸只要被响应了就会吞噬掉(CCTouchDispatcher::addTargetedDelegate中第三个参数设置为true),则在此对话框中的触摸不会被下一层响应到。这样就可以成功的拦截按钮的消息传到模态对话框的下层。但是这样也意味着当前模态对话框的菜单消息(-128)也被拦截了,所以我们需要手动将消息传给模态对话框上的按钮进行处理---主动调用模态对话框中CCMenu的触摸方法。
设置模态对话框响应触摸(TargetedTouch)优先级数比-128小就行了。重写定向触摸响应方法,包括:
ccTouchBegan, ccTouchEnded, ccTouchMoved 和 ccTouchCancelled,并在这些方法中主动调用CCMenu的相应响应方法。
代码实现:
1、注意模态对话框也是一个层,所以也是继承自CCLayer。
当然,由于出现模态对话框的时候,都会有一个半透明灰色的背景,如果你是用图片来作为背景的话,就继承自CCLayer就ok了。但是也可以继承自CCColorLayer 这样有个好处,可以直接设置不透明度和背景颜色 ,比如半透明的灰色:
2、.h文件
3、.cpp文件
这样就好了,可以和普通的menu菜单一样使用啦!
原文链接:http://blog.csdn.net/crayondeng/article/details/11353955
模态对话框会有两种触摸代理,一种是对话框该层本身,还有一种是CCMenu。cocos2d-x使用优先级来管理触摸代理,优先级数越小,响应优先级越高。对于同一个触摸,如果有优先级数字更小的代理响应了,则优先级数字更大代理不再响应此触摸。
要想拦截模态对话框下的层(包括菜单)对触摸消息不响应, 我们必须将的模态对话框优先级设置小于-128 ,并且如果此触摸只要被响应了就会吞噬掉(CCTouchDispatcher::addTargetedDelegate中第三个参数设置为true),则在此对话框中的触摸不会被下一层响应到。这样就可以成功的拦截按钮的消息传到模态对话框的下层。但是这样也意味着当前模态对话框的菜单消息(-128)也被拦截了,所以我们需要手动将消息传给模态对话框上的按钮进行处理---主动调用模态对话框中CCMenu的触摸方法。
设置模态对话框响应触摸(TargetedTouch)优先级数比-128小就行了。重写定向触摸响应方法,包括:
ccTouchBegan, ccTouchEnded, ccTouchMoved 和 ccTouchCancelled,并在这些方法中主动调用CCMenu的相应响应方法。
代码实现:
1、注意模态对话框也是一个层,所以也是继承自CCLayer。
当然,由于出现模态对话框的时候,都会有一个半透明灰色的背景,如果你是用图片来作为背景的话,就继承自CCLayer就ok了。但是也可以继承自CCColorLayer 这样有个好处,可以直接设置不透明度和背景颜色 ,比如半透明的灰色:
setColor(ccc3(255,0,0)); setOpacity(128);
2、.h文件
void onEnter(); void onExit(); virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); virtual void ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); cocos2d::CCMenu *m_pMenu; // 模态对话框菜单 bool m_bTouchedMenu;// 记录菜单点击
3、.cpp文件
void PauseGameDialogLayer::onEnter() { CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate( this,//在那个类中实现触屏回调函数 kCCMenuHandlerPriority - 1, // -128-1 = -129优先级 true);//触摸时间是否被该目标截获 } void PauseGameDialogLayer::onExit() { BaseLayer::onExit(); CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this); }
bool PauseGameDialogLayer::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { m_bTouchedMenu = m_pMenu->ccTouchBegan(pTouch, pEvent); return true; } void PauseGameDialogLayer::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { if (m_bTouchedMenu) { m_pMenu->ccTouchMoved(pTouch, pEvent); } } void PauseGameDialogLayer::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { if (m_bTouchedMenu) { m_pMenu->ccTouchEnded(pTouch, pEvent); m_bTouchedMenu = false; } } void PauseGameDialogLayer::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { if (m_bTouchedMenu) { m_pMenu->ccTouchEnded(pTouch, pEvent); m_bTouchedMenu = false; } }
这样就好了,可以和普通的menu菜单一样使用啦!
原文链接:http://blog.csdn.net/crayondeng/article/details/11353955
相关文章推荐
- cocos2d-x中模态对话框的一种实现方式
- cocos2d-x 模态对话框的实现
- cocos2d-x 模态对话框的实现
- Cocos2d-js3.3 模态对话框的实现
- Cocos2d-JS 3.3 模态对话框的实现
- cocos2d-x 模态对话框的实现
- cocos2d-x 模态对话框的实现
- 【cocos2d-x IOS游戏开发-捕鱼达人18】积分板实现
- Cocos2D-iphone 开发之(8) 实现进度条
- Cocos2d-x 3.x中的多线程基本实现思路
- Cocos2D-X学习12:交互功能——多点触控的实现
- 【玩转cocos2d-x之十四】菜单选项卡的实现
- Cocos2d-x教程第(8)讲-遮罩层实现捕鱼达人滚动数字表盘
- cocos2d-x实现背景无限循环
- iphone 备忘录2--利用UIImageView实现动画特效------------cocos2d-x3.0正式版本(7.12)
- Cocos2d-x Studio (一) ----- 随机数实现(产生 start 到 end 的随机数)
- cocos2d-x 游戏技能CD实现
- Cocos2d-x 用lambda表达式实现监听,改变精灵的透明度和层级
- Cocos2d-x能够实现的效果总结
- cocos2d-x 使用 CCScale9Sprite 实现微信对话框